目次
経緯
Wordには、Excelのように「A1」や「F6」といったセルアドレスの概念がありません。
そのため、Wordのテーブル内の特定位置にあるデータを取り出し、それをExcelの中で検索する方法を調べてみました。
結果として、Wordのテーブルの位置を (行,列)
で指定し、取得した値を InStr()
関数でExcel内のデータと照合することで、目的を達成できました。
今回やりたいこと
- Wordのテーブル(2,2) にある値を取得
- その値がExcelの1行目・A列〜Z列のどこかに含まれているかを調べる
- 含まれているセルのアドレスをメッセージボックスで表示する
使用するVBAコード(Word側)
以下が実際に使用したコードです。Wordのマクロとして実行します。
Sub SearchExcelFromWord()
Dim xlApp As Object
Dim xlBook As Object
Dim xlSheet As Object
Dim folderPath As String
Dim fileName As String
Dim searchValue As String
Dim cell As Object
Dim found As Boolean
Dim doc As Document
Dim tbl As Table
Dim col As Integer
Set doc = ActiveDocument
Set tbl = doc.Tables(1)
' (2,2)のセルのテキストを取得し、改行や末尾文字を除去
searchValue = tbl.Cell(2, 2).Range.Text
searchValue = Replace(searchValue, vbCr, "")
searchValue = Left(searchValue, Len(searchValue) - 1)
Set xlApp = CreateObject("Excel.Application")
folderPath = "C:\Users\mori\デスクトップ\"
fileName = Dir(folderPath & "*.xlsx")
If fileName = "" Then
MsgBox "フォルダ内にExcelファイルが見つかりませんでした。"
Exit Sub
End If
Set xlBook = xlApp.Workbooks.Open(folderPath & fileName)
Set xlSheet = xlBook.Sheets(1)
found = False
For col = 1 To 26
If InStr(1, xlSheet.Cells(1, col).Value, searchValue) > 0 Then
MsgBox "Found at " & xlSheet.Cells(1, col).Address(0, 0)
found = True
Exit For
End If
Next col
If Not found Then
MsgBox "Value not found"
End If
xlBook.Close SaveChanges:=False
xlApp.Quit
Set xlSheet = Nothing
Set xlBook = Nothing
Set xlApp = Nothing
Set tbl = Nothing
Set doc = Nothing
End Sub
補足:このコードのポイント
tbl.Cell(2,2).Range.Text
でWordのテーブルからセル値を取得しますInStr()
関数を使い、Excel側のセル値に対して「部分一致」で検索を行っています- 値の末尾に付く改行や制御文字を削除しておかないと、比較が失敗します
応用可能なシーン
- WordにあるデータとExcelマスタを突き合わせて存在チェックをしたいとき
- Wordに入力されたIDやコードを使って関連データを抽出したいとき
- Wordをフロント、Excelをデータベースのように使いたいとき
まとめ
Wordのテーブルの値を取得し、Excel内で検索するには、座標指定(Cell(row, col))+ 文字列操作 + InStr()関数が有効です。
このようにVBAを組み合わせることで、異なるOfficeアプリ間の連携が可能となります。
実務でも十分に活用できる内容ですので、ぜひ試してみてください。
最後までお読みいただきありがとうございました。