2016-07-19 8 views
1

MS Accessデータベースに機能を追加しようとしていますが、コードのどの部分がクラッシュする可能性があるのか​​非常に混乱しています。私のマシンでは、コードは決してクラッシュしません。しかし、他のマシン(ランタイム以外のコピーのアクセスを含む)では、小さな変更はアプリケーションの完全なクラッシュを引き起こします。以下のコードは、エクスポートされたクエリをExcelでフォーマットします。VBAがクラッシュするときにアクセシビリティセルにアクセスする

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 

私が見つけたことから、グラフィックスエラーのようなものがあるようです。しかし、私はColorIndex = 23とColorIndex = 10を完全に正常にする原因となるものは完全に失われていますが、試した他のインデックスはクラッシュします。また、ランタイムバージョンの起動時の参照をチェックしていますが、完全に正常であると思われます。私は明白な何かを見落としていますか?誰かが私を潜在的な解決策に向けることができたら本当に感謝します。

編集:私のrefcheckがMS Officeのバージョンに関係なく、どのマシンでもフルパスを表示するので、問題を引き起こすExcelオブジェクト参照のように見えます。とにかく私の実験では、devのコピーで選択されているリファレンスと同じバージョンのOfficeを実行している限り、コードは正常に動作すると判断しました。

Edit2:何とか私はVBA.CreateObject関数について覚えていませんでした。これを使用してExcelライブラリへの参照を含めるのではなく、Excelオブジェクトを作成すると、異なるオフィスバージョンから生じるすべての問題を修正するようです。

+0

BEXは、DEP支店EXecptionエラーです。多くの場合、バッファオーバーフローが原因です。例外c0000417はSTATUS_INVALID_CRUNTIME_PARAMETERです。色の口蓋が壊れている可能性がありますか?色をリセットしてみてください。 – david

+0

@HansUpスタートアップ時に参照チェックを実行していて、すべての参照がそこにあります。しかし、私のマシン上のExcelリファレンスはExcel 12.0 Object Libraryであり、他の場所(クラッシュした場所)ではExcel 14.0 Object Libraryです。おそらく私の問題はこれに由来していますか?新しいバージョンのExcelをインストールしなくても、このリファレンスの新しいバージョンを含める方法はありますか? – biatchstan

+0

おっと、質問の最後の段落で参照がうまくいったとあなたは気付かなかった。申し訳ありません。 – HansUp

答えて

0

私は、Excel VisibleプロパティがFalseに設定されている場合、Excel.Applicationオブジェクトを介して細胞の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 
+0

@ハンズアップ私は非常に理解していただきたいと思っています。なぜなら、なぜ私が間違っているか正しいことを理解しているかを証明するでしょう...;) – marlan

+0

ああ、これはうまくいきました!提案に感謝しますが、残念ながらまだクラッシュしています。(私はクラッシュを起こし続ける他のdevマシンで作業できるようになりましたので、コードを一行ずつコメントアウトしてこのバグを見つけます。 – biatchstan

+0

私の観察'If​​(ws.Cells(i、LAST_COL))'で実行がクラッシュした場合、 'obj_excel.Application.ActiveWorkSheet.Cells(i、LAST_COL))'で置き換えてみてください。わかりませんが、私の経験だけでは説明できません。 – marlan

関連する問題