如果单元格为空,Word宏将从表中删除行

时间:2018-11-15 16:19:51

标签: vba ms-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列为空的行。 谢谢

2 个答案:

答案 0 :(得分:0)

使用列中的所有单元格是一个问题,因为无法为列设置RangeRange必须是文档中连续的一组字符。尽管一列看上去是连续的,但在幕后实际上却不是。表格的字符从左上到右,从上到下(行)。

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

下面的代码示例演示了如何“循环行”-类似于问题中的代码使用的内容。此处的关键是将Table.Cells用于循环,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

答案 1 :(得分:0)

下面的代码用于邮件合并后的“每个页面” [我使用了嵌套循环(一个用于[TABLE],另一个用于空[CELLS])

所有代码[尊重:辛迪·梅斯特]

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

       For Each tbl In ActiveDocument.Tables
       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
       Next
  End Sub