この記事では、Wordのファイル内にある表にCSVファイルのデータを出力して保存する方法についてご説明します。
【動画】Wordのファイル内にある表にCSVファイルのデータを出力して保存する実際の動き
本題に入る前に、まずは次の動画をご覧ください。
ExcelのマクロがWordのファイルを開き、Excelの表の値を出力したい(Wordの)表を検索します。
検索して見つかったら、その(Wordの)表に、CSVファイルのデータを出力します。
マクロ作成の流れ
表内にある文字列で表があるかを特定します。
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週間の無料体験があるので、これで「プログラミングの基礎」を学ぶのにおすすめですよ。