删除空列的宏将删除所有列,而不考虑内容

时间:2014-12-19 15:16:34

标签: vba ms-word ms-office word-vba

如何告诉我的宏只删除没有数据的列,从第二行读取。

我的情况:

我从外部工具生成报告,然后根据表格中的标记进行填充。我关心的有三列:"名称",总是填充,"年龄",有时是空的"输出"这通常是空的(我还没有发布视觉支持图片的声誉)。

我的宏目前删除了"输出"和"年龄"列,无论字段中是否有数据。

目前形式的宏:

Sub ColumnDelete()
    Dim Tbl As Table, cel As Cell, i As Long, fEmpty As Boolean
    With ActiveDocument
        For Each Tbl In .Tables
            For i = Tbl.Columns.Count To 1 Step -1
                fEmpty = False
                For Each cel In Tbl.Columns(i).Cells
                    If cel.Range.Text = "Output" & Chr(13) & Chr(7) Then
                        fEmpty = True
                    End If
                    If cel.Range.Text = "Age" & Chr(13) & Chr(7) Then
                        fEmpty = True
                    End If
                Exit For
                Next cel
                If fEmpty = True Then Tbl.Columns(i).Delete
            Next i
        Next Tbl
    End With
    Set cel = Nothing: Set Tbl = Nothing
End Sub

我认为结合"输出"并且空表字符可以工作,但实际上看起来我错了。删除"输出"从脚本中导致完全没有动作。 e.g。

If cel.Range.Text = Chr(13) & Chr(7) Then

结合两者"输出"和"年龄"在一个"如果"循环导致" 13"错误。

1 个答案:

答案 0 :(得分:0)

此代码将通过表查找,然后检查列以查看是否有任何值在除第一行之外的任何行中。如果未找到任何内容,则该列将被删除。

Option Explicit
Sub ColumnDelete()
    Dim Tbl As Table, cel As Cell, i As Long, fEmpty As Boolean

    With ActiveDocument
        For Each Tbl In .Tables
            'Debug.Print "--------------------------"
            For i = Tbl.Columns.Count To 1 Step -1
                'Debug.Print "Col: " & i
                fEmpty = True
                For Each cel In Tbl.Columns(i).Cells
                    'Debug.Print cel.Range.Text
                    If (cel.Range.Text <> Chr(13) & Chr(7)) And cel.Row.Index > 1 Then
                        fEmpty = False
                    End If
                'Exit For
                Next cel
                If fEmpty = True Then
                    'Debug.Print "Delete Col: " & i
                    Tbl.Columns(i).Delete
                End If
            Next i
        Next Tbl
    End With
    Set cel = Nothing: Set Tbl = Nothing
 End Sub