プログラミングツールがなければ、Excel VBA

株式会社テイクーワンT.Мです。

プログラミングツールがないパソコン

ここからの話は、フィクションですが実際にあった事例を元にしています。
守秘義務契約を結んでいるお客様のデータセンターに訪問しました。
パソコンを持参できず、紙の手帳を持って行きました。
お客様は月に800社くらいの支払データを検収したいのですが、3~4件のSQLエラーが発生するとのことでした。
エラーを特定してほしいとのことですが、パソコンを持参していません。
実行したSQL文が保存されているLogファイルがありました。
プログラムを作成して、Logファイルを調査する必要があります。
Logファイルは、下図のようなファイルです。
残念ながら、貸していただいたパソコンにはプログラミングツールはありませんでした。
Excelがインストールされていたので、VBAのプログラムを記述することにしました。

Excel VBAを始めよう

Excelの標準では、[開発]メニューが非表示になっています。

[ファイル]→[オプション]で表示される[Excelのオプション]画面の左側の一覧から[リボンのユーザー設定]を選択します。
右側の[メイン タブ]の一覧から[開発]にチェックを入れます。

VBAを記述しよう

VBAのプログラムを記述するために「VBE」(Visual Basic Editor)を起動するため、[開発]→[Visual Basic]を選択します。

それでもプログラムを記述するためのエディタは表示されません。
ThisWorkbook、Sheetにソースを記述できますが、今回は「標準モジュール」に記述したいと思います。
左側のプロジェクトエクスプローラーのプログラムを記述したいワークブックを右クリックして、[挿入]→[標準モジュール]を選択します。

拡張子がxlsxのワークブックを上書き保存しようとすると、下記のメッセージが表示されます。

マクロありのブックとして保存したいので、「いいえ」を押下します。
[ファイルの種類]のリストボックスから「Excel マクロ有効ブック(*.xlsm)」を選択して、名前を付けて保存します。

ソースは下記です。

Sub 読み込み()

Dim iFree, nRow As Integer
Dim xFullPath As String
Dim xSql As String

Const CNST_Title As String = "読み込み"

'' 読み込むファイル名の指定
xFullPath = InputBox("読み込むファイルを入力してください。", CNST_Title)

'' キャンセルなら終了
If xFullPath = "" Then
Exit Sub
End If
'' 引用符を取り除く
If Left(xFullPath, 1) = """" Then
xFullPath = Mid(xFullPath, 2)
End If
If Left(StrReverse(xFullPath), 1) = """" Then
xFullPath = StrReverse(Mid(StrReverse(xFullPath), 2))
End If

'' 読み込むファイルを開く
iFree = FreeFile
Open xFullPath For Input As #iFree

'' 書き出し行の初期化
nRow = 0

Do Until EOF(iFree)
Line Input #iFree, xSql
If Not Trim(xSql) = "" Then
If InStr(xSql, "UPDATE") > 0 And InStr(xSql, "BIKO") Then
'' 書き出し行のインクリメント
nRow = nRow + 1
'' 書き出す
Range("A" & CStr(nRow)).Value = Left(xSql, Len("yyyy-MM-dd HH:mm:ss"))
Range("B" & CStr(nRow)).Value = Mid(xSql, Len("yyyy-MM-dd HH:mm:ss") + 1)
End If
End If
Loop

'' 読み込みファイルを閉じる
Close #iFree

'' 処理完了メッセージ
MsgBox "処理が終了しました。", vbOKOnly + vbInformation, CNST_Title

End Sub
作成されたプログラムを実行します。[表示]→[マクロ]→[マクロの表示]を選択します。
マクロ選択画面から実行したいマクロを選択し[実行]を押下します。

Logファイルの全ての行でなくソースの条件文で絞られた行が、アクティブワークシートに反映されました。

ソースについて

11行目のInputBoxで読み込むファイルの入力を促します。
今回はファイルの存在チェック・エラートラップをしていないので、存在するファイル名を入力する必要があります。
17行目の「引用符を取り除く」は、エクスプローラーでファイルをシフトを押しながら右クリックして、[パスのコピー]を選択して、ファイルのフルパスを取得すると、引用符付きでコピーされてしまうためです。
27行目でファイルを開きます。
32~47行目で1行ずつ読み進めていきます。
39, 40行では、Logファイルのタイムスタンプと本文に分けてアクティブシートのセルに書き込んでいます。
46行目でファイルを閉じます。
49行目でユーザーに処理の終了を通知しています。

最後に

実際は、Logファイルは入力ユーザー×数日分あり、100ファイルを超えていました。
Excel VBAプログラミングで調査対象を絞ることができました。

前へ

CSVファイルを使ってデータを連携(作成)する時に注意したいこと