Excel VBA Application.Find()方法

Gen*_*n.L 3 excel vba object

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

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

txt = "EEZ || EZE 123"
pos = Application.Find(" ", txt, 1)
Run Code Online (Sandbox Code Playgroud)

pos会有价值4.为什么?...没有docs,没有方法在对象浏览器中,该方法仍然可以工作?

Mat*_*don 5

Application.FindExcel.Application界面的扩展成员..它在运行时非常强大,这就是为什么它没有显示在任何地方.COM类型Excel.Application可扩展的,并且通过看起来是WorksheetFunction接口的成员进行扩展,但是通过Excel计算引擎(或者至少与Excel将如何评估它的方式一致)而不是通过VBA运行时扩展.

换句话说:

Debug.Print Application.Find("4", "12345", 1)
Run Code Online (Sandbox Code Playgroud)

几乎是这样的:

Debug.Print Application.WorksheetFunction.Find("4", "12345", 1)
Run Code Online (Sandbox Code Playgroud)

当你给它们无效的参数时,差异更明显:

Debug.Print TypeName(Application.Find("4", "12345", 10))
Debug.Print TypeName(Application.WorksheetFunction.Find("4", "12345", 10))
Run Code Online (Sandbox Code Playgroud)

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

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

Debug.Print InStr(1, "12345", "4", vbTextCompare)
Run Code Online (Sandbox Code Playgroud)

请注意参数的顺序,以及额外VbCompareMethod的同时与不区分大小写的搜索参数vbTextCompare,区分大小写的搜索,使用vbBinaryCompare,如果你在访问的时候,vbDatabaseCompare匹配当前数据库的比较方法.如果省略,Option Compare则在模块级指定确定参数值; Option Compare Binary是默认的.

调用早期绑定VBA标准库函数应该承担更少的运行时开销比查询IDispatchObject找到一个Find功能......然后让Excel的评估结果.

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