Excelマクロで仕事効率化（初心者向け）(2) | 一括請求書PDF作成


<img width=A%><img width=100% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784222/fe096a61-b3d9-9207-592d-f922d2c18b26.jpeg">

# はじめに
 前回は、この連載記事を書くきっかけについてお話をさせて頂きました。
 
https://qiita.com/ogi_kimura/items/2bd4743c529082e76e96

 今回は、「一括で請求書PDFの作成」をストーリー仕立てでプログラミングをしていこうと思います。単純にプログラムの最終結果を示すだけではなく、課題に対してどのようなアプローチでプログラミングをするかということも見ていただければと、思っています。

# Excelマクロについて
　はじめにExcelマクロについて、概要を理解しましょう。
　以下は、Excelマクロでプログラミングをするうえで、知っておく必要がある内容です。

#### Excelファイル起動
　パソコン上のExcelのアイコンなどをダブルクリックすると、以下のような形でシートが表示されます。
 「ブック」とはExcelファイル自体を指し、例えば「abcde.xlsx」ファイルは1つの「ブック」です。
 また、「シート」はその「ブック」の中にあるタブで切り替えられる計算表を指します。
 
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784222/6185582f-77ea-cebf-7d17-8b143d8de31a.png)

左下に「Sheet1」とありますが、これが1つの「シート」です。その隣に⊕がありますが、これを押下すると「シート」の数を増やすことができます。

#### VBAの表示
　続いて上部バーに「開発」というタブがありますので、それを押下します。それから左にある「Visual Basic」を押下します。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784222/16289ecc-e401-86b8-3a4d-9ce6a42d033b.png)

そうすると、別WindowでVBA（正式にはMicrosoft Visual Basic for Application)の画面が表示されます。
左の赤枠に「Sheet1」が確認でき、「シート」に対してもプログラミングができます。また「ThisWorkbook」というのもあるのですが、これは「ブック」全体に作用する処理をプログラミングするもので、例えば「ブック」が起動した時や終了した時に実行する処理があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784222/71f0a4ab-0829-5478-b42c-aa455b47a9fb.png)

#### オブジェクトの種類
ツリー部分を右クリックすると、赤枠のようなリストが表示されます。
プログラムは、ファイル群の集合と考えることができ、その種類として「ユーザーフォーム」や「標準モジュール」があるという理解で良いかと思います。

・「ユーザーフォーム(U)」：　入力や確認のための子画面をイメージして頂けばよいのですが、そのような画面を作成するときに追加します。
・「標準モジュール(M)」：一般的に言われているプログラムを書くときに追加します。
・「クラスモジュール(C)」：プログラムではデータを管理する場面があるのですが、それを更新したり引き出したりしやすくするための箱と思っていただければ良いかと思います。
これに先ほど示してた「シート」が加わります。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784222/1e12ee26-1e70-01af-f511-4a228e3d878e.png)

今回は簡単にプログラミングしていきたいので、「標準モジュール」のみを使っていきます。
「標準モジュール」を追加した結果が以下の図となります。
デフォルトで「Module1」という名前で追加が完了します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784222/564de5cf-24a6-a704-0467-5ee326a34afa.png)



 # 請求書フォーマット
 　請求書フォーマットを何にするかを決めていくことにします。
  インターネット上にはフリーの請求書フォーマットがあり、自分の仕事にあったものを選びました。
  
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784222/7c7b1009-1d71-f7de-7e65-8d1edd895723.png)

フォーマットは何でも良いのですが、請求書の構造を理解することが重要になります。
このフォーマットを見ると

①請求先会社名
②請求書No
③請求日
④件名
⑤支払い期限
⑥振込先
⑦合計
⑧摘要
⑨数量
⑩単位
⑪単価
⑫税率
⑬金額
以上から構成されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784222/60e4dfd7-8145-0505-4a84-45dded698ffe.png)

①～⑦は、1つの請求書で1つとなります。
一方⑧～⑬は、1つの請求書で複数存在する可能性があります。
このようにデータはそれぞれ構成があるということが分かります。
右部にある請求元の会社名や住所は、定型化して問題ないので今回の対象から外しています。

請求書シートをマクロブックにコピーをします。
具体的な操作は、移動元の「シート」のタブ（下部にある）を「Ctrlキー」を押しながら選択して、グーっと移動先(マクロ）に持っていきます。「ドラッグ＆ドロップ」というのですが、この操作を行って「シート」を持ってきます。以下がマクロ側にシートを持ってきた結果です。赤枠の部分を確認すると、「シート」が２つになったことが分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784222/2f3f63e3-a8de-f799-afaf-29a820ccdf1f.png)

#### データシート作成
次に請求書フォーマットに自動的に入力するためのデータを作成します。
「Sheet1」の名前を「データ」として、これをデータシートにしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784222/20a7da31-2c15-38bd-78ab-20965b5e51e4.png)

このデータシートにデータを入力していきます。
①～⑦と⑧～⑬の違いを意識して、以下の様に作ってみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784222/4ce62859-41bf-1c95-a148-30be5d3b568b.png)

「①請求先名」から「⑥振込先」までを横にズラッと記入しました。また「⑧摘要」から「⑬金額」は1つの請求書に複数存在するため繰返し横へ記述しています。「摘要」「数量」・・・「金額」そして「摘要」・・・といった感じです。５セット繰り返すことにしました。（最後はAJ列が「金額」となります。）
ここで注意は「⑧合計」なのですが、金額を集計した結果で、データとしての入力は不要なので、自動的に計算するようにします。そのためシート上の項目から外しています。


# おわりに
今回は、データ入力のための「データ」シートを作成し、項目を記載しました。
どのような経緯で項目を設定するかについても細かく説明しました。
次回は、実際に「データ」シートにテスト用のデータを入力して、マクロのプログラミングをします。