Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为Excel单元格着色时访问崩溃_Excel_Ms Access_Vba - Fatal编程技术网

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

为Excel单元格着色时访问崩溃,excel,ms-access,vba,Excel,Ms Access,Vba,我正在向MS Access数据库添加一项功能。在我的机器上,代码从不崩溃。在其他机器上(包括Access的非运行时副本),一个小的更改会导致崩溃。该代码在Excel中设置导出查询的格式: Option Compare Database Public Function format_status_report(ByVal filename As String, ByVal path As String) Dim obj_excel As Excel.Application Dim

我正在向MS Access数据库添加一项功能。在我的机器上,代码从不崩溃。在其他机器上(包括Access的非运行时副本),一个小的更改会导致崩溃。该代码在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
在到达断点之前,Access将崩溃(在我的计算机上运行除外)。Windows错误消息:

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
这似乎是某种图形错误。然而,我不知道是什么导致ColorIndex=23和ColorIndex=10变好,而我尝试过的任何其他索引都会导致崩溃。我已经在运行时版本上检查了启动时的引用,它们看起来很好

编辑:似乎是Excel对象引用导致了问题,这很奇怪,因为无论MS Office的版本如何,我的refcheck都会在任何计算机上显示指向它的完整路径。通过实验,我确定只要代码运行的Office版本与开发人员副本中选择的引用版本相同,代码就可以运行

Edit2:我记不起VBA.CreateObject函数。使用它来创建Excel对象而不是包含对Excel库的引用似乎可以解决来自不同office版本的所有问题。

我发现(不太了解)当Excel
Visible
属性设置为
False
时,通过
Excel.Application
对象引用单元格的
内部
属性更安全。
就你而言:

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 
我发现(不太了解)当Excel
Visible
属性设置为
False
时,通过
Excel.Application
对象引用单元格的
内部
属性更安全。
就你而言:

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 


BEX是DEP分支执行错误。通常由缓冲区溢出引起。异常c0000417是状态参数无效。颜色可能是腐败的?尝试重置颜色。@HansUp我在启动时运行了一个引用检查,所有引用都在那里。但是,我注意到,我的计算机上的excel引用是excel 12.0对象库,而另一个(当它崩溃时)是excel 14.0对象库。也许我的问题就源于此?有没有一种方法可以在不安装新版excel的情况下包含更新版本的引用?哎呀,我没注意到你在问题的最后一段已经说过引用是可以的。对不起,别担心。你知道图书馆版本的差异是否会成为一个问题吗?我的直觉是,图书馆版本的差异可能是一个问题,正如我在Access中开发时,由于引用Excel,我的Office版本低于办公室中的其他人。一旦用户打开Access,应用程序将查找Excel版本或更低版本。但是,如果它引用Excel 14.0,并且用户安装了Excel 12.0,则Access将不知道在哪里查找。BEX是DEP Branch执行选项错误。通常由缓冲区溢出引起。异常c0000417是状态参数无效。颜色可能是腐败的?尝试重置颜色。@HansUp我在启动时运行了一个引用检查,所有引用都在那里。但是,我注意到,我的计算机上的excel引用是excel 12.0对象库,而另一个(当它崩溃时)是excel 14.0对象库。也许我的问题就源于此?有没有一种方法可以在不安装新版excel的情况下包含更新版本的引用?哎呀,我没注意到你在问题的最后一段已经说过引用是可以的。对不起,别担心。你知道图书馆版本的差异是否会成为一个问题吗?我的直觉是,图书馆版本的差异可能是一个问题,正如我在Access中开发时,由于引用Excel,我的Office版本低于办公室中的其他人。一旦用户打开Access,应用程序将查找Excel版本或更低版本。但是,如果它指的是Excel 14.0,并且用户安装了Excel 12.0,那么Access将不知道在哪里查找。@HansUp我非常希望您能解释和/或证明我理解的是对是错……;)啊,我真希望这能奏效!谢谢你的建议,但不幸的是,它仍然不断崩溃:(.我现在可以在另一台不断崩溃的开发机器上工作,所以我将逐行取消注释我的代码,并发现这个该死的错误。我的观察可能也适用于
Cells
集合。如果执行在
If(ws.Cells)处崩溃(i,最后一列)
尝试用
obj\u excel.Application.ActiveWorkSheet.Cells(i,最后一列)替换它
.Againn无法完全解释,仅凭我的经验…@marlan不幸的是,代码将在不到达任何断点的情况下使应用程序崩溃。看起来问题似乎与excel引用有关。@HansUp我非常希望您能解释和/或证明我理解错或对的原因…;)啊,我真希望这能奏效!谢谢你的建议,但不幸的是,它仍然不断崩溃:(.我现在可以在另一台不断崩溃的开发机器上工作,所以我将逐行取消注释我的代码,并发现这个该死的错误。我的观察可能也适用于
Cells
集合。如果执行在
If(ws.Cells)处崩溃(i,LAST_COL))
尝试将其替换为
obj_excel.Application.ActiveWorkSheet.Cells(i,LAST_COL))
。Againn无法完全解释,只是我的经验…@marlan不幸的是,代码会在没有到达任何断点的情况下崩溃应用程序。看起来问题与excel引用有关。