我已经使用 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
。 改变这个解决了我的问题。 希望这对某人有所帮助。