【EXCEL VBA | ノート】エラーの場所を発見しやすくするぞ!

スポンサーリンク

エラーの場所を発見しやすくするぞ!

別に、Seleniumだけってことじゃないんですが、特にSeleniumみたいなものだと、結構長く動かしたりしてDebug.Printのイミディエイトウィンドウだけでは、どこでエラーが発生してて、どこが上手く行ってるのか確認しにくい場合って無いですか?

※イミディエイトウィンドウは、古い情報は消えちゃいます。

特に、Seleniumみたいな自動操作だと、プログラム合ってるのにエラーが起こったり、エラーになるときとエラーにならない時があったり。ちゃんと出来てないけど、先に進んでたりとか。

もうどうなってんの!?

ってなったりしますよね(^o^)

今回は、そんなときのために、実行経緯を記録するログを書き出すために使えるプログラムを紹介させて頂きます!

サクッとやるために、最も簡単だと思われるテキストファイルで書き出すようにしていますよ(^o^)

では早速コードです!

'ログを書き出す
Sub log_Output(str As String, filename As String)

  ’ 実行ファイルのPATHの取得
    Dim path As String: path = ThisWorkbook.path
    
    'logフォルダの有無を確認、なければ作成する(log)というフォルダにファイルを格納します。
    Dim SaveDir As String
    SaveDir = path & "/log"
    If Dir(SaveDir, vbDirectory) = "" Then
        MkDir SaveDir
    End If
    
    'ファイルを開く。(なければ新規作成)
    Open path & "/log" & "/" & filename & "_" & "log.txt" For Append As #1
    
    '開いたファイルに書き込む
    Print #1, Format(Now, "yyyy/dd/mm hh:mm:ss ") & str
     
    '開いたファイルを閉じる
    Close #1
 
    ' 一応イミディエイトウィンドウにも表示
    Debug.Print str
    
End Sub

実行ファイルのPATHの取得】

Dim path As String: path = ThisWorkbook.path

プログラムを実行しているEXCELファイルのPATHを取得します。

後で、logファイルを格納するフォルダや、logファイルの保存のために使います。

logフォルダの有無を確認、なければ作成する(log)というフォルダにファイルを格納します。

Dim SaveDir As String
SaveDir = path & "/log"
If Dir(SaveDir, vbDirectory) = "" Then
    MkDir SaveDir
End If

ログはログ用のフォルダに格納したいですよね。

Dir関数で、フォルダの有無を調べて、ある場合は何もせず、無い場合は、MkDirでフォルダを作成しています。

※ここでは、EXCELファイルが置かれている場所と同じ場所にlogフォルダを配置しています。

ファイルを開く。(なければ新規作成)

Open path & "/log" & "/" & filename & "_" & "log.txt" For Append As #1

指定したファイルがなければ勝手に新規で作ってくれます。

Appendが追記の部分です。

構文は

Open ファイル名 For 目的 As #番号

って感じです。ファイル名のところはフルパスで指定してくださいね(^o^)

ちなみにAppendのところは次のような選択肢があります。

  • Input:読み込むために開く場合
  • Output:書き込むために開く場合
  • Append:追記する場合に開く場合

【開いたファイルに書き込む】

Print #1, Format(Now, "yyyy/dd/mm hh:mm:ss ") & str

ここで書き込み

構文は、

Print #番号, 変数

変数のところが、実際にテキストファイルに書き込まれます。

ここでは、今の日付・時間と内容(str)を書き出すようにしています。

【開いたファイルを閉じる】

Close #1

開いたものは閉じて下さいw

構文は、

Close #番号

構文ってほどでも無いですね。

一応イミディエイトウィンドウにも表示

Debug.Print str

一応ね、イミディエイトウィンドウでもみたいじゃん?

使い方

Sub main()

Dim filename As String: filename = "ログファイル"

    ~ 何らかの処理① ~
  log_Output("何らかの処理①完了", filename)


  ~ 何らかの処理② ~
    log_Output("何らかの処理②完了", filename)

    Dim i As Long
  For i = 1 To 10

    ~ 何らかの処理② ~
       log_Output(i & "番目の処理完了", filename)

    Next

End Sub

のように、第1引数にログに残したい情報を記録していきます!

ポイントとなる処理や、特にループのところの処理結果(何番目か)を記録していくと、後で見返したときにどこまで処理ができてるのか分りやすくなりますよ(^o^)

まとめ

ひらちん的、エラーの発見方法を紹介しました!コード書くときはちょっと手間ですが、エラーになったときの場所の発見が超楽ちんになりますよ!

僕は、このプログラムをモジュールにして、新しいプロジェクト作るときにはいつも入れてるよ(^o^)