在表

时间:2015-12-27 13:59:00

标签: vba find selection word-vba

我需要计算表格列中特定样式的出现次数。我的程序在整个文档中查找出现次数,而不是仅在选择中出现。

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

1 个答案:

答案 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位于同一个单元格中。