excel - 去除命名范围左侧的空列
问题描述
假设 rangeData 指的是电子表格中的一个单元格区域。
如果最右边的列是空的,我可以这样做:
rangeData = rangeData.CurrentRegion
但是如果 rangeData 的最左边一列是空的怎么办?
如何剥离该列并让 rangeData 仅引用具有值的列?
解决方案
奇怪:顺便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 到 中的行数之间的行。rngData
Range(rngData.Cells(1, i), rngData.Cells(rngData.Rows.Count, i))
rngData
rngData
对于测试,这是一个起始选择:
请注意用于 的选择下方的非空单元格rngData
。运行该子程序后,这是结果选择:
推荐阅读
- python - 在一行中使用多个 if else 语句
- java - 我正在尝试使用递归查找给定字符串的等级
- php - 元数据库嵌入问题失败,断言失败:(整数?卡 ID)
- javascript - 在javascript中添加删除按钮
- visual-studio - 添加引用 Visual Studio 2010 (NuGet)
- oracle - 无法将 JDBC 驱动连接到 Oracle 11g 企业版
- go - goroutine 拆分策略
- c# - Windows 反恶意软件扫描接口 - ASP.NET/IIS
- python - 如何将字数数组写入 csv 文件?
- javascript - NPM 在 react-date-range 包中找不到模块 'date-fns/local/en-US'