首页 > 解决方案 > 使用宏更改文本为 PH 时单词表列的背景颜色

问题描述

我在开发宏以查看 word 文档并更改表格中的背景颜色列时遇到了麻烦。

宏需要查看 word 文档中的每个表格,如果单元格包含文本“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

标签: vbams-wordword-table

解决方案


以下对我有用,并且比循环表格和表格单元格要快一些。

相反,它会在整个文档中搜索PH,然后检查找到的区域是否在表格内。如果是,则该列被格式化。然后从下一个单元格重新开始搜索。请注意,我已将此代码设置为“匹配大小写”,以便它仅获取 PH,而不是 ph 或任何其他变体。否则,它最终会识别出诸如电话之类的单词……

使用表格列通常很棘手,因为表格列可能看起来像是连续的,但事实并非如此。只有行是连续的(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

推荐阅读