excel-vba
デバッグとトラブルシューティング
サーチ…
構文
- Debug.Print(string)
- 停止()/停止
Debug.Print
イミディエイトウィンドウにエラーコードの説明の一覧を印刷するには、 Debug.Print
関数にDebug.Print
ます。
Private Sub ListErrCodes()
Debug.Print "List Error Code Descriptions"
For i = 0 To 65535
e = Error(i)
If e <> "Application-defined or object-defined error" Then Debug.Print i & ": " & e
Next i
End Sub
イミディエイトウィンドウを表示するには、次の操作を行います。
- Vの IEWを選択| 私は、メニューバーからウィンドウを mmediate
- キーボードショートカットCtrl-Gを使用する
やめる
停止コマンドは、呼び出されたときに実行を一時停止します。そこからプロセスを再開したり、ステップごとに実行することができます。
Sub Test()
Dim TestVar as String
TestVar = "Hello World"
Stop 'Sub will be executed to this point and then wait for the user
MsgBox TestVar
End Sub
イミディエイトウィンドウ
サブコード全体を実行することなくマクロコードの行をテストする場合は、直接実行ウィンドウにコマンドを直接入力し、 ENTER
を押して行を実行することができENTER
。
行の出力をテストする場合は、その前に疑問符を付けることができ?
イミディエイトウィンドウに直接印刷します。または、 print
コマンドを使用して出力を印刷することもできます。
Visual Basic Editorで、イミディエイトウィンドウを開くために、 CTRL + G
押しながらCTRL + G
押します。現在選択されているシートの名前を "ExampleSheet"に変更するには、イミディエイトウィンドウで次のように入力し、 ENTER
押しENTER
ActiveSheet.Name = "ExampleSheet"
イミディエイトウィンドウで現在選択されているシートの名前を直接印刷するには
? ActiveSheet.Name
ExampleSheet
このメソッドは、組み込み関数またはユーザー定義関数の機能をコードに実装する前にテストするのに非常に便利です。以下の例は、イミディエイトウィンドウを使用して、関数または一連の関数の出力をテストして、期待どおりの結果を確認する方法を示しています。
'In this example, the Immediate Window was used to confirm that a series of Left and Right
'string methods would return the desired string
'expected output: "value"
print Left(Right("1111value1111",9),5) ' <---- written code here, ENTER pressed
value ' <---- output
イミディエイトウィンドウは、アプリケーション、ブック、またはその他の必要なプロパティを設定またはリセットするためにも使用できます。これは、 Application.EnableEvents = False
をサブルーチン内で予期せずにスローし、値をTrue
リセットせずに終了させる場合に役立ちます(これは、イライラして予期しない機能を引き起こす可能性があります。イミディエイトウィンドウに移動して実行します。
? Application.EnableEvents ' <---- Testing the current state of "EnableEvents"
False ' <---- Output
Application.EnableEvents = True ' <---- Resetting the property value to True
? Application.EnableEvents ' <---- Testing the current state of "EnableEvents"
True ' <---- Output
より高度なデバッグ手法では、コロン:
を行区切り文字として使用できます。これは、以下の例ではループなどの複数行の式に使用できます。
x = Split("a,b,c",","): For i = LBound(x,1) to UBound(x,1): Debug.Print x(i): Next i '<----Input this and press enter
a '<----Output
b '<----Output
c '<----Output
タイマーを使用してパフォーマンスのボトルネックを見つける
速度を最適化するための第一歩は、コードの最も遅い部分を見つけることです。 Timer
VBA関数は、WindowsベースのPCで1/256秒(3.90625ミリ秒)の精度で真夜中から経過した秒数を返します。 VBAのNow
とTime
機能は1秒間で正確です。
Dim start As Double ' Timer returns Single, but converting to Double to avoid
start = Timer ' scientific notation like 3.90625E-03 in the Immediate window
' ... part of the code
Debug.Print Timer - start; "seconds in part 1"
start = Timer
' ... another part of the code
Debug.Print Timer - start; "seconds in part 2"
コードにブレークポイントを追加する
実行を停止するVBAコードの行の左側にある灰色の列をクリックすることで、コードにブレークポイントを簡単に追加できます。赤い点が列に表示され、ブレークポイントコードも赤でハイライト表示されます。
コード全体に複数のブレークポイントを追加し、メニューバーの "再生"アイコンを押すことで実行を再開できます。すべてのコードが変数定義行としてブレークポイントになることはできません。プロシージャの最初または最後の行とコメント行をブレークポイントとして選択することはできません。
デバッガローカルウィンドウ
[Locals]ウィンドウでは、実行中の関数またはサブルーチンのスコープ内にある変数とオブジェクトの現在の値に簡単にアクセスできます。問題を見つけるためにコードをデバッグし、変更を進めるためには不可欠なツールです。また、存在しなかったかもしれないプロパティを探索することもできます。
次の例を考えてみましょう。
Option Explicit
Sub LocalsWindowExample()
Dim findMeInLocals As Integer
Dim findMEInLocals2 As Range
findMeInLocals = 1
Set findMEInLocals2 = ActiveWorkbook.Sheets(1).Range("A1")
End Sub
VBAエディタで、[表示] - > [ローカルウィンドウ]をクリックします。
次に、サブルーチンの中をクリックした後でF8を使用してコードをステップ実行することによって、findMeinLocalsを割り当てる前に停止しました。値が0であることがわかります。これは決して値を割り当てなかった場合に使用されます。範囲オブジェクトは 'Nothing'です。
サブルーチンが終了する直前に終了すれば、変数の最終値を見ることができます。
findMeInLocalsの値は1、型はInteger型、FindMeInLocals2型はRange / Range型です。 +記号をクリックすると、オブジェクトが展開され、カウントや列などのプロパティが表示されます。