Excel VBA Application.Find() Method



根据Microsoft VBA 文档,我知道有Range.Find(What, After, LookIn, Lookat, SearchOrder....),但没有Application.Find()方法。如果我转到VBE中的对象浏览器来检查应用程序对象,我仍然看不到任何附加到应用程序对象的Find方法。当我键入"Application.Find("时,没有智能感是有道理的

但是,Application.Find() 方法只是有效。

txt = "EEZ || EZE 123"
pos = Application.Find(" ", txt, 1)

POS 的值为 4。为什么?...没有文档,对象浏览器中没有方法,该方法还能工作吗?

Application.Find

Excel.Application接口的扩展成员......它在运行时几乎是固定的,这就是为什么它没有显示在任何地方。Excel.Application的 COM 类型是可扩展的,并使用看似WorksheetFunction接口的成员进行扩展,但通过 Excel 计算引擎(或至少与 Excel 计算引擎的计算方式一致),而不是通过 VBA 运行时。

换句话说:

Debug.Print Application.Find("4", "12345", 1)

差不多是这样的:

Debug.Print Application.WorksheetFunction.Find("4", "12345", 1)

当您为它们提供无效参数时,差异更加明显:

Debug.Print TypeName(Application.Find("4", "12345", 10))
Debug.Print TypeName(Application.WorksheetFunction.Find("4", "12345", 10))

第一个打印Error,第二个抛出运行时错误 1004,允许更惯用的错误处理(即On Error语句将启动)。Error类型无法转换为任何其他 VBA 类型,因此如果您尝试将其分配给StringVariant以外的任何内容,则会出现运行时错误 13"类型不匹配"。IsError函数返回给定Variant/Error变量/表达式True

如果需要在String内定位子字符串的位置,请使用VBA.Strings.InStr函数:

Debug.Print InStr(1, "12345", "4", vbTextCompare)

请注意参数的顺序,以及使用vbTextCompare进行不区分大小写的搜索、使用vbBinaryCompare进行区分大小写的搜索的附加VbCompareMethod参数,如果你在 Access 中,则vbDatabaseCompare与当前数据库的比较方法匹配。如果省略,则在模块级别指定Option Compare确定参数值;Option Compare Binary是默认值。

调用早期绑定的 VBA 标准库函数应该比在Object上查询IDispatch以查找Find函数产生的运行时开销更少...,然后让 Excel 评估结果。

扩展接口的其他示例包括ADODB.Connection您可以(是否应该调用是另一个问题!)调用存储过程,就像调用成员一样 - 请注意,在这里,智能感知也无济于事,Option Explicit视而不见,因为这些调用总是后期绑定的(即在运行时解析)。

这确实很有趣。这似乎是Application.WorksheetFunction.Find的快捷方式。您使用的查找方法与Range.Find的VBA Find方法不同,它与工作表函数Find相同。

我还测试了其他工作表函数,它们似乎都可以工作:Application.Sum,Application.Count。但其他人已经有一个定义的应用程序方法(例如Application.Left不是工作表函数的快捷方式)。

最新更新