我需要计算表格列中特定样式的出现次数。我的程序在整个文档中查找出现次数,而不是仅在选择中出现。
Sub Find()
Selection.Tables(1).Columns(1).Select
With Selection.Find
.Style = "Style2"
iCount = 0
While .Execute
iCount = iCount + 1
Wend
MsgBox (iCount)
End With
End Sub
答案 0 :(得分:0)
在表格中执行查找是一个棘手的主张,因为查找有一个令人讨厌的倾向于"反弹"在一个细胞内。当我测试你的代码,没有关于如何在表格单元格中应用样式的信息时,宏进入循环并且没有停止直到我强制它。所以我对你的代码工作有点惊讶......
在列上执行查找的问题在于,在文档的基础结构中,列不是连续的字符集,就像它在屏幕上显示的那样。 Word表信息在单元格中从上到下运行,从左到右在一行中运行,然后到下一行并重复。列选择是由Word应用程序维护的错觉。因此,基于选择或范围的宏代码不能遵循适用的通常规则。
以下对我有用。本质上,它在整个表内搜索,但当它到达不在指定列中的单元格时,目标范围将移动到列中的下一个单元格,并再次运行搜索。只有"命中"列中的内部单元格被计算在内。
Sub FindStyleInstanceInTableColumn()
Dim iCount As Long, iCellCount As Long, iCounter As Long
Dim cel As word.Cell
Dim col As word.Column
Dim rngFind As word.Range, rngCel As word.Range
Dim bFound As Boolean
Set col = Selection.Tables(1).Columns(1)
iCount = 0
iCellCount = col.Cells.Count
iCounter = 1
Set rngCel = col.Cells(iCounter).Range
Set rngFind = rngCel.Duplicate
'Don't include end-of-cell marker
rngFind.MoveEnd wdCharacter, -1
rngFind.Select 'For debugging
With rngFind.Find
.Style = "Style2"
bFound = .Execute(wrap:=wdFindStop)
Do
rngFind.Select 'For debugging
If bFound Then
'If the found range is within a column cell
'then increase the counter
If rngFind.InRange(rngCel) Then
iCount = iCount + 1
'If the found range is not in a column cell
'then the style wasn't found in the cell so
'go to the next cell
ElseIf iCounter < iCellCount Then
iCounter = iCounter + 1
Set rngCel = col.Cells(iCounter).Range
rngFind.Start = rngCel.Start
rngFind.End = rngCel.Start
End If
rngFind.Collapse wdCollapseEnd
End If
bFound = .Execute(Format:=True, wrap:=wdFindStop)
Loop Until iCounter = iCellCount And Not bFound
End With
MsgBox (iCount)
End Sub
编辑:调整代码以考虑第一个单元格中没有命中并且在列的最后一个单元格中命中。不同之处在于确保rngFind的起点与rngCel位于同一个单元格中。