みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
初心者向けエクセルVBAのシリーズとして請求書を作成するマクロの作り方をお伝えしています。
前回の記事はこちらです。
オブジェクト変数の宣言とセットについてお伝えしました。
さて、前回紹介したマクロを実行すると、シート名について「この名前は既に使用されています。」というエラーが発生することがあります。
その対策として、シート別に作成していた取引先別を請求書を、別のブックにすることで解決していきたいと思います。
まず、その前提となるテクニックの一つとして、エクセルVBAで新たなブックを開く方法をお伝えしていきます。
なお、本記事は以下のYouTube動画と連動していますので、合わせてご覧くださいませ。
では、行ってみましょう!
前回のおさらい
作成したプログラム
前回までで作成したプログラムはこちらです。
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
wsTemplate.Copy After:=wsTemplate
Dim ws As Worksheet
Set ws = ActiveSheet
ws.Name = client
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) 'お支払期限
Next n
End Sub
「取引先マスタ」シート(wsClient)にリストされている取引先の部分だけ、「請求書ひな形」シート(wsTemplate)をコピーして取引先別のシートを作成します。
それらのシートに、請求データがまとめてリストされている「請求データ」シート(wsData)から、対象となる請求データを転記するというものです。
同じ名前のシートは作成できない
しかし、マクロを2回目以降に実行すると、以下のようなエラーが発生する時があります。
「この名前は既に使用されています。別の名前を入力してください」とありますね。
これは、前回のマクロ実行で同じ取引先名のシートが存在しているにも関わらず、再度同じシート名のワークシートを作成しようとすることによるエラーです。
今回以降で、この課題を解決していきたいと思います。
取引先別のワークブックを作る方針
この問題の解決方法はいくつか考えられるのですが、取引先別のワークシートではなくて、取引先別のワークブックを作る方法に方針を切り替えることで解決していきます。
まず、「請求書ひな形」シートを別のブックに移動して、以下のように「請求書ひな形.xlsx」とします。
このファイルを、現在マクロを作成している「請求データ.xslm」と同じフォルダに保存をします。
その上で、マクロとしては
- 「請求書ひな形.xlsx」をワークブックとして開く
- 該当の取引先の請求データを「請求書ひな形」に転記および各種情報を書き込む
- ブック名を「yyyymm請求書_取引先名.xlsx」として別名で保存
という流れとします。2,3を取引先分だけ繰り返せばOKです。
Workbooks.Openメソッドでファイルを開く
まず、ワークブック「請求書ひな形.xlsx」を開く方法を考えていきましょう。
VBAではワークブックはWorkbookオブジェクトとして操作をすることができますが、新たにワークブックを開くときには、Workbooksコレクションが操作の対象となります。
以下、順を追って解説をしていきます。
コレクションとは
コレクションというのは、同種のオブジェクトの集合のことです。だから「Workbookコレクション」ではなくて、「Workbooksコレクション」になります。
一つのブックはWorkbookオブジェクト、開いている複数のブックの集合を表すのがWorkbooksコレクションです。
現在開いているワークブックの集合を取得する
例えば、Excelでは複数のブックを同時に開いておくことができますよね。
それらのブックは、Excelアプリケーション自体を表すApplicationオブジェクトのWorkbooksプロパティでコレクションとして取得することができます。
書き方はこうです。
ただ、Applicationオブジェクトは省略可能ですので、単純に
と書くことができます。
Openメソッドでブックを開く
さらに、それらの「開いているワークブックの集合」に対して、Openメソッドを使うことで、新たなブックを開いて追加をすることができます。
書き方はこうです。
つまり、これを使って「請求書ひな形.xlsx」を開けば良いということですね。
例えば、私の環境の場合は「請求書ひな形.xlsx」ファイルは「G:\マイドライブ\40_ブログ\ExcelVBA_請求書\11\請求書ひな形.xlsx」にあります。
したがって、以下のようにイミディエイトウィンドウに入力して実行すると、該当のファイルを開くことができます。
Workbooks.Open "G:\マイドライブ\40_ブログ\ExcelVBA_請求書\11\請求書ひな形.xlsx"
まとめ
以上、エクセルVBAで新たにブックを開くOpenメソッドの使い方についてお伝えしました。
ワークブックを開くときの対象のオブジェクトはWorkbookオブジェクトではなくて、Workbooksコレクションであることに注意してくださいね。
次回、「現在マクロを書いているブックと同じフォルダのパス」 を取得する方法をお伝えしていきます。
どうぞお楽しみに!
連載目次:データ一覧から請求書を自動で作る
お仕事において特定のデータ一覧から必要な情報を抽出するということは頻繁にありうると思います。ここではデータ一覧から請求書を作るということを目標に、実務で使えるスキルをまっすぐに身に着けることを目的としています。- 【初心者向けエクセル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】取引先別に請求書を作成するマクロを作る