VBA崩溃访问时着色Excel单元格

我一直在为MS Access数据库添加一个function,但是我对于我的代码的哪一部分可能导致崩溃感到困惑。 在我的机器上,代码从不崩溃。 但是,在其他机器上(包括访问的非运行时副本),一个小小的更改会导致应用程序完全崩溃。 以下代码在Excel中格式化导出的查询:

Option Compare Database Public Function format_status_report(ByVal filename As String, ByVal path As String) Dim obj_excel As Excel.Application Dim wb As Excel.Workbook Dim ws As Excel.Worksheet Dim rng As Range Dim tbl As ListObject Const LAST_COL = 10 last_col_char = Chr(LAST_COL + 64) Set obj_excel = New Excel.Application On Error GoTo ErrorHandler obj_excel.Visible = False obj_excel.DisplayAlerts = False obj_excel.Workbooks.Open (path & filename) obj_excel.ScreenUpdating = False Set wb = obj_excel.Workbooks(filename) Set ws = wb.Sheets(1) num_rows = count_rows(ws) For i = 2 To num_rows If (ws.Cells(i, LAST_COL)) Then ws.Range("A" & Trim(Str(i)) & ":" & last_col_char & Trim(Str(i))).Interior.ColorIndex = 23 Else ws.Range("A" & Trim(Str(i)) & ":" & last_col_char & Trim(Str(i))).Interior.ColorIndex = 10 End If Next ws.Range("A1:" & last_col_char & Trim(Str(1))).Interior.ColorIndex = 16 For i = 1 To LAST_COL ws.Cells(1, i) = Replace(ws.Cells(1, i), "_", " ") Next Set rng = ws.Range(ws.Range("A1"), ws.Range("A1").SpecialCells(xlLastCell)) Set tbl = ws.ListObjects.Add(xlSrcRange, rng, , xlYes) tbl.TableStyle = "TableStyleMedium16" ws.Columns(last_col_char).Hidden = True ws.Columns("I").ColumnWidth = 60 ws.Rows("1:" & Trim(Str(num_rows))).AutoFit For Each Row In ws.Rows("1:" & Trim(Str(num_rows))) If Row.RowHeight < 30 Then Row.RowHeight = 30 End If Next obj_excel.ScreenUpdating = True obj_excel.Visible = True wb.Save obj_excel.WindowState = xlMaximized Exit Function ErrorHandler: err_msg wb.Close obj_excel.Quit End Function Private Function count_rows(ByRef ws As Worksheet) As Integer c = ws.Cells(1, 1) i = 0 Do Until (Len(c) < 8) i = i + 1 c = ws.Cells(i + 1, 1) Loop count_rows = i End Function Private Sub err_msg() MsgBox "Error occured? " & Err.Number & ": " & Err.Description End Sub 

碰撞行为相当古怪。 如果颜色值在以下循环中更改

 For i = 2 To num_rows If (ws.Cells(i, LAST_COL)) Then ws.Range("A" & Trim(Str(i)) & ":" & last_col_char & Trim(Str(i))).Interior.ColorIndex = 23 Else ws.Range("A" & Trim(Str(i)) & ":" & last_col_char & Trim(Str(i))).Interior.ColorIndex = 10 End If Next 

访问将在达到断点之前崩溃(除了我的机器上,它以某种方式完美运行)。 窗口的错误信息:

 Problem signature: Problem Event Name: BEX Application Name: MSACCESS.EXE Application Version: 14.0.7162.5001 Application Timestamp: 5626f514 Fault Module Name: MSVCR90.dll Fault Module Version: 9.0.30729.6161 Fault Module Timestamp: 4dace5b9 Exception Offset: 000320f0 Exception Code: c0000417 Exception Data: 00000000 OS Version: 6.1.7601.2.1.0.256.48 Locale ID: 1033 Additional Information 1: 2f13 Additional Information 2: 2f1305af727fc04ce417c25a567e9372 Additional Information 3: a621 Additional Information 4: a62129d4ea5fc426ef3a2d423daed40d 

从我能find的,似乎有些graphics错误。 然而,我完全失去了什么可能导致ColorIndex = 23和ColorIndex = 10是完全正常的,而我试过的任何其他指数导致崩溃。 我也检查了运行时版本的启动参考,他们似乎是完全正确的。 我可以忽略明显的东西吗? 我真的很感激,如果有人能够至less指出我一个潜在的解决scheme。

编辑:所以它真的看起来像是Excel对象引用导致的问题,这是奇怪的,因为我的refcheck显示任何机器上的完整path,无论MS Office的版本。 无论如何,从我的实验来看,只要运行与开发副本中选定的引用相同版本的Office(这很糟糕,因为这里有许多不同的Office版本),我就确定代码运行良好。

编辑2:不知何故,我不记得关于VBA.CreateObject函数。 使用这个来创buildexcel对象,而不是包含对excel库的引用,似乎解决了源于不同office版本的所有问题。

我发现(没有太多的理解),当Excel Visible属性设置为False ,通过Excel.Application对象引用Cell的Interior属性更为安全。
在你的情况下:

 For i = 2 To num_rows ws.Range("A" & Trim(Str(i)) & ":" & last_col_char & Trim(Str(i))).Select If (ws.Cells(i, LAST_COL)) Then obj_excel.Application.Selection.Interior.ColorIndex = 23 Else obj_excel.Application.Selection.Interior.ColorIndex = 10 End If Next