【ExcelVBA】Wordのファイル内にある表にCSVファイルのデータを出力して保存するには

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

【動画】Wordのファイル内にある表にCSVファイルのデータを出力して保存する実際の動き

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


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

検索して見つかったら、その(Wordの)表に、CSVファイルのデータを出力します。

マクロ作成の流れ

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

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

CSVファイル

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

項目名とデータが20行存在しているCSVファイルです。

Wordファイル

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

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

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

マクロを実行すると以下のとおりに、Wordファイルにある表に、CSVファイルのデータがWordファイルに出力されます。

コードの例

Option Explicit

Private Sub btn_exec_Click()
    
    Dim CsvFileName As String       'CSVファイルのフルパス用変数
    Dim csvDataCnt  As Long         'CSVファイルのデータ行カウンタ用変数
    Dim ws          As Worksheet    'ワークシート変数
    Dim WordApp     As Object       'Wordアプリケーションインスタンス用変数
    Dim WordDoc     As Object       'Wordファイル用変数
    Dim tblCnt      As Long         'Wordの表の数用カウンタ
    Dim wdTable     As Object       'Wordの表用変数
    Dim DataLine    As String       'CSVファイルのデータを格納する変数
    Dim DataArray   As Variant      '取得したCSVデータを「,」で区切って配列DataArrayに格納する
    Dim tblCCnt     As Long         'Wordの表の列数用カウンタ
    
    'Wordファイルの表から検索する文字列を取得する
    Const wdFndStr  As String = "項番"
    
    'CSVファイルのフルパスを取得する
    CsvFileName = ThisWorkbook.Path & "\data.csv"
        
    'CSVファイルのデータ行カウンタ用変数を初期化する
    csvDataCnt = 1
    
    'Wordファイルにデータを出力するシートを取得する
    Set ws = Worksheets("top")
    
    'Wordアプリケーション用インスタンスを生成する
    Set WordApp = CreateObject("Word.Application")
    
    'Wordを表示しない
    WordApp.Visible = False
    
    'Wordファイルを開く
    Set WordDoc = WordApp.Documents.Open(ThisWorkbook.Path & "\0294.docx")
    
    'CSVファイルを開く
    Open CsvFileName For Input As #1

    '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 = True
            
            '検索をWordファイルの最後まで行う
            .Wrap = 1
            
            '検索を実行する
            .Execute
            
            If .Found = True Then
            
                '表が見つかった場合
                
                '見つかった表を変数wdTableに格納する
                Set wdTable = WordDoc.Tables(tblCnt)

                'CSVファイルの終端まで読み込むためのDoループ(終端まで達したらループを抜ける)
                Do Until EOF(1)
                
                    'CSVファイルのデータを1行取得して変数DataLineに格納する
                    Line Input #1, DataLine
                
                    If csvDataCnt > 1 Then
                    
                        '取得したCSVファイルデータが1行目以降の場合
                
                        '取得したCSVデータを「,」で区切って配列DataArrayに格納する
                        DataArray = Split(DataLine, ",")
                        
                        'Wordファイルの表に行を追加する
                        wdTable.Rows.Add
                                                    
                        'Wordファイルの表の行をコピーした時に、コピー元の塗りつぶしもコピーされてしまうので、各書式設定を解除する
                        'セルの背景を自動色にする(色なし)
                        wdTable.Rows(csvDataCnt).Range.Shading.BackgroundPatternColor = wdColorAutomatic
                        
                        '文字の色を自動色にする(黒)
                        wdTable.Rows(csvDataCnt).Range.Font.Color = wdColorAutomatic
                        
                        '文字の太さを標準にする
                        wdTable.Rows(csvDataCnt).Range.Font.Bold = False
                        
                        '配列DataArrayの要素数分処理を繰り返すFor文
                        For tblCCnt = 1 To UBound(DataArray) + 1
                        
                            'Wordファイルの表に、CSVファイルのデータを出力する
                            wdTable.Cell(csvDataCnt, tblCCnt).Range.Text = DataArray(tblCCnt - 1)
                            
                        Next tblCCnt
                                                
                    End If
                    
                    csvDataCnt = csvDataCnt + 1
                    
                Loop
                                
            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

注目すべきコード①

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

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

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

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

注目すべきコード②

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

    'CSVファイルのフルパスを取得する
    CsvFileName = ThisWorkbook.Path & "\data.csv"

コードの説明

以上のコードは、CSVファイルのフルパスを取得しているコードです。

注目すべきコード③

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

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

コードの説明

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

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

今回はWordファイルを開いたりCSVファイルのデータをWordファイルに書き込んだり、Word自体を終了させるなどの操作を行うのに使います。

注目すべきコード④

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

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

コードの説明

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

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

注目すべきコード⑤

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

    'Wordファイルを開く
    Set WordDoc = WordApp.Documents.Open(ThisWorkbook.Path & "\0294.docx")

コードの説明

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

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

注目すべきコード⑥

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

    'CSVファイルを開く
    Open CsvFileName For Input As #1

コードの説明

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

注目すべきコード⑦

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

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

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

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

.Text

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

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

.Forward

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

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

.Format

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

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

.Wrap

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

注目すべきコード⑧

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

            '検索を実行する
            .Execute

コードの説明

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

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

注目すべきコード⑨

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

            If .Found = True Then
            
                '表が見つかった場合
                
                '見つかった表を変数wdTableに格納する
                Set wdTable = WordDoc.Tables(tblCnt)

                'CSVファイルの終端まで読み込むためのDoループ(終端まで達したらループを抜ける)
                Do Until EOF(1)
                
                    'CSVファイルのデータを1行取得して変数DataLineに格納する
                    Line Input #1, DataLine
                
                    If csvDataCnt > 1 Then
                    
                        '取得したCSVファイルデータが1行目以降の場合
                
                        '取得したCSVデータを「,」で区切って配列DataArrayに格納する
                        DataArray = Split(DataLine, ",")
                        
                        'Wordファイルの表に行を追加する
                        wdTable.Rows.Add
                                                    
                        'Wordファイルの表の行をコピーした時に、コピー元の塗りつぶしもコピーされてしまうので、各書式設定を解除する
                        'セルの背景を自動色にする(色なし)
                        wdTable.Rows(csvDataCnt).Range.Shading.BackgroundPatternColor = wdColorAutomatic
                        
                        '文字の色を自動色にする(黒)
                        wdTable.Rows(csvDataCnt).Range.Font.Color = wdColorAutomatic
                        
                        '文字の太さを標準にする
                        wdTable.Rows(csvDataCnt).Range.Font.Bold = False
                        
                        '配列DataArrayの要素数分処理を繰り返すFor文
                        For tblCCnt = 1 To UBound(DataArray) + 1
                        
                            'Wordファイルの表に、CSVファイルのデータを出力する
                            wdTable.Cell(csvDataCnt, tblCCnt).Range.Text = DataArray(tblCCnt - 1)
                            
                        Next tblCCnt
                                                
                    End If
                    
                    csvDataCnt = csvDataCnt + 1
                    
                Loop
                                
            End If

コードの説明

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

コードの詳細

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

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

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

68行目のコードは、CSVファイルの終端まで読み込むためのDo文です。

終端まで達したらループを抜けます。

72行目のコードでは、CSVファイルのデータを1行取得して変数DataLineに格納します。

74行目のコードは、取得したCSVファイルデータが1行目以降かどうかを判定するIFです。

Wordファイルの表に出力したいのはCSVファイルの2行目以降のデータ部分です。

CSVファイルの1行目は項目名が存在しているので、この1行目は対象外にするためこのIFで判定しています。

79行目のコードでは、取得したCSVデータを「,」で区切って配列DataArrayに格納します。

82行目のコードでは、表に行を追加します。

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

95行目のコードは、配列DataArrayの要素数分処理を繰り返すFor文です。

98行目のコードでは、Wordの表に、CSVファイルのデータを出力します。

注目すべきコード⑩

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

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

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

コードの詳細

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

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

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

動作確認

CSVファイルとWordファイルの例」をご覧ください。

最後に

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

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

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

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

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

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