使用宏更改文本为 PH 时单词 table 列的背景颜色

Change background colour of column of word table when text is PH using a macro

我在开发一个宏来查看 word 文档并更改 table 中的背景颜色列时遇到了问题。

宏需要查看word文档中的每一个table,如果一个单元格有文本'PH'那么那个单元格的列需要改变背景颜色。

我已经有一段时间没有使用VB了。我也尝试了 cell.range 以及下面的 Selection.Find,但总是出现错误。

Private Sub Document_Open()

Dim Tbl As Table
Dim Cel As Cell
Dim Rw As Row
Dim Col As Columns

For Each Tbl In ActiveDocument.Tables
  Set Col = Tbl.Columns
  For Each c In Col

    With Selection.Find
     .Execute FindText:="Public Holiday"
     c.Shading.BackgroundPatternColorIndex = wdRed
    End With   
  Next
Next

End Sub

测试

Dim Tbl As Table
Dim i As Integer, j As Integer

For Each Tbl In ActiveDocument.Tables

    For j = 1 To Tbl.Columns.Count

        For i = 1 To Tbl.Rows.Count

            If InStr(1, Tbl.Cell(i, j).Range.Text, "PH") Then Tbl.Columns(j).Shading.BackgroundPatternColor = -738132122

        Next

    Next

Next

遍历每个单元格并检查它是否包含 "PH",如果是,则为该列着色。

以下对我有用,比循环 tables 和 table 单元格要快一些。

相反,它在整个文档中搜索 PH,然后检查找到的区域是否在 table 内。如果是,则该列被格式化。然后从下一个单元格再次开始搜索。请注意,我已将此代码设置为 "match case",以便它只获取 PH,而不是 ph 或任何其他变体。否则,它最终会识别诸如电话之类的词...

使用 table 列通常很棘手,因为 table 列可能 看起来 像是连续的,但事实并非如此。只有行是连续的(Word 从左到右,从上到下解析)。因此,除非选择了列,否则不可能逐列搜索,一个接一个。问题中代码的另一个问题是:它使用 Selection,但选择未更改为应搜索的内容。

Private Sub Document_Open()
    Dim rngFind As Word.Range
    Dim found As Boolean

    Set rngFind = ActiveDocument.content
    With rngFind.Find
        .ClearFormatting
        .Wrap = wdFindStop
        .Text = "PH"
        .MatchCase = True
        found = .Execute
        Do
            If found Then
                If rngFind.Information(wdWithInTable) Then
                    rngFind.Columns(1).Shading.BackgroundPatternColorIndex = wdRed
                    rngFind.MoveStart wdCell, 1
                Else
                    rngFind.Collapse wdCollapseEnd
                End If
            End If
            found = .Execute
        Loop While found
    End With
End Sub