一石二鳥で時間に余裕が!――面倒くさい見積書や請求書などの書類を自動作成するマクロとは:働く価値を上げる“VBA/GAS術”(5)(3/3 ページ)
見積書や請求書、経費精算書などのさまざまな書類をExcelで作成している人は少なくありません。その書類を手で入力したりコピー&ペーストで作成したりしていては、人為的なミスが起こり、時間がかかってしまいます。今回はVBAで書類を作成する方法を紹介します。
領収書を作成するプロシージャ
では次に、Subプロシージャ「領収書作成()」の内容を解説します。このプロシージャのおおまかな流れは以下の通りです。
- ひな型のブックを開く
- 以下の処理をSheet1の2行目から4行目まで繰り返し
- Sheet1のリストから氏名、品目、金額のデータを作成する
- 作成した氏名、品目、金額のデータをひな型に転記する
- ひな型に名前を付けて保存する
- ひな型のブックを閉じる
Workbookオブジェクト
まず、以下の部分を見ていきます。
Dim wb As Workbook
ここでは、Dimステートメントで「Workbook」型の変数を宣言しています。Workbookオブジェクトは、「ブックを取り扱う」オブジェクトで、メソッドやプロパティを使って、保存したり、ブック名を変更したり、閉じたりといった操作が行えます。
その次の行に登場する「ThisWorkbook」は、現在マクロを記述しているWorkbookオブジェクトを表すオブジェクト名です。このオブジェクトは、宣言なしで使用できるので便利です。また、Workbookオブジェクトの「Path」プロパティは、以下のように記述することで、ブックの保存されているフォルダパスを取得するプロパティです。
Workbookオブジェクト.Path
ブックを開き変数にセットする
次に、以下の部分を解説します。
Set wb = Workbooks.Open(ThisWorkbook.Path & "\領収書ひな型.xlsx")
まず文字列や数値の場合、代入は不要でしたが、変数にオブジェクトを格納する場合は「Set」ステートメントが必要になります。ここは、比較的ミスしやすいポイントなので注意しましょう。
ファイルを開いて変数に格納する場合は、「Workbooks」コレクションの「Open」メソッドを使います。書式は以下の通りです。
Set 変数 = Workbooks.Open(ファイル名)
Workbooksコレクションは、Workbookオブジェクトの集合体です。コレクションもオブジェクトの1つなのですが、集合体であることを分かりやすく伝えるために、コレクションという表現が使われます。
また、Openメソッドの引数で与えるファイル名は、既定フォルダでない限りはフルパスで与える必要があります。そのため今回は、「ThisWorkbook.Path」で指定しています。
Worksheetオブジェクトの取得と格納
以下は、開いたブックのシートを取得し、「Worksheet」型で宣言をした変数にセットをしている部分です。
Dim ws As Worksheet Set ws = wb.Worksheets(1)
ここでは、Workbookオブジェクトの「Worksheets」プロパティを使っています。
Workbookオブジェクト.Worksheets(インデックス)
丸括弧を付けない場合、指定したWorkbookオブジェクトに含まれる全てのシートをWorksheetsコレクションとして取得します。一方で、丸括弧内にインデックスを指定すると、該当するシートのみを、Worksheetオブジェクトとして取得できます。「インデックス」は、シートの並び順を表しており、一番左のシートが1で、以降1ずつカウントアップされていきます。
Withステートメントでオブジェクト名
続いて、以下の部分を見ていきましょう。
With Sheet1 Dim name As String '姓 名 name = .Cells(i, 1).Value & " " & .Cells(i, 2).Value Dim description As String '品目 description = "但 " & .Cells(i, 3).Value & " として上記領収致しました。" Dim amount As Long '金額 amount = .Cells(i, 4).Value End With
ここでは、「With」ステートメント構文を使用しています。これは、ブロック内で指定したオブジェクトの表記を省略できる役割を持ちます。
With オブジェクト名 '処理 End With
今回の例では、オブジェクト「Sheet1」を指定しています。そのためブロック内の処理は「.Cells(i, 1).Value」のように、オブジェクト名の記述を省略して、ピリオドから記述できます。Withステートメントは、コードの記述量を減らすだけでなく、コードの分かりやすさを高める効果もあります。
文字列の連結
2つの文字列を連結するには「&」記号を用います。
文字列1 & 文字列2
ダブルクォーテーションで囲んだ文字列や変数、プロパティの値を指定できます。今回の例では、「姓」と「名」を連結する部分、「品目」を含めたただし書きを生成する部分などで使用しています。
Rangeプロパティでセルを取得
セル(またはセル範囲)を表すRangeオブジェクトを取得するには、Cellsプロパティを使う方法以外に、Rangeプロパティを使う方法があります。
Worksheetオブジェクト.Rangeプロパティ(アドレス)
Rangeプロパティは「A4」や「B9」などのセルアドレスを直接指定するので、Cellsプロパティより場所が分かりやすいというメリットがあります。Rangeオブジェクトを取得し、データを転記している箇所が以下の部分です。
With ws .Range("A4").Value = name & " 様" .Range("B9").Value = description .Range("C7").Value = amount End With
ブックを別名で保存し閉じる
転記が完了したら、以下の部分で、それぞれの参加者名を使用した別名でブックを保存します。
Dim wbName As String wbName = ThisWorkbook.Path & "\領収書(" & name & ").xlsx" wb.SaveAs wbName
ブックを別名で保存するには、「SaveAs」メソッドを使います。
Workbookオブジェクト.SaveAs ファイル名
ファイル名はフルパスで記すことで指定したフォルダに保存できます。
ブックを閉じる
ブックを閉じるのは「Close」メソッドを使います。書式は以下の通りです。
Workbookオブジェクト.Close
今回のマクロでは、全ての処理が完了したときに以下のようにしてひな型ファイルを閉じるようにしています。
wb.Close
プロシージャ全体を確認
解説は以上です。再度プロシージャ「領収書作成()」の内容を確認してみましょう。
Sub 領収書作成() Dim wb As Workbook Set wb = Workbooks.Open(ThisWorkbook.Path & "\領収書ひな型.xlsx") Dim ws As Worksheet Set ws = wb.Worksheets(1) Dim i As Long For i = 2 To 4 'データの作成 With Sheet1 Dim name As String '姓 名 name = .Cells(i, 1).Value & " " & .Cells(i, 2).Value Dim description As String '品目 description = "但 " & .Cells(i, 3).Value & " として上記領収致しました。" Dim amount As Long '金額 amount = .Cells(i, 4).Value End With 'データを転記 With ws .Range("A4").Value = name & " 様" .Range("B9").Value = description .Range("C7").Value = amount End With 'ブックを別名で保存 Dim wbName As String wbName = ThisWorkbook.Path & "\領収書(" & name & ").xlsx" wb.SaveAs wbName Next i wb.Close End Sub
次回はGoogle Apps Scriptで書類を作成します
今回は、データの作成や転記を行い、自動で書類を作成するマクロを紹介しました。Workbookオブジェクトの操作、Rangeプロパティ、Withステートメントなど使用頻度の高いテクニックがちりばめられているので、ぜひマスターしておきましょう。また、今回は題材として領収書を使用しましたが、他の書類の場合でも基本的な内容は変わりませんので、挑戦してみてください。
次回はGASで今回と同様の自動で書類を作成するツールを作成していきます。どうぞお楽しみに。
著者プロフィール
高橋宣成
プランノーツ 代表取締役
「ITを活用して日本の『働く』の価値を高める」をテーマに、ExcelやVBA、G Suite、Google Apps Script、クラウドなどによる企業または個人事業主向けのシステムおよびツールの開発やコンサルティング、セミナー講師などを務める。「IT×働き方」をテーマに運営するブログ「いつも隣にITのお仕事」は月間47万PV達成。
書籍紹介
高橋宣成著 秀和システム 1944円(税別)
動くコードが書けたその先、つまり「ExcelVBAを実務で使う」という目的に特化した実践書。ExcelVBAを楽に効果的に使いこなし続けるための知恵と知識、そしてそのためのビジョンと踏み出す勇気を提供する1冊。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- 「計算式エラーで残業確定……」、GASで入力データのチェックツールを作成
1つのGoogleスプレッドシートを複数人で共同編集するとき、想定していた形式とは違うデータを入力されると、不備が発生してしまう場合があります。そのような問題を、GASで解決するにはどうすればいいのでしょうか。 - Excelデータの入力不備で計算エラーが発生して家に帰れない!――入力規則よりも簡単なチェックマクロとは
1つのExcelファイルを複数人で編集する場合、想定していたのとは違う形式でデータを入力されてしまい、不備が発生する可能性も少なくない。その問題をExcel VBAで解決するにはどうすればいいのだろうか。 - さらば残業! 面倒くさいエクセル業務を楽にする「Excel VBA」とは
日頃発生する“面倒くさい業務”。簡単なプログラミングで効率化できる可能性がある。本稿では、業務で使うことが多い「Microsoft Excel」で使えるVBAを紹介する。※ショートカットキー、アクセスキーの解説あり