ExcelとWordの連携でビジネスプロセスを合理化!VBAで請求書を自動作成

今回はExcelVBAを使用して、手間をかけずに請求書を効率的に作成する方法をご紹介します。これにより、ビジネスプロセスを合理化し、貴重な時間を節約できます。利用した請求書のひな型はWordのテンプレートにある「サービス請求書(シンプルな線のデザインのドキュメント)」です。以下でご紹介するコードを活用すれば、Wordで作成したどのような請求書もExcelのデータと連携が可能になります。

サンプルアプリの利用方法

Excelシート上に次の内容で請求書のデータを作成します。「日付、請求番号、顧客ID、会社名、宛先名、住所、担当者、担当部署名、支払条件、期日、商品名、数量、単価、合計」

シート上に配置した「Word請求書作成」ボタンをクリックすると、会社ごとの請求書を自動的に作成します。
下の画像にある「請求書サンプル.docx」がWordのテンプレートにある「サービス請求書(シンプルな線のデザインのドキュメント)」で、「D」ドライブの「データ」フォルダに保存しておきます。このテンプレートファイルをもとに各社の請求書を作成します。

作成されたB株式会社請求書の内容は以下のようになります。赤枠がExcelと連携している箇所です。

ExcelとWordを連携させるコードのポイント

1. Wordアプリケーションの起動と文書の開閉のための変数宣言
下記変数を使用してWordを起動し、文書を開きます。最後には文書を閉じ、Wordも終了します。
 Dim myWordApp As New Word.Application
 Dim myWordDoc As Word.Document

2. ExcelデータからWord文書へのデータ挿入
下記コードで、Excelの特定のセルからWord文書の特定の段落にデータを挿入しています。このようなコードを使用して、ExcelデータをWord文書に転記します。下記例では、Word文書の8番目の段落にExcelのセル(i行2列目)の値を挿入しています。
 .Paragraphs(8).Range.InsertBefore Cells(i, 2).Value

3. 動的なWord文書生成
指定されたWord文書を開くことで、1つのWord文書を作成し、その中にExcelデータを挿入します。これにより、1つのテンプレートを使用して複数の文書を生成できます。
 Set myWordDoc = myWordApp.Documents.Open(“D:\データ\請求書サンプル.docx")

4. ループを使用したWord文書への商品データの挿入
Do…Loopを使用して、Excelの商品データが続く限りWord文書に挿入を繰り返します。これにより、一つの文書に複数の商品情報をまとめて挿入できます。
 Do
 ’ 商品データを挿入
 Loop While Cells(Count1, 2).Value = “" And Count1 <= j

5. 小計、消費税、合計の挿入
小計、消費税、合計などの計算結果をWord文書のブックマークに挿入しています。これにより、Excelでの計算結果をWord文書に反映させます。Wordにブックマークを作成する方法については次のURLのリンク先をご覧ください。  Wordにブックマークを作成する方法 
以下のコードで使われている「TotalAmount」、「Tax」、「Total」がWord上に作成したブックマークです。

 ’小計をブックマークに挿入
 .Bookmarks(“TotalAmount").Range.Text = Format(totalAmount, “Currency")

 ’消費税をブックマークに挿入
 tax = 0.1 * totalAmount
 .Bookmarks(“Tax").Range.Text = Format(tax, “Currency")

 ’合計をブックマークに挿入
 total = totalAmount + tax
 .Bookmarks(“Total").Range.Text = Format(total, “Currency")

6. Word請求書文書の保存
ループを使用して次の取引先の文書を作成するところで、SaveAsメソッドを使用して、ファイル名に会社名を組み込んでWord文書を保存します。下記「Cells(Count3, 5)」が会社名の箇所。
 .SaveAs “D:\データ\" & Cells(Count3, 5).Value & “請求書" & “.docx"

このコードを活用するメリット

1. 効率的な作業プロセス
手動での請求書作成に比べ、ExcelVBAコードを使用することで、膨大なデータを手作業で入力・整理する手間を大幅に削減できます。一度設定したコードを使いまわすことで、迅速な請求書作成が可能です。

2. 多様なデータ処理の柔軟性
コード内の条件分岐やループを活用することで、異なる形式や種類のデータにも対応可能です。大量のデータを素早く処理し、カスタマイズされた請求書を生成する柔軟性があります。

3. 時間の節約
手動での作業にかかる時間を大幅に削減できます。複数の請求書を一括で処理し、一連の作業を自動化することで、時間を他の業務に充てることが可能です。

4. 誤りの削減
コード内で行われる計算やデータの挿入は機械的で一貫性があり、手動での入力ミスや漏れを防ぎます。これにより、正確性の向上が期待できます。

5. さまざまなテンプレートに対応可能
ExcelVBAコードを使うことで、様々な請求書テンプレートに再利用できます。異なる取引先や期間に対しても同じコードを適用でき、手間をかけずに多様な請求書を生成できます。

6. スケーラビリティの向上
取引先や商品数が増えても、コードを微調整するだけで対応できます。これにより、ビジネスの成長に伴い発生する複雑な請求書作成の要求にもスムーズに対応できます。

ExcelVBAコードの利用は、手動での煩雑な作業を解消し、ビジネスプロセスを合理化することで、生産性と効率性を向上させます。

サンプルアプリのコード   アプリの作成手順はこちら

以下が今回ご紹介したサンプルアプリのコードです。

'変数の宣言を強制するためのオプション。
Option Explicit

'メインのサブルーチンの宣言
Sub Word文書へデータ入力()

 'Wordアプリケーション、Word文書、および各種のカウンター、合計金額、税額、総額を格納する変数の宣言
  Dim myWordApp As New Word.Application
  Dim myWordDoc As Word.Document
  Dim i As Integer, j As Integer
  Dim Count1 As Integer, Count2 As Integer, Count3 As Integer
  Dim totalAmount As Double, tax As Double, total As Double

 '宛先を入れる変数を宣言
  Dim ExcelText As String 

  '初期の各種カウンターと合計金額の初期化
  Count1 = 5   '商品行
  Count2 = 0   'Word行
  Count3 = 0   '日付行
  totalAmount = 0 '小計値の初期化

  'データの最終行を取得
  j = Cells(Rows.Count, 12).End(xlUp).Row

  'データ処理のメインのループ。データの5行目から最終行まで処理を繰り返す
  For i = 5 To j
  
   '指定されたWord文書を開く。
    Set myWordDoc = myWordApp.Documents.Open("D:\データ\請求書サンプル.docx")
        
   'Word文書に対する処理を開始。
    With myWordDoc
    
      'ここからWord文書の指定された段落にExcelのセルの値を挿入

      'Excelの日付をWord文書にセット
      .Paragraphs(8).Range.InsertBefore Cells(i, 2).Value

      'Excelの請求番号をWord文書にセット
      .Paragraphs(11).Range.InsertBefore Cells(i, 3).Value

      'Excelの顧客IDをWord文書にセット
      .Paragraphs(14).Range.InsertBefore Cells(i, 4).Value

      '宛先作成(住所、会社名、担当者名にそれぞれ改行をいれて結合)
      ExcelText = Cells(i, 7).Text & vbLf & Cells(i, 5).Text & vbLf & Cells(i, 6).Text & " 様"
            
      'Excelの宛先をWord文書にセット
      .Paragraphs(16).Range.InsertBefore ExcelText

      'Excelの担当者をWord文書にセット
      .Paragraphs(28).Range.InsertBefore Cells(i, 8).Value

      'Excelの担当部署名をWord文書にセット
      .Paragraphs(29).Range.InsertBefore Cells(i, 9).Value

      'Excelの支払条件をWord文書にセット
      .Paragraphs(30).Range.InsertBefore Cells(i, 10).Value

      'Excelの期日をWord文書にセット
      .Paragraphs(31).Range.InsertBefore Cells(i, 11).Value
                   
      '会社名を取得するため、会社名が入っている行の行番号を取得
      If Cells(Count1, 5).Value <> "" Then
         Count3 = Count1
      End If

      '商品データのみが入っている行をループ
      Do
         'Excelの商品名をWord文書にセット
         .Paragraphs(39 + Count2).Range.InsertBefore Cells(Count1, 12).Value
                
         'Excelの数量をWord文書にセット
         .Paragraphs(40 + Count2).Range.InsertBefore Cells(Count1, 13).Value
                
         'Excelの単価をWord文書にセット
         .Paragraphs(41 + Count2).Range.InsertBefore Cells(Count1, 14).Value
                
         'Excelの合計をWord文書にセット
         .Paragraphs(42 + Count2).Range.InsertBefore Cells(Count1, 15).Value

         'Word文書にセットする小計を計算
          totalAmount = totalAmount + Cells(Count1, 15).Value
                
          Count1 = Count1 + 1     '商品行カウントアップ
          Count2 = Count2 + 5     'Word行カウントアップ
                
      '取引先が変わるまで商品データのループを継続。
      Loop While Cells(Count1, 2).Value = "" And Count1 <= j

      '小計をブックマークに挿入
      .Bookmarks("TotalAmount").Range.Text = Format(totalAmount, "Currency")
                        
      '消費税をブックマークに挿入
      tax = 0.1 * totalAmount
      .Bookmarks("Tax").Range.Text = Format(tax, "Currency")

      '合計をブックマークに挿入
      total = totalAmount + tax
      .Bookmarks("Total").Range.Text = Format(total, "Currency")

      '次のWord文書作成のため、Word行カウント数を初期化
      Count2 = 0
            
      '次の取引先の文書を作成するため、iカウンタを設定
      i = Count1 - 1

      'ファイル名に会社名を入れてWord文書を保存して閉じる
      .SaveAs "D:\データ\" & Cells(Count3, 5).Value & "請求書" & ".docx"
      .Close
            
     End With
        
     '次のループのために小計をクリア
     totalAmount = 0
        
   Next i

  'Wordオブジェクトを解放してアプリケーションを終了。
   Set myWordDoc = Nothing
   myWordApp.Quit: Set myWordApp = Nothing
    
  '処理が完了したことを通知するメッセージボックス。
   MsgBox "請求書ファイルの作成が完了しました。", vbInformation

End Sub

最後に

自動請求書生成のExcelVBAコードを活用して、ビジネスのスムーズな運営を実現しましょう。これからも便利なツールを提供していきます。お楽しみに!