gpt4 book ai didi

vba - 是否有 IsNumeric 的范围版本,就像 VBA 函数 HasFormula 一样?

转载 作者:行者123 更新时间:2023-12-02 04:48:51 26 4
gpt4 key购买 nike

我知道仅当范围中的每个单元格都有公式时,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 中范围对象的数值。

最佳答案

Maybe all_numeric = (r.Cells.Count - Application.Count(r)) = 0 (where r is a Range object)? – YowE3K 35 mins ago

确实是beautiful :它利用 Excel 自己的函数返回某个范围内的数值数量来确定结果:

WorksheetFunction.Count

Counts the number of cells that contain numbers and counts numbers within the list of arguments.

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:

  • 后者是后期绑定(bind)调用,它使 VBA 运行时的工作量比其需要的工作量大得多,以查找 Count 方法。您正在使用扩展的 COM 接口(interface),因此您也没有编译时验证:Application.IDontExist 编译得很好,但在运行时会崩溃错误 438。与任何其他后期绑定(bind)成员调用一样,VBE 的 IntelliSense 无法帮助您处理参数:

    no intellisense

  • 前者是早期绑定(bind)函数调用,VBA 在编译时解析。您直接使用 WorksheetFunction 接口(interface),因此 VBE 为您提供参数的自动完成IntelliSense

    自动完成:

    autocomplete

    智能感知:

    intellisense

调用是早期绑定(bind)的事实意味着没有运行时开销,因此性能更好 - 即使它最终与执行的内部 Excel 函数完全相同。

缺点(如果有的话)是后期绑定(bind)的 Application.SomeFunction 内容与 Excel4Macros 兼容,Excel4Macros 是一种旧的 VBA 之前的自动化 Excel 方式。因此,后期绑定(bind)函数不会像早期绑定(bind)函数那样引发运行时错误,而是返回错误,这样您可以应该使用IsError测试它们,然后才能假设您实际获得的类型。

对于早期绑定(bind)的 WorksheetFunction.SomeFunction 调用,如果 Excel 显示的结果是 #REF!#VALUE!,或者#N/A 或任何其他可能的错误值,那么您将永远不会因将错误值视为 而遇到类型不匹配运行时错误StringLong,或任何其他非错误 VBA 类型。相反,您只需处理运行时错误,就像处理任何其他 VBA API 函数调用一样。

后期绑定(bind)调用会将错误值传播到您的代码中;早期绑定(bind)调用提前失败:在读取单元格值的位置和以假设没有错误值的方式使用该值的位置之间可能有 20 行代码,并且 指令抛出类型不匹配 - 然后您需要调试以追溯到返回错误的函数。对于早期绑定(bind)的代码,函数本身会抛出错误,因此您不必挖掘它。

关于vba - 是否有 IsNumeric 的范围版本,就像 VBA 函数 HasFormula 一样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43566582/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com