使用宏更改文本为 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
我在开发一个宏来查看 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