首页 > 解决方案 > 如果单元格为空,Word 宏从表中删除行

问题描述

我正在尝试运行一个宏,它将检查选定表中第 2 列中的空单元格,如果有空单元格,则删除该行。

Sub DeleteEmptyRows()
Set Tbl = Selected.Tables(1)
    With Tbl
        noOfCol = Tbl.Range.Rows(1).Cells.Count
        With .Range
            For i = .Cells.Count To 1 Step -1
                On Error Resume Next
                If Len(.Cells(i).Range) = 2 Then
                    .Rows(.Cells(i).RowIndex).Delete
                    j = i Mod noOfCol
                    If j = 0 Then j = noOfCol
                End If
            Next i
    End With
    End With

End Sub

它真的很接近我想要的,但我只是不确定如何在第 2 列中指定空单元格。我还尝试将 noOfCol 行更改为:

Selection.SetRange Selection.Tables(1).Rows(2).Cells(2).Range.Start, _
Selection.Tables(1).Rows.Last.Cells(2).Range.End

但这仍然会删除任何列为空的行。我需要它只删除第 2 列为空的行。谢谢

标签: vbams-word

解决方案


使用列中的所有单元格是一个问题,因为无法将 a 设置Range为列。ARange必须是文档中的连续字符集。虽然一列看起来是连续的,但在幕后它的内容实际上并不是。表格的字符从左上到右,从上到下(行)。

最接近的代码是选择列然后在Selection对象中工作。或循环行。

以下代码示例演示了如何“循环行” - 类似于问题中的代码使用的内容。这里的关键是使用Table.Cellsfor 循环,For计数器指定行索引,列号 (2) 指定列索引。

Sub ProcessColTwo()
    Dim tbl As Word.Table
    Dim nrRows As Long, ColToCheck As Long, i As Long
    Dim cellRange As Word.Range

    Set tbl = ActiveDocument.Tables(1)
    nrRows = tbl.Rows.Count
    ColToCheck = 2

    For i = nrRows To 1 Step -1
        Set cellRange = tbl.Cell(i, ColToCheck).Range
        If Len(cellRange.text) = 2 Then
            cellRange.Rows(1).Delete
        End If
    Next i
End Sub

这是演示使用的代码Selection

Sub ProcessColTwo()
    Dim tbl As Word.Table
    Dim ColToCheck As Long
    Dim cel As Word.Cell

    Set tbl = ActiveDocument.Tables(1)
    ColToCheck = 2
    tbl.Columns(ColToCheck).Select
    For Each cel In Selection.Cells
        If Len(cel.Range.text) = 2 Then
            cel.Range.Rows(1).Delete
        End If
    Next
End Sub

推荐阅读