みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
請求書の作成マクロを題材にエクセルVBAでテーブルを操作する方法をお伝えしています。
前回の記事はコチラ。
テーブルに行を追加してデータを入力する方法をお伝えしました。
さて、テーブルの操作方法はだいぶ出揃ったので、今回からそれらをいかして、実際に請求書マクロを作成していきます。
まずは、エクセルVBAでテーブルを走査して取引先ごとのブックを作るところまでを作っていきます。
では、行ってみましょう!
請求書マクロの仕組み
まず、目指す請求書作成マクロの仕組みについて解説をしていきます。
「請求データ.xlsm」というエクセルブックに2つのシートが含まれています。
一つは以下の「データ」シートで、そのオブジェクト名は「wsData」としています。
このシートには以下2つのテーブルが作られています。
- 「請求データ」テーブル:請求すべきデータを一覧しているテーブル
- 「取引先マスタ」テーブル:取引のある取引先リスト
なお、2つのテーブルは上記のテーブル名に変更済みです。
もう一つのシートが以下「ひな形」シートで、オブジェクト名は「wsTemplate」です。
こちらのシートは、取引先ごとに作成する請求書のひな形になるシートです。
テーブルは「ひな形データ」というテーブル名で、データ行は含まれていないものです。
請求書マクロの流れ
請求書マクロの流れは、以下のような流れになります。
- 「取引先マスタ」テーブルの取引先の数だけ繰り返す
- 「ひな形」シートをコピーしてブックを作成
- 「請求データ」テーブルの行を走査する
- その行の取引先が、該当の取引先であれば
- 作成したブックの「ひな形データ」に行を追加
- 追加した行に「請求データ」の該当データを転記する
- その行の取引先が、該当の取引先であれば
- 請求金額、請求先の社名や住所などの情報を入力する
- ファイル名を決めて保存する
この流れでマクロを作成していきます。
テーブルを走査して取引先ごとにブックを作る
まずは大枠の分のマクロを作成してみました。
コチラです。
Sub 請求書作成()
Dim tbData As ListObject: Set tbData = wsData.ListObjects("請求データ")
Dim tbClient As ListObject: Set tbClient = wsData.ListObjects("取引先マスタ")
Dim rowClient As ListRow
For Each rowClient In tbClient.ListRows
Dim client As String: client = rowClient.Range(1).Value
wsTemplate.Copy
With ActiveSheet
.Name = client
Dim tbTemplate As ListObject: Set tbTemplate = .ListObjects("ひな形データ")
'2. 「請求データ」テーブルの行を走査して転記処理などをする
'3. 請求金額、請求先の社名や住所などの情報を入力する
End With
'4. ファイル名を決めて保存する
Next rowClient
End Sub
解説をしていきます。
ListObjectオブジェクトとしてテーブルを取得する
3,4行目は、各テーブルをListObjectオブジェクトとして取得する箇所です。
「請求データ」テーブルはtbDataとして、「取引先マスタ」テーブルはtbClientとして取り扱うことができるようになります。
WorksheetオブジェクトのListObjectsコレクションの取得についてはコチラ
ListObjectsコレクションからテーブル名でテーブルを取得する方法はコチラですね。
For Each文でテーブルの全ての行について繰り返す
7~15行目はFor Each文で「取引先マスタ」テーブルの全てのデータ行について繰り返す処理です。
どちらの取引先から処理をすべきか…といった順番は関係がないので、For Each文を使っちゃってます。
繰り返しのたびに、各データ行がrowClientという変数に格納されて、それをループ内で活用することができます。
データ行を表すオブジェクトはListRowオブジェクトです。
ListRowオブジェクトとそのループについては、以下の記事をご覧ください。
ListRowオブジェクトの特定の列のセルの値を取得する
8行目は、現在対象となっているデータ行の特定の列のセルの値を取得しています。
Rangeオブジェクトですが、インデックスが1なので、そのテーブルの
- 現在の対象となっている行=rowClientの
- 1列目=つまり「取引先名」のセル
のセルを表すRangeオブジェクトです。
Valueプロパティでその値を取得しているので、該当行の取引先名が取得できます。
このあたりは以下記事で紹介しています。
シートのコピーを新規ブックに作成する
そして、9行目は、ひな形シートを新規ブックにコピーする命令です。
WorksheetオブジェクトのCopyメソッドは、引数を与えない場合は、その対象は新規ブックになります。
また、11行目では、そのコピーしたシートのシート名を取引先名に変更をしています。
エクセルVBAは、作成されたブックやシートが直後にActiveになりますから、その特性を利用しています。
実行結果
では、上記プロシージャの実行結果をみてみましょう。
以下のように、取引先の分だけブックが作成されましたね。
まとめ
以上、エクセルVBAでテーブルを走査して取引先ごとのブックを作成するマクロを紹介しました。
今回は大枠の処理を作りましたが、次回はその中身の作成を進めていきます。
どうぞお楽しみに!
連載目次:エクセルVBAでテーブルを活用した請求書マクロを作る
エクセルのとっても便利な機能「テーブル」。VBAで操作するときも、テーブルならではの便利さを味わうことができます。請求書マクロを題材にVBAによるテーブルの操作方法をお伝えしていきます。- エクセルVBAでテーブル操作~そのメリットと変換方法&ListObjectの取得
- エクセルVBAでテーブル名を使用してテーブルを取得する方法
- エクセルVBAでテーブルの見出し行・データ行・集計行の範囲の取得をする方法
- エクセルVBAでテーブルのデータ行についてループ処理を行う方法
- エクセルVBAでテーブルのデータ行を追加して値を入力をする方法
- エクセルVBAでテーブルを走査して取引先ごとのブックを作るマクロ
- エクセルVBAでテーブル上の請求データを新規ブックに転記するマクロの作り方
- エクセルVBAで請求書作成マクロをテーブルを活用して作る
- エクセルVBAでテーブルと列挙体を組み合わせると最強のコードが書ける理由