Nic*_*las 6 excel vba excel-vba
我知道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
Run Code Online (Sandbox Code Playgroud)
此外,有WorksheetFunction.IsNumber类似的东西,但仍然需要循环范围.如果范围包含大量数字,我不确定这是否会非常慢.我想知道是否有更好的方法来检查VBA中范围对象的数值.
也许
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
Run Code Online (Sandbox Code Playgroud)
请注意,我使用过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行代码,并且假定没有错误值的方式使用该值,并且该指令会引发类型不匹配 - 然后您需要调试以追溯到返回错误的函数.使用早期绑定的代码,函数本身会抛出错误,因此您无需进行挖掘.
| 归档时间: |
|
| 查看次数: |
1645 次 |
| 最近记录: |