首页 > 解决方案 > 在 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

解决方案


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!

丢掉方括号,你就不会因为它们而头疼了!

假设exploradoropenfileString包含有效/注册 ProgID 的变量,CreateObject(explorador)应该按预期工作。

考虑使用字符串字面量或声明的常量CreateObject: 在这里有一个间接层会掩盖正在创建的 COM 对象的确切类型。如果不在注册表中,With CreateObject("Scripting.FileSystemObject")则只能失败。Scripting.FileSystemObject


推荐阅读