Excel VBA 传递对象 ByRef 似乎永远无法工作

Excel VBA pass object ByRef never sems to work

我已经使用 VBA 很多年了,但在那段时间里,我从未设法通过工作簿或 sheet ByRef,我不得不使用字符串名称和设置合作伙伴子或函数中的对象...所以终于到了寻求帮助的时候了!

Sub SubOne()

Dim wb as workbook
Dim filepath as string

filepath = "//somepath/somebook.xlsx"

Set wb = application.workbooks.open(filepath)

Call SubTwo(wb)

End Sub



Sub SubTwo(ByRef wb as workbook)

debug.print wb.name

End Sub

谁能看出为什么这会触发 ByRef 类型不匹配编译错误?我错过了什么?

非常感谢

这对我有用:

Sub SubOne()

 Dim wb as workbook
 Set wb = This.ActiveWorkbook
 Call SubTwo(wb)
End Sub

Sub SubTwo(ByRef wb As Workbook)

 Debug.Print(wb.Name)
End Sub

您可以通过不使用 Call 关键字来避免此类问题。 而不是 Call SubTwo(wb) 使用 SubTwo wb

相关资料:Should I use Call keyword in VB/VBA?

你的原始代码对我有用,但可能存在细微差别 在导致问题的白色 space 或括号中。 VBA 使用括号不仅可以将参数传递给子程序/函数,还可以计算数据。

另一点要提到的是,ByVal 和 ByRef 应该都适用于您正在尝试做的事情,因为在 VBA 中对象总是通过引用传递。 ByVal / ByRef 仅定义引用本身是按值还是引用传递:https://msdn.microsoft.com/en-us/library/ddck1z30.aspx

我想在这里留下我之前的答案,因为它仍然是已发布错误消息的有效答案,可能会帮助其他人寻找解决方案。

上一个回答:

我的猜测是您加载的插件之一正在使用名为 workbook 的模块、ClassModule、Enum 等,这会导致编译错误。

如果您查看代码,您还会发现工作簿是小写的。通常 VBA 编辑器会将其自动更正为 Workbook 除非有其他类型名称干扰。

为避免这种情况,请将 workbook 替换为 Excel.Workbook,然后重试。

您的代码应该如下所示:

Sub SubOne()

Dim wb as Excel.Workbook
Dim filepath as string

filepath = "//somepath/somebook.xlsx"

Set wb = application.workbooks.open(filepath)

Call SubTwo(wb)

End Sub



Sub SubTwo(ByRef wb as Excel.Workbook)

debug.print wb.name

End Sub

我遇到了同样的问题。经过多次尝试和失败后,我在顶部添加了 Explicit 选项。当我执行代码时,它告诉我 Worksheet 变量的声明与传递的变量名称不匹配。即声明了shtFSheet,传递了strFSheet。改变这个解决了我的问题。希望这对某人有所帮助。