Excel 基于列标题值跨多个工作表删除列

Excel 基于列标题值跨多个工作表删除列,excel,vba,Excel,Vba,我有一些VBA代码,可以很好地删除单个工作表中的任何列,其中任何列的标题都是“FALSE”值。但是,当我在同一个子系统中重复代码以在不同的工作表上生效时,我会收到一个编译错误警报(当前范围中的重复声明)。有谁能建议我如何在多个工作表(即“结果总结”表和“施工方案评估”表以及其他工作表)中进行以下摘录?另外,请注意,每张纸在lColumn范围内有不同的列数 Sub DeleteColumns() With Sheets("Outcome Summary") .Select Dim lColumn

我有一些VBA代码,可以很好地删除单个工作表中的任何列,其中任何列的标题都是“FALSE”值。但是,当我在同一个子系统中重复代码以在不同的工作表上生效时,我会收到一个编译错误警报(当前范围中的重复声明)。有谁能建议我如何在多个工作表(即“结果总结”表和“施工方案评估”表以及其他工作表)中进行以下摘录?另外,请注意,每张纸在lColumn范围内有不同的列数

Sub DeleteColumns()

With Sheets("Outcome Summary")
.Select
Dim lColumn As Long
Dim iCntr As Long
lColumn = 108
For iCntr = lColumn To 1 Step -1
If Cells(1, iCntr) = False Then
Columns(iCntr).Delete
End If
Next

With Sheets("Method Statement Evaluation")
.Select
Dim lColumn As Long
Dim iCntr As Long
lColumn = 156
For iCntr = lColumn To 1 Step -1
If Cells(1, iCntr) = False Then
Columns(iCntr).Delete
End If
Next
End With

End Sub

并使用循环缩短代码

这结合了BigBen关于查找最后使用的列(基于第1行)的观点,以防它在不同的工作表中有所不同

Sub DeleteColumns()

Dim ws As Worksheet

For Each ws In Worksheets
    Select Case ws.Name
        Case "Outcome Summary", "Method Statement Evaluation" 'affected sheets
            Dim lColumn As Long
            Dim iCntr As Long
            lColumn = ws.Cells(1, Columns.Count).End(xlToLeft).Column + 1
            For iCntr = lColumn To 1 Step -1
                If ws.Cells(1, iCntr) = False Then
                    ws.Columns(iCntr).Delete
                End If
            Next
    End Select
Next ws

End Sub

谢谢@SLR和@BigBen。为了进一步扩展这一点,以便我还可以删除已标识的行(除了已标识的列),我对您的示例进行了如下调整,并且所有操作都很好:

Sub DeleteRowsAndColumns()

Dim ws As Worksheet

For Each ws In Worksheets
    Select Case ws.Name
        Case "Outcome Summary", "Method Statement Evaluation" 'affected sheets
            Dim lColumn As Long
            Dim lRow As Long
            Dim iCntr As Long

            'This section deletes columns
            lColumn = ws.Cells(1, Columns.Count).End(xlToLeft).Column + 1
            For iCntr = lColumn To 1 Step -1
                If ws.Cells(1, iCntr) = False Then
                    ws.Columns(iCntr).Delete
                End If
            Next
            'this section deletes rows
            lRow = ws.Cells(Rows.Count, 1).End(xlUp).Row + 1
            For iCntr = lRow To 1 Step -1
                If ws.Cells(iCntr, 1) = False Then
                    ws.Rows(iCntr).Delete
                End If
            Next
    End Select
Next ws

End Sub

再次感谢。

同一变量声明了两次。你不能那样做。删除每个人的第二个。如此接近Excel金牌徽章和20k代表@非常感谢。这是一种享受。您知道我如何扩展它,以便在列出的各种受影响的工作表中删除A列中标记为FALSE的任何行吗?我很乐意。你必须做同样的事情,除了向后循环A列。或者更快的方法是使用自动筛选。