首页 > 解决方案 > Excel VBA Application.Find() 方法

问题描述

基于 Microsoft VBA 文档,我知道有Range.Find(What, After, LookIn, Lookat, SearchOrder....),但没有Application.Find()方法。如果我在VBE中的对象浏览器中检查Application对象,我仍然看不到任何附加到Application对象的Find方法。当我输入“Application.Find(”时没有智能感知是有道理的

但是,Application.Find() 方法可以正常工作。

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

pos 的值为 4。为什么?...没有文档,对象浏览器中没有方法,该方法仍然可以工作吗?

标签: excelvbaobject

解决方案


Application.FindExcel.Application界面的扩展成员.. 它在运行时几乎是附加的,这就是为什么它没有在任何地方显示的原因。的 COM 类型Excel.Application可扩展的,并且使用似乎是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 类型,因此如果您尝试将其分配给 aString或除 a 以外的任何其他内容,预计会出现运行时错误 13“类型不匹配” Variant。该IsError函数返回True给定的Variant/Error变量/表达式。

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

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

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

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

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


推荐阅读