みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
初心者向けのエクセルVBAのシリーズとして、請求書を作成するマクロの作り方をお伝えしています。
前回の記事はこちらです。
ブックを別名で保存する方法と閉じる方法についてお伝えしました。
さて、しばらく続いてきたこのシリーズも、いよいよ今回で完成となります。
これまでお伝えしてきたテクニックを元に、取引先ごとに別のブックで請求書を作成するマクロを完成させていきます。
なお、以下のYouTube動画で各ステートメントの解説も加えていますので、合わせてご活用くださいませ。
では、行ってみましょう!
請求書作成マクロの要件
ではまず、今回作成するマクロの全体像について説明をします。
実際のファイルは以下からダウンロードください。
※請求データ.xlsxにはマクロが含まれておりません。
※ファイル名がアルファベットになっていますので、それぞれ「請求データ.xlsm」「請求書ひな形.xlsx」にリネームしてお使いください。
マクロを記述する請求データ.xlsm
二つの関連するブックがありまして、一つはマクロを実際に記述する「請求データ.xlsm」です。
シートの構成としては、まず請求するデータをリストしている、「請求データ」シート
(wsData)があります。
このシートから、該当の年月のデータについて、取引先ごとの請求書に抽出して転記をしていきます。
次に、「取引先マスタ」シート(wsClient)です。
ここにリストされている取引先の分だけ、請求書のブックを作成します。
請求書ひな形.xlsx
次に、請求書のひな形になる「請求書ひな形.xlsx」です。
こちらにはマクロを仕込まずに、前述の「請求データ.xlsm」のマクロから取引先ごとに開き、処理をし、別名で保存することで、 個別のブックを作成しています。
請求書を作成するプログラム
これらを使って、取引先別の請求書を作成するマクロを作りました。
プログラムはこちらです。
Sub 請求書作成()
Dim rowsData As Long, rowsClient As Long
rowsData = wsData.Cells(Rows.Count, 1).End(xlUp).Row '請求データの最終行数
rowsClient = wsClient.Cells(Rows.Count, 1).End(xlUp).Row '取引先マスタの最終行数
'年月を入力ダイアログで入力
Dim dayCutoff As Date
dayCutoff = Application.InputBox("年月を入力してください", "対象年月を入力", Format(Date, "yyyy/mm"))
Dim n As Long
For n = 2 To rowsClient
Dim client As String
client = wsClient.Cells(n, 1).Value
'ひな形ブックを開きそのシートとともにセットする
Dim wb As Workbook, ws As Worksheet
Set wb = Workbooks.Open(ThisWorkbook.Path & "\請求書ひな形.xlsx")
Set ws = wb.Worksheets(1)
'該当の取引先かつ年月のデータを転記する
Dim i As Long, k As Long
k = 21
For i = 2 To rowsData
If wsData.Cells(i, 2).Value = client Then
Dim deliDate As Date
deliDate = wsData.Cells(i, 1).Value
If Year(deliDate) = Year(dayCutoff) And Month(deliDate) = Month(dayCutoff) Then
wsData.Range(wsData.Cells(i, 3), wsData.Cells(i, 5)).Copy ws.Cells(k, 1)
k = k + 1
End If
End If
Next i
'その他の転記と行の非表示
ws.Rows(k & ":50").Hidden = True 'データがない行を隠す
ws.Range("A18").Value = "ご請求金額:" & Format(ws.Range("D54").Value, "#,##0") & " 円"
ws.Range("A3").Value = client & "御中" '取引先名
ws.Range("A5").Value = "〒" & wsClient.Cells(n, 2).Value '郵便番号
ws.Range("A6").Value = wsClient.Cells(n, 3).Value '住所1
ws.Range("A7").Value = wsClient.Cells(n, 4).Value '住所2
ws.Range("D15").Value = DateSerial(Year(dayCutoff), Month(dayCutoff) + 1, 0) '請求日
ws.Range("D16").Value = DateSerial(Year(dayCutoff), Month(dayCutoff) + 2, 0) 'お支払期限
'ファイル名を生成して保存して閉じる
Dim fileName As String
fileName = ThisWorkbook.Path & "\" & Format(dayCutoff, "yyyymm") & "請求書_" & client & ".xlsx"
wb.SaveAs fileName
wb.Close
Next n
End Sub
ちょっと長いですがこれまでお伝えしてきたテクニックを見直せば多分大丈夫です。
全体の流れとしては以下のようになっています。
- 「請求データ」シート、「取引先マスタ」シートの最終行数を取得する
- 請求書を作成する対象の年月を入力ダイアログを表示してユーザーに入力してもらう
- 「取引先マスタ」シートの最終行まで繰り返し
- 「請求書ひな形.xlsx」を開き、ブックとワークシートをオブジェクト変数にセット
- 「請求データ」シートの最終行まで繰り返し
- 現在のデータの取引先が、対象の取引先であれば
- 現在のデータの納品日が対象の年月であれば
- 現在のデータを「請求書ひな形.xlsx」に転記
- 「請求書ひな形.xlsx」のデータがない行を隠す
- 「請求書ひな形.xlsx」にご請求金額、取引先情報、請求日、お支払い期限などを転記
- 保存するファイル名を生成
- ブックを別名で保存
- ブックを閉じる
実行結果
これマクロ実行して、入力ダイアログに「2018/01」とすると、フォルダ内には以下のように取引先別のブックが作成されます。
例えば、ABC株式会社の請求書を開くと、以下のように該当のデータが転記された請求書は作成されてることがわかります。
まとめ
以上、エクセルVBAで取引先別の請求書を別ブックとして作成するマクロの作り方についてお伝えしました。
今回紹介したコードは、コピペだけして使うよりも、一行一行の意味をちゃんと理解した上で、メンテナンスやカスタマイズができる状態が理想です。
もし、引っかかるところがあれば、これまでのシリーズの記事で復習してくださいね。
では、また別の便利なツールの作り方についてお伝えしたいと思いますので、どうぞ他の記事もご活用くださいね。
連載目次:データ一覧から請求書を自動で作る
お仕事において特定のデータ一覧から必要な情報を抽出するということは頻繁にありうると思います。ここではデータ一覧から請求書を作るということを目標に、実務で使えるスキルをまっすぐに身に着けることを目的としています。- 【初心者向けエクセルVBA】データ一覧から請求書を自動で作る
- 【初心者向けエクセルVBA】ワークシートをオブジェクト名で取り扱う方法
- 【初心者向けエクセルVBA】For~Next文で簡潔にプログラムを書く
- 【初心者向けエクセルVBA】行の数をカウントする&不要な行を隠す
- 【初心者向けエクセルVBA】文字列の連結&Format関数での書式変更
- 【初心者向けエクセルVBA】セル範囲を一気にまとめてコピーする方法
- 【初心者向けエクセルVBA】ワークシートのデータのある範囲だけをピッタリ取得する方法
- 【初心者向けエクセルVBA】セル範囲の平行移動をする方法・リサイズをする方法
- 【初心者向けエクセルVBA】日付データから年・月・日を取り出す
- 【初心者向けエクセルVBA】If~Thenを使った条件分岐の超入門
- 【初心者向けエクセルVBA】For~Next文でセル範囲を一行ずつ移動させる
- 【初心者向けエクセルVBA】セル範囲のクリア~ClearContentsメソッドとClearメソッド
- 【初心者向けエクセルVBA】ワークシート・セルを選択する方法の色々について
- 【初心者向けエクセルVBA】入力ダイアログを表示するInputBoxメソッドの使い方
- 【初心者向けエクセルVBA】日付データから月末日と翌月末日を自動算出する
- 【初心者向けエクセルVBA】ワークシートをコピーする方法とそのシート名を変更する方法
- 【初心者向けエクセルVBA】オブジェクトを変数にセットして取り扱う方法
- 【初心者向けエクセルVBA】Openメソッドで新たなブックを開く方法
- 【初心者向けエクセルVBA】現在マクロを書いているブックのフォルダパスを取得する
- 【初心者向けエクセルVBA】開いたブックとそのワークシートをオブジェクト変数にセットする
- 【初心者向けエクセルVBA】ワークブックを別名で保存して閉じる方法
- 【初心者向けエクセルVBA】取引先別に請求書を作成するマクロを作る