宏 - 删除工作簿中多个工作表上的空白列(具有标题)

Macro - Delete blank columns (which have headers) on multiple worksheets within workbook

提问人:TigerLily 提问时间:11/17/2023 最后编辑:braXTigerLily 更新时间:11/20/2023 访问量:58

问:

请为相对新手提供帮助.....我正在寻找一种方法来删除单个工作簿中多个工作表中的所有空白列(有标题)。

我有一个代码(我没有写),可以删除活动工作表中的所有空白列,这工作正常。但是,我想要一种让此代码同时在多个工作表中工作的方法。我找不到任何东西:

Sub DeleteBlankColumns()
Dim i As Long
    Dim lnglastcolumn As Long
    Dim delrng As Range
    
    With ActiveSheet
        lnglastcolumn = .Cells(1, Columns.Count).End(xlToLeft).Column
        
        For i = 1 To lnglastcolumn
            If .Cells(.Rows.Count, i).End(xlUp).row = 1 Then
                If delrng Is Nothing Then
                    Set delrng = .Columns(i)
                Else
                    Set delrng = Union(delrng, .Columns(i))
                End If
            End If
        Next i
    End With
    
    delrng.Delete
End Sub

任何帮助非常感谢!

Excel VBA

评论

0赞 Paul 11/17/2023
代替 ,使用 ,后跟 。将 a 添加到其他 Dim 语句中,并在 .With ActivesheetFor Each ws in WorksheetsWith wsDim ws as WorksheetNextEnd Sub

答:

0赞 ipStack 11/17/2023 #1

使用 Sheets 对象:

Sub DeleteBlankColumns(curSheet As Worksheet)
    Dim i As Long
    Dim lnglastcolumn As Long
    Dim delrng As Range
    
    With curSheet
        lnglastcolumn = .Cells(1, Columns.Count).End(xlToLeft).Column
        
        For i = 1 To lnglastcolumn
            If .Cells(.Rows.Count, i).End(xlUp).Row = 1 Then
                If delrng Is Nothing Then
                    Set delrng = .Columns(i)
                Else
                    Set delrng = Union(delrng, .Columns(i))
                End If
            End If
        Next i
    End With
    
    If Not (delrng Is Nothing) Then
        delrng.Delete
    End If
End Sub

Sub Run()
    'DeleteBlankColumns Sheets("Sheet1")
    'DeleteBlankColumns Sheets("Sheet2")
    For Each sh In ActiveWorkbook.Worksheets
        DeleteBlankColumns Sheets(sh.Name)
    Next sh
End Sub

评论

0赞 TigerLily 11/17/2023
最后一部分“Run()”是否查找名称为“Sheet1”等的工作表?如果是这样,这可能是一个问题,因为额外工作表的名称是特定于客户端的,并且可能每个月都会更改。对不起,应该在我的请求中更清楚地说明这一点
0赞 ipStack 11/20/2023
这是一个示例,在运行函数中,您可以设置要处理的所有工作表名称。您可以创建一个遍历所有工作表的循环:您要处理哪些叶子?工作簿中的所有工作表?
0赞 TigerLily 11/20/2023
这将是工作簿中的所有工作表
0赞 ipStack 11/20/2023
添加一个“for each”循环...我改变了我的例子。
0赞 TigerLily 11/20/2023
了不起!这很有效,谢谢!不知道如何将其标记为旋转
0赞 FaneDuru 11/17/2023 #2

请尝试下一个改编的代码:

Sub DeleteEmptyColsInAllSheets()
 Dim wb As Workbook, sh As Worksheet, delRng As Range, lnglastcolumn As Long, i As Long
 Set wb = ActiveWorkbook ' use here the workbook you need

 For Each sh In wb.Worksheets
    With sh
        lnglastcolumn = .cells(1, Columns.count).End(xlToLeft).column
        
        For i = 1 To lnglastcolumn
            If .cells(.rows.count, i).End(xlUp).Row = 1 Then
                If delRng Is Nothing Then
                    Set delRng = .Columns(i)
                Else
                    Set delRng = Union(delRng, .Columns(i))
                End If
            End If
        Next i
    End With
    If Not delRng Is Nothing then
        delRng.Delete: Set delRng = Nothing
    End If
 Next sh
End Sub

评论

0赞 TigerLily 11/17/2023
感谢您的回复。这个问题有一个问题:“运行时错误'91':未设置对象变量或未设置块变量”:(delRng.Delete:设置 delRng = 无)
0赞 FaneDuru 11/17/2023
@TigerLily 这是代码的一部分...我只尝试为下一张纸制作范围。可能有一个工作表没有空列,并且已经是 ()。所以设计了你的代码。无论如何,我会调整我的以初步检查这方面。NothingdelRngNothingnot Set