業務効率化

エクセルVBAでワードから文字抽出

エクセル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

-業務効率化