根据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 类型,因此如果您尝试将其分配给String
或Variant
以外的任何内容,则会出现运行时错误 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不是工作表函数的快捷方式)。