では次に、Subプロシージャ「領収書作成()」の内容を解説します。このプロシージャのおおまかな流れは以下の通りです。
まず、以下の部分を見ていきます。
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」型で宣言をした変数にセットをしている部分です。
Dim ws As Worksheet Set ws = wb.Worksheets(1)
ここでは、Workbookオブジェクトの「Worksheets」プロパティを使っています。
Workbookオブジェクト.Worksheets(インデックス)
丸括弧を付けない場合、指定したWorkbookオブジェクトに含まれる全てのシートをWorksheetsコレクションとして取得します。一方で、丸括弧内にインデックスを指定すると、該当するシートのみを、Worksheetオブジェクトとして取得できます。「インデックス」は、シートの並び順を表しており、一番左のシートが1で、以降1ずつカウントアップされていきます。
続いて、以下の部分を見ていきましょう。
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オブジェクトを取得するには、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
今回は、データの作成や転記を行い、自動で書類を作成するマクロを紹介しました。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.