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