2

Excel ワークブックはコマンド ラインによって呼び出され、コマンド ライン自体は c# (3.5) から起動されます。ワークブックは実行されますが、VBA にエラーがあります。たとえば、ピボットに列がなく、Excel が「デバッグ」オプションを含むエラー メッセージをユーザーに表示します。

C# のプロセスから、エラー ウィンドウが開いていることを検出できます。エラー メッセージのスクリーンショットを撮り、エラー ボックスを閉じます。

これが対話型セッションの場合、Excel は VBA エディターをデバッグ モードで表示し、エラーが発生した行を強調表示します。

ただし、これは無人ターミナル セッションで実行されているため、VBA エディターのスクリーンショットを撮ることができません (スクリーンショットは黒い画面です)。

次に、Windows PID を使用して Excel プログラムを閉じることができます。

問題は、VBA エディターのスクリーンショットを取得する方法、またはデバッグ モードで Excel と (COM または相互運用機能を使用して) バインドし、dom をトラバースしてエラー行と、場合によってはエラー メッセージを見つける方法です。

4

3 に答える 3

1

(1)Excelブックのオーサリング制御がある場合は、行番号とエラーハンドラーを挿入して、ファイルErr.Number、Err.Description、Err.Source、Erlに書き込むことができます。

(2)(1)がオプションではないが、ホストでマクロセキュリティを設定してVisual Basicプロジェクトのプログラムによる制御を許可できる場合は、アクティブな行番号を取得できます。

Dim xl As excel.Application
Dim StartLine As Long, StartColumn As Long, EndLine As Long, EndColumn As Long
Set xl = GetObject(, "Excel.Application")
xl.VBE.ActiveCodePane.GetSelection StartLine, StartColumn, EndLine, EndColumn
Debug.Print StartLine, StartColumn, EndLine, EndColumn

(3)(1)も(2)もオプションでない場合、少し厄介ですが、ウィンドウのビットマップコンテンツをコピーできます:http://msdn.microsoft.com/en-us/library/ windows / desktop / dd183402%28v = vs.85%29.aspx

于 2012-10-18T21:14:31.967 に答える
1

VBA コードを変更できる場合の最も簡単な解決策は、On Error GoTo と行ラベルを使用することです。これにより、デバッグ メッセージのポップアップが停止し、実行時エラーが発生すると、指定されたラベルに実行がジャンプし、その時点でグローバル Err オブジェクトで利用可能な情報にアクセスできます。VBA には try/catch ブロックの概念がないため、これはほぼ最も近いものです。

Sub Main()
    On Error GoTo Catch

    ' Code that may trigger errors here...

   GoTo Finally
Catch:
    ' Log Err info, etc...
    Debug.Print "Error " & Err.Number & " - " & Err.Description
Finally:
    ' This is always reached last (error or no error)
End Sub
于 2012-10-21T16:03:38.793 に答える
1

データ構造のスナップショット、VBA エクセル

コードの状態を別の txt ファイル (この例では、FileSystemObject を使用) に書き込むことを提案した上記の質問によく似ているように思えます。 、成功したループの番号、変数に含まれる値、まあ-あなたが望むものは何でも...)。
エラー ハンドラーと組み合わせて (前に提案したように)、コードが停止した場所 + コード / エラーの説明を確認できます。

あなたのためにコピーアンドペースト:

dim sFile               As string
Dim FSO                 As FileSystemObject
Dim FSOFile             As TextStream
sFile = "U:/Log.txt"   

Set FSO = New FileSystemObject
Set FSOFile = FSO.OpenTextFile(sFile, 2, True)
FSOFile.writeline (<Descriptions+Property/variable value>)
FSOFile.Close set FSO = nothing  

それはより多くの作業であることに同意しますが、バグを見つける場所がわかります。
すべては、説明する必要があるコードの長さと組み合わせて、これがどれだけ困難で頻繁に必要かによって異なります。私はあなたの状況を認識していないので、それについて判断することはできません。

結局のところ、大変な作業のように見えますが、実際には、既に存在するコードを記述するだけなので、非常に簡単です。
それが役に立てば幸い。

于 2012-10-23T14:22:03.433 に答える