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オブジェクトを作成すると、異なるオフィスバージョンから生じるすべての問題を修正するようです。
BEXは、DEP支店EXecptionエラーです。多くの場合、バッファオーバーフローが原因です。例外c0000417はSTATUS_INVALID_CRUNTIME_PARAMETERです。色の口蓋が壊れている可能性がありますか?色をリセットしてみてください。 – david
@HansUpスタートアップ時に参照チェックを実行していて、すべての参照がそこにあります。しかし、私のマシン上のExcelリファレンスはExcel 12.0 Object Libraryであり、他の場所(クラッシュした場所)ではExcel 14.0 Object Libraryです。おそらく私の問題はこれに由来していますか?新しいバージョンのExcelをインストールしなくても、このリファレンスの新しいバージョンを含める方法はありますか? – biatchstan
おっと、質問の最後の段落で参照がうまくいったとあなたは気付かなかった。申し訳ありません。 – HansUp