Excel VBA 传递对象 ByRef 永远不会工作



我已经使用 VBA 很多年了,但在这段时间里,我从未设法传递工作簿或工作表 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 类型不匹配编译错误?我错过了什么?

非常感谢

您可以通过

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

相关信息: 我应该在 VB/VBA 中使用 Call 关键字吗?

您的原始代码对我有用,但可能存在细微差异在导致问题的空格或括号中。VBA 不仅使用括号将参数传递给子/函数,还用于评估数据。

另一点值得一提的是,ByVal 和 ByRef 都应该适用于您尝试执行的操作,因为对象始终在 VBA 中通过引用传递。ByVal/ByRef 仅定义引用本身是否通过值或引用传递:https://msdn.microsoft.com/en-us/library/ddck1z30.aspx

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

以前的答案:

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

如果您查看代码,您还将看到工作簿是小写的。通常,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
这对

我有用:

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

我遇到了同样的问题。 经过多次尝试和失败,我在顶部添加了选项显式。 当我执行代码时,它向我显示工作表变量的声明与传递的变量的名称不匹配。 也就是说,shtFSheet被宣布并通过strFSheet。 改变这个解决了我的问题。 希望这对某人有所帮助。

相关内容

  • 没有找到相关文章

最新更新