首页 > 解决方案 > VBA:删除范围内的特定列

问题描述

我正在做一个项目,我需要一个程序来删除 A 到 F 列和 J 列中的空列(标题除外)。我希望它循环Range("A10:F10000")Range("J:J")删除单元格 A10 中的列, B10 等向下,然后将剩余的数据向左移动。我正在处理这个,这会影响整个工作表,而不仅仅是一个范围:

ecl = Sheet1.Cells.SpecialCells(xlCellTypeLastCell).Column

For cl = ecl To 1 Step -1
    cnt = Application.WorksheetFunction.CountA(Sheet1.Columns(cl))
    If cnt = 1 Then
        Sheet1.Columns(cl).Delete
    End If

Next

我通常可以使用公式并且对 VBA 不是很熟悉,但是对于这个项目,它必须是一个宏。我希望这是有道理的,并会感谢任何建议!

标签: vbaexcel

解决方案


你可以使用这个:

Dim cl As Range, colsToDelete As Range
With ActiveSheet 'reference wanted sheet
    Set colsToDelete = .UsedRange.Columns(.UsedRange.Columns.Count).Offset(, 1).Resize(1, 1) ' initialize 'colsToDelete' to a "dummy" range certainly out of relevant one
    With Intersect(.Range("A10:J" & .UsedRange.Rows(.UsedRange.Rows.Count).Row), .Range("A:F, J:J")) ' reference referenced sheet range in column A to F and G form row 10 down to referenced sheet last not empty cell row
        For Each cl In .Columns ' lop through referenced range columns
            If Application.WorksheetFunction.CountA(cl) = 1 Then Set colsToDelete = Union(colsToDelete, cl) 'if current column is empty (i.e. only header in row 10) then add it to the colsToDelete range
        Next
        Set colsToDelete = Intersect(colsToDelete, .Cells) ' get rid of the "dummmy" range
    End With
End With
If Not colsToDelete Is Nothing Then colsToDelete.EntireColumn.Delete ' if any range to delete, do it!

推荐阅读