『たった1秒で仕事が片づくExcel自動化の教科書』(技術評論社)にて、
紙面の都合で書けなかった詳細をこちらで解説します。
■プロシージャの解説
Sub データ追加作業() Application.ScreenUpdating = False -① Dim i As Long -② Dim bookname As String -③ bookname = Dir(ThisWorkbook.Path & "\操作対象ブックフォルダ\") -④ Workbooks.Open ThisWorkbook.Path & "\操作対象ブックフォルダ\" & bookname -⑤ With ActiveSheet -⑥ .Range("F1") = "年" -⑦ .Range("G1") = "支社名" -⑧ .Range("H1") = "判定" -⑨ For i = 2 To .Cells(Rows.Count, 1).End(xlUp).Row -⑩ .Cells(i, 6) = Left(.Cells(i, 4), 4) -⑪ .Cells(i, 7) = WorksheetFunction.VLookup( _ -⑫ .Cells(i, 2), ThisWorkbook.Sheets("マスタ").Range("A:B"), 2, 0) If .Cells(i, 5) >= 500000 Then -⑬ .Cells(i, 8) = "A" Else .Cells(i, 8) = "B" End If Next End With ActiveWorkbook.Close savechanges:=True -⑭ Name ThisWorkbook.Path & "\操作対象ブックフォルダ\" & bookname _ -⑮ As ThisWorkbook.Path & "\処理済ブックフォルダ\" & bookname MsgBox "完了しました" -⑯ End Sub |
上から順番に解読していきましょう、
①画面更新を停止してスピードアップする定番コードですね。
②整数型の変数iを宣言しています。For Next構文のカウンターとして、そして処理するセルの行数指定にも使われます。
③文字列型の変数booknameを宣言しています。開くブック名指定に使うための変数です。
④Dir関数を使って「操作対象ブックフォルダ」の中に入れたブックの名前を変数booknameに入れます。この変数booknameをWorkbooksこのようなフォルダ構成とファイル名取得の工夫をすることで、開くブックの具体的な名前をいちいち指定しなくてよくなるわけです。
【日本語訳】変数booknameに、Dir関数の括弧内で指定したファイル…つまり「このワークブックのフォルダ(Pathをフォルダと訳してます)の中の、"操作対象ブックフォルダ"の中にあるファイルの名前を入れる。
⑤その変数booknameを使って"操作対象ブックフォルダ"の中にあるファイルを開きます。
⑥With構文によるシートの一括指定でActiveSheet、つまり「201604061121.xls」の「data」シートを指定しています。End Withまでの間においてピリオドがついているセルはすべて、アクティブシートつまりこの「data」シートのセルだということになります。⑤で開いたブックつまりつまり「201604061121.xls」がまずアクティブになっています。さらにそのブックはシートが一枚だけ入っており、そのシートのセルにデータを入力していく…という処理なので、このようにWith構文でActiveSheetを一括指定したという考え方です。
⑦(アクティブシートつまり「data」シートの)F1セルに「年」と入力する
⑧(アクティブシートつまり「data」シートの)G1セルに「支社名」と入力する
⑨(アクティブシートつまり「data」シートの)H1セルに「判定」と入力する
⑩「data」シートの2行目から最終行までを連続処理するFor Next構文
⑪F列のセルに、A列のセルの値の左から4文字分を入力する
⑫G列のセルに、Vlookup関数を使って支社名を入力する。Vlookup関数第二引数で「実行ブック.xls」の「マスタ」シートを参照する際、この処理の実行時点でアクティブになっているのは「実行ブック.xls」ではなく「201604061121.xls」であるため、エラー回避のためThisWorkbook.Sheets("マスタ").Range("A:B")という指定をしています。
⑬E列の数値が50万以上ならA、そうでないならBを8列目に入力するIf Then構文。
⑭アクティブブックつまり「201604061121.xls」を保存して閉じる処理。Closeメソッドの引数savechangesはTrueかFalseで保存して閉じるか保存しないで閉じるかを指定するものですが、Ver2013以降はいずれの場合でもこれを書かないと、保存するかどうかの確認アラートが出るので必ず書くようにしてください。
⑮Nameステートメントは、ブックの名前を変更するものですが保存場所を変更することでブックを移動することもできます。
Name 元のブック名 As 変更後のブック名
このブック名は当然保存場所も含めた文字列を指定するわけです。その保存場所を示す文字列をこのNameステートメントで変更することでブックを移動できるということです。
この処理では、"操作対象ブックフォルダ"の中から"処理済ブックフォルダ"の中にブックを移動しています。
『たった1秒で仕事が片づく Excel自動化の教科書』執筆陣が自ら直接指導。
実務直結・一日集中・受講後無期限サポート付きのマクロVBAセミナー