vba - 在 vba excel 中创建对象时使用括号?
问题描述
我已经从我发现从 xml 到 excel 的 vba 项目中复制了代码,但它在我的 vba 项目中给了我一个错误,我已经检查了参考库。
ruta = LCase(CreateObject([explorador]).BrowseForFolder(0, "selecciona la carpeta a procesar", 0, "").items.Item.Path)
我做了以下更改,它起作用了 ruta = LCase(CreateObject("shell.application").BrowseForFolder(0, "selecciona la coloura a procesar", 0, "").Items.Item.Path)
但后来又回到了这条线
使用 CreateObject([openFile])
我收到执行时间不匹配的错误 13。变量不匹配
我检查了变量,它们是正确的:不确定:
我不明白为什么原始文件运行顺畅,而副本却没有。在编写 [explorer] 和 [openFile] 时,关于那些代码行的语法,我几乎没有发现它
解决方案
VBA 中的方括号用于语言规范所称的“外来标识符”;它们是您可以显式调用Range
对象的默认成员的方式,该成员是一个名为的隐藏成员_Default
- 因为 VBA 标识符不能以下划线开头,所以这样做MsgBox SomeRange._Default
是非法的。所以我们MsgBox SomeRange.[_Default]
改为这样做,现在代码可以编译和运行。SomeCollection.[_NewEnum]
在创建自定义集合类时,与隐藏成员相同。
当括号中的标识符不包含任何非法标识符字符时,它们纯粹是多余的。
各种VBA主机也实现了某种形式的Evaluate
机制;当托管在 Excel 中时,您可以执行此操作MsgBox [A1]
,您将从活动工作表中获取单元格 A1 的值 - 在此上下文[A1]
中是 VBA 采用并传递给主机应用程序(此处为 Excel)的表达式,该应用程序对其进行评估并返回结果到 VBA - 在这种情况下是Range
对象引用。
所以CreateObject([explorador])
真正做的是,真的是这样的:
CreateObject(ActiveSheet.Range("explorador").Value)
除了 Excel 不理解explorador
所指的内容(工作表是否应该定义一个explorador
命名范围?我无法想象你为什么要这样做),并返回显示为#NAME?
错误的内容工作表,包含在一个Variant/Error
值中:
CreateObject(CVErr(XlErrName)) 'type mismatch error every time!
丢掉方括号,你就不会因为它们而头疼了!
假设explorador
和openfile
是String
包含有效/注册 ProgID 的变量,CreateObject(explorador)
应该按预期工作。
考虑使用字符串字面量或声明的常量CreateObject
: 在这里有一个间接层会掩盖正在创建的 COM 对象的确切类型。如果不在注册表中,With CreateObject("Scripting.FileSystemObject")
则只能失败。Scripting.FileSystemObject
推荐阅读
- java - 使用 KStreams,我如何对 UncaughtExceptionHandler 进行单元测试?
- python - 具有共享轴的 matplotlib 子图
- javascript - ReactJS 在页面加载时多次渲染
- c# - 使用我的 nuget 包会生成大量 DLL
- python - 使用 discord.py 更改 Discord 机器人的昵称
- vue.js - vue-router中基于路由参数的动态组件
- powerbi - 根据特定列计算动态总和
- security - 在 Chrome 扩展中实现登录的最佳实践
- ios - 使用 SwiftUI 实现应用内购买
- python - 为什么 AWS Lambda 会因凭证错误而超时?