VBA研究会で論じられた内容を記録する議事録の3本目です。前回の議事録はコチラになります。
前回は作業ログについて考えてみました。ツールを使って作業をした内容を記録できるようにしておくと、後々いろいろなことに役立ちます。
ところで実際の作業ログは記録する期間で複数のファイルに分けることが多いです。いつまでも同じファイルに記録していると、ファイルがどんどん大きくなります。記録期間も記録頻度によって変わっていきます。また、記録するアイテム数もまちまちですね。これらの要素を柔軟に変更できるようにしておくと、使い勝手が良くなりそうです。
設定できる項目
まず保存するフォルダーを指定できるようにしましょう。自分自身と同じフォルダーではログファイルでいっぱいになってしまいます。 次にファイル名ですが、記録期間によって以下の3つから選択できるようにしましょう。
デフォルトでは月単位としましょう。
最初にファイルを作成する場合には、先頭にフィールド名を指定しなければいけません。プロシージャの引数で指定するようにします。また、前回と同じように先頭のフィールドは記録日時を追加して、にカンマ区切りの文字列形式にしましょう。
追記していくデータもカンマ区切りの文字列形式です。
実際のコード
それでは実際のコードです。以下はシートモジュールに記述します。実行するとセルのC2~C4の値を、Excelファイルの置き場所にあるフォルダー「LogFolder」下に「YYYYMM.csv」形式のファイルで追記します。フィールド名は、「データ1,データ2,データ3」としています。実際には先頭に「記録日時」が付与されます。
Public Sub VBA_003() Dim fieldName As String fieldName = "データ1,データ2,データ3" Dim recordData As String recordData = Me.Range("C2").Value & "," & _ Me.Range("C3").Value & "," & _ Me.Range("C4").Value Call DataRecord(fieldName, recordData, ThisWorkbook.Path & "\LogFolder\") MsgBox "記録しました" End Sub
続いて上のプロシージャで呼び出される側です。ファイル名の指定、フィールド名への「記録日時」付与の後にファイル書込み処理に移動します。
'作業記録を指定されたフォルダーにCSVファイルの形で記録します。 Public Sub DataRecord(ByVal fieldName As String, recordData As String, folderName As String, Optional ByVal fileName As String = "M") 'ファイル名を取得します。 Select Case StrConv(fileName, vbNarrow + vbUpperCase) Case "Y" 'ファイル指定がYの場合、ファイル名は西暦4桁 fileName = Format$(Now, "YYYY") Case "M" 'ファイル指定がM(または無指定)の場合、ファイル名は西暦4桁+月2桁 fileName = Format$(Now, "YYYYMM") Case "D" 'ファイル指定がDの場合、ファイル名は西暦4桁+月2桁+日2桁 fileName = Format$(Now, "YYYYMMDD") End Select 'データの先頭に記録日時を挿入します。 fieldName = "記録日時," & fieldName recordData = Format$(Now, "YYYY/MM/DD hh:mm:ss") & "," & recordData '作業記録を書き込みます。 Call MakeCSV(fieldName, recordData, folderName & "\" & fileName & ".CSV") End Sub
最後に実際にCSVファイルを作成、書込みを実施します。指定したファイル名でOpenステートメントを実行すると、ファイルがない場合に新規作成してしまいます。新規作成時には先頭にフィールド名を記述しなければならないので、事前にファイルの有無を調べて新規作成かどうかを判定するようにしています。
'CSVファイルを作成します。既にファイルがある場合にはデータを追記します。 Public Sub MakeCSV(fieldName As String, recordData As String, fileName As String) '記録するファイルを開きます。 Dim fileExist As Boolean fileExist = Not (Dir$(fileName) = "") Dim fileNumber As Long fileNumber = FreeFile Open fileName For Append As fileNumber 'ファイル先頭にはフィールド名を記入します。 If Not fileExist Then Print #fileNumber, fieldName 'データを記録します。 Print #fileNumber, recordData '終了 Close fileNumber End Sub
今回は以下にサンプルもご用意しました。 drive.google.com
次回はフォルダーのサイズ
いかがでしょうか。今回ご紹介したコードをベースに色々アレンジしてみてください。 次回はフォルダーのサイズです。Windows上では個別フォルダーのサイズ確認はできますが、一覧は取得できません。VBAで一括表示できるようにしてみましょう。お楽しみに!