excel - 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。为什么?...没有文档,对象浏览器中没有方法,该方法仍然可以工作吗?
解决方案
Application.Find
是Excel.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
会视而不见,因为这些调用总是后期绑定的(即在运行时解决)。
推荐阅读
- sql - EF core 3.1 无法运行复杂的原始 sql 查询
- c# - WPF MVVM 如何从 ViewModel 中的视图访问矩形集合?
- c# - C# 字符串必须是常量
- c# - 为什么 App.DispatcherUnhandledException 处理程序不捕获 App 构造函数抛出的异常?
- android - 有没有办法在导航抽屉单个菜单项的最右侧显示文本 - Android
- git - 从远程完全更新本地仓库
- javascript - 如何使用 Chart.js 实现连续线图中的不连续部分(跳跃)?
- android - 在项目 ':app' 中找不到路径为 ':spotify-app-remote' 的项目。?
- ios - 如何嵌入依赖于架构的框架
- laravel - 如何修复 laravel 中的电子邮件身份验证问题?