首页 > 解决方案 > 去除命名范围左侧的空列

问题描述

假设 rangeData 指的是电子表格中的一个单元格区域。

如果最右边的列是空的,我可以这样做:

rangeData = rangeData.CurrentRegion

但是如果 rangeData 的最左边一列是空的怎么办?

如何剥离该列并让 rangeData 仅引用具有值的列?

标签: excelvba

解决方案


奇怪:顺便CurrentRegion说一下文档中的描述,我希望它不包括顶部的空行或左侧的空列。

您可以通过左侧的列查找第一个非空列,然后根据该列设置范围,如下所示:

    Dim i As Long
    Dim firstNonEmptyColumn As Long
    For i = 1 To rngData.Columns.Count
        If WorksheetFunction.CountA(rngData.Cells(1, i).EntireColumn) <> 0 Then
            firstNonEmptyColumn = i
            Exit For
        End If
    Next i
    Set rngData = Range(rngData.Cells(1, firstNonEmptyColumn), rngData.Cells(rngData.Rows.Count, rngData.Columns.Count))

您可以对顶部的空行执行类似的操作。


更新

让我澄清我的假设并提供更多细节:我假设起始条件rngData设置为包含非空单元格的连续范围,这些单元格被一些空的行/列包围。目标是更改 rngData 以使左侧没有空列。

还假设:在工作表的上方或下方没有其他非空单元格超出rngData. (请参阅下面的不同假设。)

要初始化rngData,我将从包含非空单元格的选择开始。

在此处输入图像描述

然后我将运行以下命令——最后我做出rngData选择以轻松可视化对 的更改rngData

Sub test()
    Dim rngData As Range
    Dim i As Long
    Dim firstNonEmptyColumn As Long
    
    Set rngData = Selection
    
    For i = 1 To rngData.Columns.Count
        If WorksheetFunction.CountA(rngData.Cells(1, i).EntireColumn) <> 0 Then
            firstNonEmptyColumn = i
            Exit For
        End If
    Next i
    Set rngData = Range(rngData.Cells(1, firstNonEmptyColumn), rngData.Cells(rngData.Rows.Count, rngData.Columns.Count))
    rngData.Select
End Sub

这是结果选择:

在此处输入图像描述

请注意,.CurrentRegion它将使用第一个(左上角)单元格作为其起始参考点。如果该单元格是空的(如我在此处的示例),则该单元格的当前区域将只是该单元格。.CurrentRegion确实适用于第一个单元格非空的情况。

但是我显示的内容用于WorksheetFunction.CountA()列中的所有单元格以确定该列是否(非)空(也可以与.EntireRow.)一起使用。因此它不受范围中的第一个单元格的限制。


第二次更新

在之前的更新中,假定工作表上方或下方没有超出 . 范围的非空单元格rngData。由于该假设,.EntireColumn用于检查非空单元格。

如果这对这种情况不合适,那么对具有非空单元格的列的测试可以仅限于 . 范围内的单元格rngData。以下 sub 将rngData像以前一样初始化,但检查仅限于 内的单元格的非空列rngData

Sub test()
    Dim rngData As Range
    Dim dataColumn As Range
    Dim i As Long
    Dim firstNonEmptyColumn As Long
    
    Set rngData = Selection
    
    For i = 1 To rngData.Columns.Count
        Set dataColumn = Range(rngData.Cells(1, i), rngData.Cells(rngData.Rows.Count, i))
        If WorksheetFunction.CountA(dataColumn) <> 0 Then
            firstNonEmptyColumn = i
            Exit For
        End If
    Next i
    Set rngData = Range(rngData.Cells(1, firstNonEmptyColumn), rngData.Cells(rngData.Rows.Count, rngData.Columns.Count))
    rngData.Select
End Sub

而不是 using.EntireColumn之前,设置为usingdataColumn中的单元格范围。也就是说,第 _i_ 列中的单元格为从 1 到 中的行数之间的行。rngDataRange(rngData.Cells(1, i), rngData.Cells(rngData.Rows.Count, i))rngDatarngData

对于测试,这是一个起始选择:

在此处输入图像描述

请注意用于 的选择下方的非空单元格rngData。运行该子程序后,这是结果选择:

在此处输入图像描述


推荐阅读