エクセルVBAからワードの一ページ目を検索し、キーワードの次のパラグラフにある(キーワードの右にある)文字を取得する関数です。引数にワイルドカードを使用し、一ページ目のみを対象とすることで安定化と高速化しています。キーワードと抽出したい値が対になっている、表形式のファイルを想定しています。
コード
➤コードはこちら
Option Explicit
Function kensaku(検索値 As String)
'関数実行前に検索対象のワードファイルをDocument変数に格納してください。
'下記ではTokusaidocを変数としてすでに宣言し、格納済みの前提で記載しています。
Dim prg0 As Variant, prg As Long
Dim rng As Object
Dim firstSectionRange As Object
Dim startPos As Long
' 最初のセクションの範囲を取得
Set firstSectionRange = Tokusaidoc.Sections(1).Range
' 最初の段落を除外するために開始位置を調整
startPos = firstSectionRange.Paragraphs(1).Range.End
Set rng = Tokusaidoc.Range(startPos, firstSectionRange.End)
' 最初のセクション内で検索を実行
'Set rng = firstSectionRange.Duplicate ' 元の範囲を保護
With rng.Find
' ドキュメント全体の範囲を選択せず検索
'With doc.Selection(1).Range.Find
.text = 検索値
.MatchFuzzy = False
.MatchWildcards = True
If .Execute Then
' 検索結果が見つかった場合の処理
Set prg0 = Tokusaidoc.Range(.Parent.Start, .Parent.End)
prg0.Start = 0 ' 開始位置をドキュメントの先頭にリセット
prg = prg0.Paragraphs.Count
Else
' 検索結果が見つからなかった場合
prg = -1 ' 見つからなかった場合の返却値(任意で変更可能)
End If
End With
' 結果を返す
kensaku = prg
End Function
コード実行時は、エクセルの標準プロシージャにPublicか、同じモジュール内で関数実行前に、対象のワードファイルをDocument型変数にSetしてください。スクリプトでは、「Tokusaidoc」というワードが該当しています。
ポイント機能
・引数にキーワード指定し検索
・検索後取得数値の使用方法
引数にキーワード指定し検索
関数を使い、引数に入れた文字をワードから検索します。見つかった文字のワード内でのパラグラフ(絶対的な位置)を取得します。その後パラグラフに+1をすることで、表形式のワードから項目に記載された値を取得できます。

' 最初のセクションの範囲を取得Set firstSectionRange = doc.Sections(1).Range ここでは、ワード申請書の一ページ目を対象範囲としています。
' 最初の段落を除外するために開始位置を調整
startPos = firstSectionRange.Paragraphs(1).Range.End
Set rng = doc.Range(startPos, firstSectionRange.End)
doc.Content.Selectで文書全体を選択し、wd.Selection.Collapse wdCollapseStartにて選択解除+カーソル選択肢地をワード文書の一番初め=rangeでいう0の位置に移動させる方法もありますが、全体を選択するという処理によ処理速度が落ちます。その為、ワード一ページ目の範囲を直接指定し、検索をかけています。
その後、ワードで指定ワードを検索します。その際の関数が、Find関数です。下記は基本的なプロパティと設定です。

引数の検索文字を見つけたら、rangeをオブジェクト変数rng0に代入します。

該当文字のrangeをrng0に代入し、rng0.start = 0 を設定することで、変数のrangeを0から見つかった範囲までに設定します。
そこからrng0.paragraph.countとすることで見つかった検索文字の絶対的位置を取得できます。+1をすることでその右側にある値(取得したい値)を取得できます。
ワードに「氏 名」があれば、下記で取得できます。(ワードでは「氏 名」と隙間があるため、ワイルドカードを使用)。
' 氏名
pnt.Offset(, 4) = doc.Paragraphs(kensaku("氏*名") + 1).Range
検索後取得数値の使用方法
関数から検索ができた後の取得値は、引数に与えたキーワードのパラグラフとなります。ワードではエクセルとは異なり、文字列位置のプロパティが異なります。ワードで言うパラグラフはエクセルで言うRangeやCellsのように考えればよいです。
今回の関数で得られた値はパラグラフです。そのパラグラフから文字を取得するにはRangeを取得する必要があります。これにより、ワードのある段落位置にある値を取得することができます。
今回の関数はキーワードと抽出したい値が対になっている、表形式のファイルを想定しています。その為下記のような表から氏名を得たい場合は得られた値に+1をすることで値取得が可能です。(上述の通りTokusaidocをDocument変数として宣言済みの状態です)

氏名 = Tokusaidoc.Paragraphs(kensaku("氏*名*") + 1).Range
氏*名*をワードから検索し、見つかったパラグラフを取得します。そのパラグラフは次の列に移ると別の1加算されたパラグラフになるため、Paragraphs(kensaku("氏*名*") + 1).Rangeとすることでキーワードの対になっている値「●● ●●」を取得できます。
もし複数パラグラフの値を取得したい場合、rangeに最初と最後のパラグラフレンジを指定することで可能です。例えば、発行日から、氏名の間の値を取得する場合は下記のように記載します。これにより文章であっても抽出可能です。
発行日から氏名まで値 = Tokusaidoc.Range(Tokusaidoc.Paragraphs(kensaku("発*行*日") + 1).Range.Start, Tokusaidoc.Paragraphs(kensaku("氏*名*") - 4).Range.End).text