实例需求:工作表中数据位于A1:A17(可能存在空单元格),现在需要定位其最后一个数字单元格的位置,注意需要忽略文本数字单元格(单元格左上角有绿色三角标识),即A9和A14不符合要求。
B列备注为了说明A列内容属性,C列为了展示哪些单元格包含公式。
示例代码如下。
Sub LocateNumberCell()
Const DATA_RNG = "A1:A17"
Dim rngConstant As Range, rngFormula As Range
Dim rowConstatnt As Long, rowFormula As Long, iRow As Long
On Error Resume Next
Set rngConstant = Range(DATA_RNG).SpecialCells(xlCellTypeConstants, 1)
Set rngFormula = Range(DATA_RNG).SpecialCells(xlCellTypeFormulas, 1)
On Error GoTo 0
If rngConstant Is Nothing Then
rowConstatnt = 0
Else
With rngConstant.Areas(rngConstant.Areas.Count)
rowConstatnt = .Cells(.Cells.Count).Row
End With
End If
If rngFormula Is Nothing Then
rowFormula = 0
Else
With rngFormula.Areas(rngFormula.Areas.Count)
rowFormula = .Cells(.Cells.Count).Row
End With
End If
iRow = Application.Max(rowConstatnt, rowFormula)
If iRow = 0 Then
MsgBox DATA_RNG & "中没有数字"
Else
MsgBox "最后一个数字位于单元格A" & iRow
End If
End Sub
【代码解析】
第2行代码指定数据区域范围。
第5行代码忽略第6和7行代码可能产生的运行时错误。
第6行代码获取指定数据区域的常量数字单元格。
第7行代码获取指定数据区域的公式结果为数字的单元格。
第8行代码恢复错误处理机制。
第9行代码判断rngConstant
是否为Nothing。
- 如果条件成立,说明第6行代码未定位到相应的单元格,第17行代码将变量
rowFormula
设置为零。 - 如果条件不成立,说明第6行代码找到了到符合要求的单元格,第12~14行代码获取最后一个单元格的行号。
由于rngConstant
可能是由多个不连续单元格区域组成的,因此不能使用如下代码获取最后一个单元格的行号。
rowConstatnt=rngConstant.Cells(rngConstant.Cells.Count).Row`
第16~22行代码使用类似的代码结构和逻辑,此处不再赘述。
第23行代码调用工作表函数获取两个行号的最大值,即更靠下的单元格行号。
第24行代码判断行号是否为零。
- 如果条件成立,说明没有数字单元格,第25行代码输出提示信息。
- 如果条件不成立,第27行代码输出最后数字单元格的引用地址。
运行代码结果如下图所示。
使用倒序遍历单元格区域的方法也可以定位数字单元格,需要提醒大家需要的是,对于空单元格IsNumeric()
函数返回值为True
,解决方法方法是使用如下组合条件。
Not Vba.IsEmpty(Range("A1")) And Vba.IsNumeric(Range("A1"))