Word (VBA)

Word VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Home : Word 2007)
FINDで取得した文字列が含まれる表のセルの値を判断したい。
投稿日時: 19/04/12 16:50:44
投稿者: WinArrow
投稿者のウェブサイトに移動

文書の中に表が複数存在します。
特定文字列を指定して、表ごとにFINDを実行します。
 
表のセルの中の文字列は、あいまい検索的にヒットするので、
全桁一致するか判断するアドバイスをお願いします。
現在のコードは、以下です。
 
 

Sub findText()
Dim Tbx As Long, Doc As Document, RX As Long, myData As String
Dim Ret As Boolean

    Set Doc = ThisDocument

    For Tbx = 1 To Doc.Tables.Count
'        Doc.Tables(Tbx).Select
        Doc.Tables(Tbx).Columns(2).Select
        With Selection.Find
            .Text = "町会費"
            .MatchFuzzy = False
            Do
                Ret = .Execute
                If Ret Then
                    If Selection.Range.InRange(Selection.Range) Then
                        Selection.Range.Font.Color = vbRed
                        Selection.Range.Font.Bold = True
                    End If
                End If
            Loop Until Ret = False
        End With
    Next
 
End Sub


 
検索指定文字列:「町会費」にはヒットするのですが、
「特別町会費」にもヒットしてしまいます。
もう一つは、
セルの文字列が「町会費、協力費」など、「、」で区切って複数入っている場合もあるので、
セルの中の文字列を取得して、分解して照合したいと考えています。
 
よって、FINDでヒットした文字列が入っているセルの値を取得する方法が
知りたいです。
 
よろしくお願いします。
 
 
 
 
 
 

回答
投稿日時: 19/04/12 18:21:40
投稿者: sk

引用:
検索指定文字列:「町会費」にはヒットするのですが、
「特別町会費」にもヒットしてしまいます。

あるセルのテキストが
「今月分の町会費と特別町会費を払って下さい。」
だった場合はどうなさりたいのでしょうか。
 
「今月分の町会費と特別町会費を払って下さい。」
ではなく
「今月分の町会費と特別町会費を払って下さい。」
という結果になるようにしたい、ということであれば、
少なくとも「町会費」と「特別町会費」を
独立した 1 つの単語として解釈させることが
出来ない限りは無理だと思いますが。

投稿日時: 19/04/12 18:32:17
投稿者: WinArrow
投稿者のウェブサイトに移動

sk さん、レス、ありがとうございます。
 
セルには、文章形式ではなく
2列目だけを検索対象としていて、
2番目のセルには、「町会費」
4番目のセルには、「特別町会費」
6番目のセルには、「町会費、協力費」
のような形でデータが入っています。
 
検索文字列:「町会費」なので
「、」で分解して、「町会費」と合致するセルに色を設定したいという処理です。
セルの場所、または、セルに入っている文字列が
取得できれば、分解〜色付けはできると考えています。
 

回答
投稿日時: 19/04/13 01:47:22
投稿者: sk

引用:
セルには、文章形式ではなく
2列目だけを検索対象としていて、
2番目のセルには、「町会費」
4番目のセルには、「特別町会費」
6番目のセルには、「町会費、協力費」
のような形でデータが入っています。

引用:
検索文字列:「町会費」なので
「、」で分解して、「町会費」と合致するセルに色を設定したいという処理です。

強調したいのが「セル内に含まれている検索文字列」なのか
「検索文字列を含むセル全体(背景色、テキストの色など)」なのか
いまいちはっきりしませんが、
 
(標準モジュール)
-------------------------------------------------------------
Sub FindTextInTable()
 
    Dim wrdDoc As Word.Document
    Dim wrdTable As Word.Table
    Dim wrdColumn As Word.Column
    Dim wrdCell As Word.Cell
     
    Set wrdDoc = ThisDocument
 
    For Each wrdTable In wrdDoc.Tables
        With wrdTable.Range
            .Font.ColorIndex = wdAuto
            .Font.Bold = False
        End With
        Set wrdColumn = wrdTable.Columns(2)
        For Each wrdCell In wrdColumn.Cells
            Call FindTextInCell(wrdCell, "町会費")
        Next
        Set wrdColumn = Nothing
    Next
 
    Set wrdDoc = Nothing
 
End Sub
 
Private Sub FindTextInCell(Cell As Word.Cell, _
                           Keyword As String)
     
    Const Delimiter As String = "、"
     
    Dim wrdRange As Word.Range
 
    Dim varArray As Variant
    Dim varItem As Variant
    Dim lngStart As Long
    
    If Keyword = "" Then
        Exit Sub
    End If
     
    With Cell.Range
        .End = .End - 1
        If .Text = "" Then
            Exit Sub
        End If
        lngStart = .Start
        varArray = Split(.Text, Delimiter, -1, vbTextCompare)
        For Each varItem In varArray
            If varItem <> "" Then
                If varItem = Keyword Then
                    .Start = lngStart
                    .End = .Start + Len(varItem)
                    .Font.ColorIndex = wdRed
                    .Font.Bold = True
                End If
            End If
            lngStart = lngStart + Len(varItem) + Len(Delimiter)
        Next
    End With
 
End Sub
-------------------------------------------------------------
 
以上のような処理が実行できればよい、ということでしょうか。

投稿日時: 19/04/13 17:58:57
投稿者: WinArrow
投稿者のウェブサイトに移動

sk さん、素晴らしいコードをありがとうございました。
 
期待通りの結果が得られました。
 
 
 
 
当初、
FINDを使わずに、表のセルを1つづつチェックして、
検索文字列を抽出するまではできたのですが、
文字列に色設定するところがよくわからなくて、
FINDを使えば、セルの中の合致した文字列だけが色が設定できるので、
FINDで合致したセルの位置を取得する・・・・という質問した次第でした。
 
「.Start」と「.End」を使えばよかったのですね
 
WordVBAは知らないことばかり & ExcelVBAとは勝手が違う
もっと勉強します。
 
 
これで、閉じます。