【ExcelVBA】Wordのファイル内にある表にExcelの表の値を出力して保存するには

この記事では、Wordのファイル内にある表にExcelの表の値を出力して保存する方法についてご説明します。

【動画】Excelのシートの表をそのままWordに出力して保存する実際の動き

本題に入る前に、まずは次の動画をご覧ください。


ExcelのマクロがWordのファイルを開き、Excelの表の値を出力したい(Wordの)表を検索します。

検索して見つかったら、その(Wordの)表に、Excelの表の値を出力します。

マクロ作成の流れ

STEP.1
Wordファイルを開き、Wordの機能にアクセスできるインスタンスを生成する
Wordファイルを開き、Wordの機能にアクセスできるインスタンスを生成します。
STEP.2
Wordファイルを開く
Wordファイルを開きます。
STEP.3
検索文字(列)を元に、Wordのファイル内にある表を検索する
検索文字(列)を元に、Wordのファイル内にある表を検索します。
表内にある文字列で表があるかを特定します。
STEP.4
Word内に表があった場合は、Excelの表データ分行を追加する
Word内に表があった場合は、Excelの表データ分行を追加します。
STEP.5
Excelのシートの値をWordの表に出力する
Excelのシートの値をWordの表に出力します。

ExcelファイルとWordファイルの例

Excelファイル(例)

今回は以下のExcelファイルを用意しました。

「top」というシートのほかに、点数表がある「1月」「2月」「3月」のシートがあります。

A2の黄色のセルに「1月」「2月」「3月」のいずれかを入力して出力ボタンをクリックすると、Wordファイル内にある表に、Excelの表の点数表が出力されて保存されます。

Wordファイル(例)

今回は以下のWordファイルを用意しました。

Wordファイルには1行の表と、その上下に適当な文章が記述されています。

今回のマクロは、Wordファイルにある表に、Excelファイルの表データを出力します。

マクロを実行した場合以下のとおりに、Wordファイルにある表に、Excelファイルの表データが出力されます。(「1月」のシートの場合)

コードの例

Option Explicit

Private Sub btn_exec_Click()
        
    Dim WordApp     As Object       'Wordアプリケーションインスタンス用変数
    Dim WordDoc     As Object       'Wordファイル用変数
    Dim ws          As Worksheet    'ワークシート変数
    Dim wdTable     As Object       'Wordの表用変数
    Dim rng         As Range        'Rangeオブジェクト格納用変数
    Dim tblCnt      As Long         'Wordの表の数用カウンタ
    Dim tblRCnt     As Long         'Wordの表の行数用カウンタ
    Dim tblCCnt     As Long         'Wordの表の列数用カウンタ
    
    'Wordの表から検索する文字列を取得する
    Const wdFndStr  As String = "項番"
    
    'Wordにデータを出力するシートを取得する
    Set ws = Worksheets(Worksheets("top").Range("shtNM").Value)
    
    'Wordアプリケーション用インスタンスを生成する
    Set WordApp = CreateObject("Word.Application")
    
    'Wordを表示しない
    WordApp.Visible = False
    
    'Wordファイルを開く
    Set WordDoc = WordApp.Documents.Open(ThisWorkbook.Path & "\0290.docx") ' 更新されたWordファイルを開く
        
    '表のデータの範囲を取得する
    Set rng = ws.Range("A2:G21")

    'Word文書内の表の数だけ処理を繰り返すFor文
    For tblCnt = 1 To WordDoc.Tables.Count
        
        'Wordの表内の文字列を検索するための各設定と実行
        With WordDoc.Tables(tblCnt).Range.Find
            
            'Wordの表から検索する文字列を取得する
            .Text = wdFndStr
            
            '検索方向を指定する(Trueは先頭から末尾へ、Falseは末尾から先頭へ)
            .Forward = True
            
            '検索時に、Word側の書式設定を無視する
            .Format = False
            
            '検索をWordファイルの最後まで行う
            .Wrap = 1
            
            'ワイルドカードを使った検索を有効にする
            .MatchWildcards = True
            
            '検索を実行する
            .Execute
            
            If .Found = True Then
            
                '表が見つかった場合
                
                '見つかった表を変数wdTableに格納する
                Set wdTable = WordDoc.Tables(tblCnt)
                                
                'Excelのシートにある表の行数分処理を繰り返すFor文
                For tblRCnt = wdTable.Rows.Count + 1 To rng.Rows.Count + 1
                
                    'Wordの表に行を追加する
                    wdTable.Rows.Add
                    
                    'Wordの表の行をコピーした時に、コピー元の塗りつぶしもコピーされてしまうので、各書式設定を解除する
                    
                    'セルの背景を自動色にする(色なし)
                    wdTable.Rows(tblRCnt).Range.Shading.BackgroundPatternColor = wdColorAutomatic
                    
                    '文字の色を自動色にする(黒)
                    wdTable.Rows(tblRCnt).Range.Font.Color = wdColorAutomatic
                    
                    '文字の太さを標準にする
                    wdTable.Rows(tblRCnt).Range.Font.Bold = False
                    
                Next tblRCnt
                                
                'Excelのシートにある表の行数分処理を繰り返すFor文
                For tblRCnt = 2 To rng.Rows.Count + 1
                
                    'Excelのシートにある表の列数分処理を繰り返すFor文
                    For tblCCnt = 1 To rng.Columns.Count
                        
                        'Wordの表に、Excelのシートにある表の値を出力する
                        wdTable.Cell(tblRCnt, tblCCnt).Range.Text = ws.Cells(tblRCnt, tblCCnt).Value
                        
                    Next tblCCnt
                    
                Next tblRCnt
                                
            End If
            
        End With
        
    Next tblCnt

    'Wordのファイルを保存する
    WordDoc.Save
    
    'Wordのファイルを閉じる
    WordDoc.Close
    
    'Wordを終了する
    WordApp.Quit

    '後処理
    Set WordDoc = Nothing
    Set WordApp = Nothing
    Set wdTable = Nothing
    
End Sub

注目すべきコード①

最初に見て頂きたいのは15行目からです。

    'Wordの表から検索する文字列を取得する
    Const wdFndStr  As String = "項番"

以上のコードは、表を検索するための文字列を取得する定数宣言です。

今回使うWordファイルのサンプルでは、表に「項番」の文字列が使われているので、この「項番」の文字列で定数宣言します。

注目すべきコード②

次に見て頂きたいのは18行目です。

    'Wordにデータを出力するシートを取得する
    Set ws = Worksheets(Worksheets("top").Range("shtNM").Value)

コードの説明

以上のコードは、Wordにデータを出力するシート名を取得するコードです。

シート名は、A2のセル(shtNMという名前付きセル)に入力されたシート名から取得しています。

※A2の黄色のセルには「shtNM」という名前を付けています。

注目すべきコード③

次に見て頂きたいのは21行目です。

    'Wordアプリケーション用インスタンスを生成する
    Set WordApp = CreateObject("Word.Application")

コードの説明

以上のコードは、Wordアプリケーション用インスタンスを生成するコードです。

このインスタンスを生成することでWordが起動されて操作することができるようになります。

今回はWordファイルを開いたりWord自体を終了させるなどの操作を行うのに使います。

注目すべきコード④

次に見て頂きたいのは24行目です。

    'Wordを表示しない
    WordApp.Visible = False

コードの説明

以上のコードは、Wordの画面を非表示にするコードです。

Trueの場合はWordが表示されたままの状態になります。

注目すべきコード⑤

次に見て頂きたいのは27行目です。

    'Wordファイルを開く
    Set WordDoc = WordApp.Documents.Open(ThisWorkbook.Path & "\0290.docx") ' 更新されたWordファイルを開く

コードの説明

以上のコードは、Wordファイルを開く処理のコードです。

OpenメソッドにExcelのシートの表を出力したいWordファイルのフルパスを指定して実行することで、そのWordファイルが開きます。

注目すべきコード⑥

次に見て頂きたいのは30行目です。

    '表のデータの範囲を取得する
    Set rng = ws.Range("A2:G21")

コードの説明

以上のコードは、表のデータの範囲を取得するコードです。

Wordの表に出力したいExcelの表の範囲を取得します。

注目すべきコード⑦

次に見て頂きたいのは33行目です。

    'Word文書内の表の数だけ処理を繰り返すFor文
    For tblCnt = 1 To WordDoc.Tables.Count

コードの説明

以上のコードは、Word文書内の表の数だけ処理を繰り返すFor文です。

Word文書内にいくつ表があるのかはWordDoc.Tables.Countプロパティから取得できるので、その値をFor文の最終値に指定して何回ループ処理を行うかを決定します。

注目すべきコード⑧

次に見て頂きたいのは36行目です。

        'Wordの表内の文字列を検索するための各設定と実行
        With WordDoc.Tables(tblCnt).Range.Find
            
            'Wordの表から検索する文字列を取得する
            .Text = wdFndStr
            
            '検索方向を指定する(Trueは先頭から末尾へ、Falseは末尾から先頭へ)
            .Forward = True
            
            '検索時に、Word側の書式設定を無視する
            .Format = False
            
            '検索をWordファイルの最後まで行う
            .Wrap = 1
            
            'ワイルドカードを使った検索を有効にする
            .MatchWildcards = True

以上のコードは、Wordファイルの中から表を探す検索オブジェクトを生成するコードです。

検索するにあたって、いくつかメソッドの実行およびプロパティの設定を行います。

.Text

「Text」プロパティは、表の中の文字列を検索する検索文字列を設定します。

「Text」プロパティに「注目すべきコード①」で説明した定数の値を設定しています。

.Forward

「Forward」プロパティは、検索するのにWordのファイルの先頭から検索するか最後から検索するかのどちらかを指定します。

Trueを指定した場合はWordファイルの先頭から、Falseを指定した場合はWordファイルの最後から検索します。

.Format

「Format」プロパティは、検索時にWord側の書式設定を無視するかどうかを設定します。

Tureを指定した場合は書式設定も一致するものを検索対象とし、Falseを設定した場合は書式設定は無視して値だけを対象に検索します。

.Wrap

Wrapプロパティは、検索をWordファイルの最後まで行うかどうかを設定します。

.MatchWildcards

「MatchWildcards」プロパティは、検索文字列にワイルドカードが使えるようにするかどうかを指定します。

Trueの場合はワイルドカードを使った検索を可能とし、Falseならワイルドカードを使った検索は使えないようにします。

注目すべきコード⑨

次に見て頂きたいのは54行目です。

            '検索を実行する
            .Execute

コードの説明

以上のコードは、Wordファイルの中から表を検索する処理のコードです。

Executeを実行すると、Wordファイルの中から表を検索します。

注目すべきコード⑩

次に見て頂きたいのは56行目から95行目です。

            If .Found = True Then
            
                '表が見つかった場合
                
                '見つかった表を変数wdTableに格納する
                Set wdTable = WordDoc.Tables(tblCnt)
                                
                'Excelのシートにある表の行数分処理を繰り返すFor文
                For tblRCnt = wdTable.Rows.Count + 1 To rng.Rows.Count + 1
                
                    'Wordの表に行を追加する
                    wdTable.Rows.Add
                    
                    'Wordの表の行をコピーした時に、コピー元の塗りつぶしもコピーされてしまうので、各書式設定を解除する
                    
                    'セルの背景を自動色にする(色なし)
                    wdTable.Rows(tblRCnt).Range.Shading.BackgroundPatternColor = wdColorAutomatic
                    
                    '文字の色を自動色にする(黒)
                    wdTable.Rows(tblRCnt).Range.Font.Color = wdColorAutomatic
                    
                    '文字の太さを標準にする
                    wdTable.Rows(tblRCnt).Range.Font.Bold = False
                    
                Next tblRCnt
                                
                'Excelのシートにある表の行数分処理を繰り返すFor文
                For tblRCnt = 2 To rng.Rows.Count + 1
                
                    'Excelのシートにある表の列数分処理を繰り返すFor文
                    For tblCCnt = 1 To rng.Columns.Count
                        
                        'Wordの表に、Excelのシートにある表の値を出力する
                        wdTable.Cell(tblRCnt, tblCCnt).Range.Text = ws.Cells(tblRCnt, tblCCnt).Value
                        
                    Next tblCCnt
                    
                Next tblRCnt
                                
            End If

コードの説明

以上のコードは、Wordファイルの中から表を検索して見つかった場合に、Excelの表のデータ件数分表の行数を増やして、その行にExcelの表のデータを出力する処理のコードです。

コードの詳細

56行目のコードは、Wordファイルの中から表を検索して見つかったかどうかを判定するIFです。

もし見つかった場合は61行目のコードに処理が遷移します。

61行目のコードでは、見つかった表を変数wdTableに格納します。

64行目のコードは、Excelのシートにある表の行数分処理を繰り返すFor文です。

67行目のコードは、Wordの表の行を1つ増やす処理のコードです。

Wordの表に行を追加した際に、一つ上のセルの書式が引き継がれてしまうので、71行目のコードではその塗りつぶしを解除し、75行目のコードでは文字の色を自動色に、78行目のコードでは文字の太さを標準に設定しています。

83行目のコードは、Excelのシートにある表の行数分処理を繰り返すFor文です。

86行目のコードは、Excelのシートにある表の列数分処理を繰り返すFor文です。

89行目のコードでは、Wordの表に、Excelのシートにある表の値を出力しています。

注目すべきコード⑪

次に見て頂きたいのは102行目から108行目です。

    'Wordのファイルを保存する
    WordDoc.Save
    
    'Wordのファイルを閉じる
    WordDoc.Close
    
    'Wordを終了する
    WordApp.Quit

以上のコードは、Wordのファイルを保存して閉じ、Word自体も閉じる(終了する)処理のコードです。

コードの詳細

102行目のコードは、Wordのファイルを保存するコードです。

105行目のコードは、Wordのファイルを閉じるコードです。

108行目のコードは、Wordを終了する(閉じる)コードです。

動作確認

今回は以下のExcelファイルを用意しました。

「top」というシートのほかに、点数表がある「1月」「2月」「3月」のシートがあります。

A2の黄色のセルに「1月」「2月」「3月」のいずれかを入力して出力ボタンをクリックすると、Wordファイルにシートの点数表が出力されて保存されます。

また、今回は以下のWordファイルを用意しました。

Wordファイルには1行の表と、その上下に適当な文章が記述されています。

【ケース①】シート「1月」の表をWordファイルに出力

マクロ実行前

A2の黄色に「1月」を入力して実行ボタンをクリックします。

なお、「1月」のシートの表は下のとおりです。

マクロ実行後

マクロ実行後にWordファイルを開くと、「1月」のシートの表がWordのファイルに出力されていることが確認できました。

【ケース②】シート「2月」の表をWordファイルに出力

マクロ実行前

A2の黄色に「2月」を入力して実行ボタンをクリックします。

なお、「2月」のシートの表は下のとおりです。

マクロ実行後

マクロ実行後にWordファイルを開くと、「2月」のシートの表がWordのファイルに出力されていることが確認できました。

【ケース③】シート「3月」の表をWordファイルに出力

マクロ実行前

A2の黄色に「3月」を入力して実行ボタンをクリックします。

なお、「3月」のシートの表は下のとおりです。

マクロ実行後

マクロ実行後にWordファイルを開くと、「3月」のシートの表がWordのファイルに出力されていることが確認できました。

最後に

この記事では、Wordのファイル内にある表にExcelの表の値を出力して保存する方法についてご説明しました。

Wordのファイル内にある表にExcelの表の値を出力して保存したい場合は本記事を参考にして頂けたら幸いです。

プログラミングのスキルを習得するなら

プログラミングのスキルを習得したい、今のスキルをもっと高めたい、そう考えているなら「プログラミングスクール」がおすすめです。

プログラミングのスキルの基礎を身につけるなら「TechAcademy」で1週間の無料体験があるので、これで「プログラミングの基礎」を学ぶのにおすすめですよ。

→ TechAcademyの「1週間 無料体験」はこちら