【初心者向けエクセルVBA】Worksheetのコピーを活用して複数の請求書を作る

★気に入ったらシェアをお願いします!


みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

請求データ一覧から請求書を自動で作成するシリーズのVBA講座、なんと8回目です!

前回はInputBoxを使って日付の入力を要求しつつ、月末日の自動計算なども追加しました。

【初心者向けエクセルVBA】InputBoxでの日付入力と月末日の自動算出
請求データ一覧から請求書を自動で作成するシリーズのVBA講座の7回目です!今回はInputBoxによる入力フォームの表示と月末日の自動算出を活用して実用に耐えうるプログラムの完成を目指していきます。

だいぶ実務で使えるようなプログラムになってきましたね~。今回以降でどんどんパワーアップしていきますよ。

今回は取引先が複数あったとしてもそれぞれの請求書をいっぺんに作成できるようにしていきたいと思います。

よろしくお願いします!

スポンサーリンク

前回のおさらい

Public変数の宣言です。

ワークシート初期化用のプロシージャがこちらです。

そして本体のプロシージャです。

請求データから入力した月に納品されたデータだけを請求書ひな形に転記するという処理ですね。

取引先1社であればこのプログラムで十分に対応することができます。

今回のお題:取引先が複数の場合でもいっぺんに対応したい

普通は請求データを取引先ごとに分けておくのは面倒です。

同じシートに請求データがあったとしてもそれぞれの取引先用の請求書をしたためて、それぞれに対応したデータをコピーをしたいと思います。

今回新たに取引先の情報が必要なので、取引先マスタというシートを追加しました。

取引先マスタ

請求データも取引先の情報が必要なのでカラムを追加しています。

請求データ

プログラム修正の方針

今回のお題を受けまして、前回のプログラムをどのように修正をしていくかを整理しておこうと思います。

  • 取引先マスタのすべての取引先についてFor~Nextを回す
  • 請求書ひな形をコピーしてその取引先用のシートを作成
  • 請求データの各行についてその取引先のものであれば転記

という方針で進めます。

イメージとしては前回のプログラムを取引先の数の分だけ繰り返すというイメージですね。

プログラムとしては上記9行目のInputBox以降を以下のように変更していきます。

(A)と(B)の箇所が今回新たに追加・修正をする部分ですので、以下解説をしていきます。

請求書ひな形シートをコピーして取引先用のシートを作成

まず(A)の箇所ですが、ここが今回の肝になる部分ですね。

より方針を細分化しますと

  • 請求書ひな形シートをコピーする
  • コピーしたシートの名前を取引先名にする
  • wsInvoiceにそのシートを再セットする

という手順になります。

CopyでWorksheetのコピーをする

Worksheetのコピーをする場合は

Worksheetオブジェクト.Copy シートをコピーする場所

と記述します。シートをコピーする場所

after:=Worksheetオブジェクト

または

before:=Worksheetオブジェクト

と指定します。それぞれ指定したWorksheetオブジェクトの後または前にコピーしたシートを追加するという意味ですね。

今回のプログラムでは

とします。

NameでWorksheetの名前を変更

次にシート名を取引先名に変更しておきます。

シートの名前を変更する場合は

Worksheetオブジェクト.Name = シート名

です。今回はWorksheetオブジェクトの特別な指定方法でActiveSheetというのを使います。

これは現在アクティブになっているワークシートを表すのですが、Copyされたシートは常にアクティブ状態になっているので、これを使うとわかりやすいのです。

それで、このコピーされたシートをwsInvoiceに再セットしてしまいます。

請求データの取引先名が現在の取引先かどうか

次に(B)の箇所です。これに関しては今までの講座でやってきた部分ですのですね。

これでOKです。

メインの部分はこちらで完了ですが、変数の追加や請求データの列追加などがありましたので、その他細かいところはそれに合わせてきちんと修正しましょうね。

実行結果

実行結果がこちらです。

請求書作成実行結果その1

請求書作成実行結果その2

はい、ちゃんとそれぞれの取引先名でシートが作成されていて、請求データの転記もうまくいっているようです。

まとめ

今回は複数の取引先でもそれぞれの請求書がいっぺんに作成できるように変更をしていきました。

新たに出てきた命令は

  • CopyでWorksheetのコピーをする
  • NameでWorksheetの名前を変更

でしたね。これでWorksheetも少しずつ操作ができるようになってきました。

全体のプログラムはこちらです。

次回はいよいよ本シリーズの最終回!

取引先ごとに別ファイルで請求書を作成する方法についてお伝えしています。

【初心者向けエクセルVBA】ファイルのコピーを使って取引先別の請求書を作る
請求データ一覧から請求書を自動で作成するシリーズのVBA講座もいよいよ9回目です!今回はWorksheetのコピーではなく、ファイルをコピーして取引先別の請求書ファイルを作成する方法を解説します。

どうぞお楽しみに!

連載目次:データ一覧から請求書を自動で作る

  1. 【初心者向けエクセルVBA】データ一覧から請求書を自動で作る
  2. 【初心者向けエクセルVBA】For~Next文で簡潔にプログラムを書く
  3. 【初心者向けエクセルVBA】行の数をカウントする&不要な行を隠す
  4. 【初心者向けエクセルVBA】文字列の連結&Format関数での書式変更
  5. 【初心者向けエクセルVBA】If~Thenを使った条件分岐の超入門
  6. 【初心者向けエクセルVBA】Public変数の宣言とSubプロシージャの呼び出し
  7. 【初心者向けエクセルVBA】InputBoxでの日付入力と月末日の自動算出
  8. 【初心者向けエクセルVBA】Worksheetのコピーを活用して複数の請求書を作る
  9. 【初心者向けエクセルVBA】ファイルのコピーを使って取引先別の請求書を作る


コメント

  1. 小川  より:

    たいへん わかりやすくて、楽しく勉強させて頂いてます。
    実務で使えるVBAだと思います。

    8.【初心者向けエクセルVBA】Worksheetのコピーを活用して複数の請求書を作る
    「おさらい」のサンプルをコピペして動作確認したら、変数nの値がゼロでした。
    バグ探しで大変勉強になりました。ありがとうございます。
    これからも、もっともっと多くのサンプルを載せてほしいです。
    ———————————————————– 

    Sub 請求書作成()

    Dim i, j, k, n As Long ‘For~Nextカウント用整数型変数
    Dim dayData As Date ‘納品日格納用変数
    Dim dayCutoff As Date ‘締月入力用変数
    Dim strClient As String ‘取引先格納用変数
    ‘————————————————————–
    Call シート初期化  ’<=ここにも入れないと動きません。
              ’ ↓rowsClientに値が設定されていませんから
    ‘————————————————————–
    dayCutoff = InputBox(“締月を入力してください(例:2015/5)”)

    For n = 2 To rowsClient

     Call シート初期化

    wsInvoice.Copy after:=wsInvoice ‘請求書ひな形シートを右隣りにコピーする
    ‘——————————————————————————
    ‘ n の値が0でした。
    —————– =====
    ActiveSheet.Name = wsClient.Cells(n, 1).Value ‘シート名を取引先名に変更する
    ‘———————————-====————————————–
    Set wsInvoice = ActiveSheet ’※シートコピーをすると新たにできたシートがアクティブ

    • コメントありがとうございます!
      確かにおっしゃる通りでしたね…ご指摘助かります。
      本文修正いたしました。

      今後ともどうぞよろしくお願いいたします!