作者:大街上 | 来源:互联网 | 2023-02-05 19:59
我知道range().HasFormula
只有当范围中的每个单元格都有公式时才返回True,否则它可以返回False或Null(混合时).但是没有像HasNumber这样的功能.因此,要检查范围是否仅包含数字,我必须这样做
Dim all_numeric As Boolean
all_numeric = True
For Each cell In Range()
If (Not IsNumeric(cell)) Or IsEmpty(cell) Then 'I also want to get rid of empty cell
all_numeric = False
Exit For
End If
Next cell
此外,有WorksheetFunction.IsNumber
类似的东西,但仍然需要循环范围.如果范围包含大量数字,我不确定这是否会非常慢.我想知道是否有更好的方法来检查VBA中范围对象的数值.
1> Mathieu Guin..:
也许all_numeric = (r.Cells.Count - Application.Count(r)) = 0
(其中r
一个Range
对象)?- YowE3K 35分钟前
这确实很漂亮:它利用Excel自己的函数返回一个范围内的数值来确定结果:
WorksheetFunction.Count
计算包含数字的单元格数量并计算参数列表中的数字.
https://msdn.microsoft.com/en-us/library/office/ff840324.aspx
不计算错误单元格和空单元格,这满足了不计算空单元格的要求.
这使得一个很好的UDF在标准模块中公开,我发现:
'@Description("Returns True if all cells in specified range have a numeric value.")
Public Function IsAllNumeric(ByVal target As Range) As Boolean
IsAllNumeric = target.Cells.Count - Application.WorksheetFunction.Count(target) = 0
End Function
请注意,我使用过Application.WorksheetFunction.Count
,而不是Application.Count
:
后者是一种后期绑定调用,它使VBA运行时工作比查找Count
方法更加困难.你正在开发一个扩展的COM接口,所以你也没有编译时验证:Application.IDontExist
编译完全正常,并且运行时错误438爆炸.与任何其他后期成员调用一样,VBE的IntelliSense可以帮助你的参数:
前者是一个早期绑定的函数调用,VBA在编译时解析.您正在WorksheetFunction
直接使用该界面,因此VBE为您提供参数的自动完成和IntelliSense.
自动完成:
智能感知:
调用是早期绑定的事实意味着没有运行时开销,因此性能更好 - 即使它最终是完全相同的内部Excel函数执行.
缺点(如果它是一个)是后期绑定的Application.SomeFunction
东西与Excel4Macros兼容,Excel4Macros是旧的传统的VBA前自动化Excel方式.因此,而不是提高运行时错误像他们早期绑定同行,后期绑定函数返回错误值,这样你可以 应该与测试它们IsError
之前,你可以假设你实际上得到什么类型.
使用早期绑定WorksheetFunction.SomeFunction
调用,如果Excel显示的结果是#REF!
或#VALUE!
,或者#N/A
或者其他任何可能的错误值,那么您将永远不会遇到类型不匹配运行时错误,将错误值视为a String
或a Long
,或者任何其他非错误VBA类型.相反,您只需处理运行时错误,就像处理任何其他VBA API函数一样.
后期绑定调用将错误值传播到您的代码中; 早期调用早期失败:在读取单元格值之间可能有20行代码,并且假定没有错误值的方式使用该值,并且该指令会引发类型不匹配 - 然后您需要调试以追溯到返回错误的函数.使用早期绑定的代码,函数本身会抛出错误,因此您无需进行挖掘.