業務効率化に役立つVBA/マクロのさまざまなTipsをコード例を交えて紹介していきます。今回は、Wordの「表」を表すTableオブジェクトを参照、コピーしてのExcelのシート上に貼り付ける方法を紹介する。
今回はWordで作成された表をExcelに取り込む方法を解説する。Tips「Excelの表をWordに貼り付ける方法とWordのテキストをExcelのセルに埋め込む方法」で「Excelのデータ(表)をWordに取り込む」方法を解説しているが、その逆だ。
今回はあらかじめWordで図1のような表を作成し、任意のフォルダに「役職表.docx」として保存しておく。筆者の場合は「K:\Excel_Word_VBA_Tips\役職表.docx」として保存している文書を使用する。
「Excel_Word連携VBA.xlsm」をダブルクリックしてExcelを起動し、「Wordの表をExcelに読み込む」という新しいシートを作成する。そのシートの中に図2のような「Wordの表を読み込む」ボタンを作成しておく。
「ボタン」は、Excelメニューの「挿入」→「図形」と選択して、「角丸四角形」を配置し、これを選択して、マウスの右クリックで表示されるメニューから、「テキストの編集」を選択して、「Wordに書き出す」と指定する。
「フォント」には「Meiryo UI」、「フォントサイズ」には「14」、「フォント太さ」には「太字」、「文字位置」には「中央揃え」を指定しておく。
筆者の場合は、ボタンに「図形」の「角丸四角形」を使用していたのだが、必ずしもこの「角丸四角形」を「ボタン」として使用しなければならないわけではない。Excelメニューの「開発」項目の中に「挿入」という項目があり、「▼」アイコンをクリックすると、図3のように「フォームコントロール」が表示される。この中にある「ボタン」を使ってマクロと関連付けても問題はない。一度使って試してみるといいだろう。
次に、Excelメニューの「開発」メニューをクリックして、左端に表示される「Visual Basic」を選択してVBE(Visual Basic Editor)を起動する。
プロジェクト内に既にModule1が追加されているので、この中にリスト1のコードを記述する。
Sub Wordの表をExcelに読み込む() Dim myWord As New Word.Application Dim myWordDoc As Word.Document Dim myData As String Dim 行 As Integer Dim 列 As Integer Set myWordDoc = myWord.Documents.Open("K:\Excel_Word_VBA_Tips\役職表.docx") With myWordDoc.Tables(1) For 行 = 1 To .Rows.Count For 列 = 1 To .Columns.Count myData = Replace(.Cell(行, 列).Range.Text, Chr(7), "") If IsNumeric(myData) = True Then Cells(行, 列).Value = CLng(myData) Else Cells(行, 列).Value = myData End If Next Next End With myWordDoc.Close Set myWordDoc = Nothing myWord.Quit Set myWord = Nothing Range("A1:C1").Interior.ColorIndex = 15 Range("A1:C6").Borders.LineStyle = xlContinuous Range("A1:C6").Font.Name = "Meiryo UI" Range("A1:C6").Font.Size = 12 End Sub
以降、コードの中身を解説する。
Word.Applicationの新しいインスタンスmyWord、Word.Document型の変数myWordDocを宣言する(2〜3行目)。
文字列型の変数myDataを宣言し、Integer型の「行」と「列」という変数を宣言しておく(4〜6行目)。
Documents.Openメソッドで任意のフォルダにある「役職表.docx」を開く(7行目)。
WordのTablesコレクションはWordの「表」を表すオブジェクト「Table」の集まりだ。その1つに対して10〜19行目の処理を行う。
Wordの表の行の数だけ繰り返しながら、さらにWordの表の列の個数だけ繰り返す2重のループ処理処理を行う。その中で行うのは、12〜17行目の処理だ。
変数myDataには、Replace関数で、「改行」の文字列(「Chr(7)」で取得できる)を空白に置換した値を格納する(12行目)。
Wordの表のテキストには「改行」がくっついていて、何もしないとTextプロパティで値を取得した際に、末尾に文字化けして「・」のようなものが表示される(図4)。これを削除するためにVBAの「Chr」関数を使っている。
変数myDataの値が数値なら(13行目)、CLng関数でLong型に変換したmyDataの値をExcelの各セルに表示し(14行目)、そうでない場合は(15行目)、単にmyDataが格納している文字列型のデータをExcelの各セルに表示する(16行目)。
22〜25行目では、myWordDocオブジェクトを閉じ、全ての関連付けから解放する。またmyWordオブジェクを終了し、全ての関連付けから解放している。
最後に27〜30行目で、Excel内に表示された表に書式を設定し、Wordの表と同じ見た目にしている。
リスト1を図2のボタンに関連付け実行すると、Excelの「Wordの表をExcelに読み込む」シート内にWordの表が読み込まれる(図5)。
以前も書いたが、必ず「役職名.docx」は開いた状態にしておかないよう注意してほしい。
Wordの表をExcelに読み込む場面は多いことだろう。このサンプルを参考にして、各自がいろいろアレンジし、自分なりの使い勝手の良いVBAアプリを作っていただけるとうれしい限りだ。
薬師寺国安事務所代表。Visual Basicプログラミングと、マイクロソフト系の技術をテーマとした、書籍や記事の執筆を行う。
1950年生まれ。事務系のサラリーマンだった40歳から趣味でプログラミングを始め、1996年より独学でActiveXに取り組む。
1997年に薬師寺聖とコラボレーション・ユニット「PROJECT KySS」を結成。
2003年よりフリーになり、PROJECT KySSの活動に本格的に参加。.NETやRIAに関する書籍や記事を多数執筆する傍ら、受託案件のプログラミングも手掛ける。
Windows Phoneアプリ開発を経て、現在はWindowsストアアプリを多数公開中。
Microsoft MVP for Development Platforms - Client App Dev (Oct 2003-Sep 2012)。
Microsoft MVP for Development Platforms - Windows Phone Development(Oct 2012-Sep 2013)。
Microsoft MVP for Development Platforms - Client Development(Oct 2013-Sep 2014)。
Microsoft MVP for Development Platforms - Windows Platform Development (Oct 2014-Sep 2015)。
Copyright © ITmedia, Inc. All Rights Reserved.