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

我一直在使用VBA多年,但在所有那些时间,我从来没有设法通过一个工作簿或工作表ByRef,我不得不使用string名称和设置对象在合作伙伴或function…所以最后现在是时候得到一些帮助!

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 

任何人都可以看到为什么这会触发ByReftypes不匹配编译错误? 我错过了什么?

非常感谢

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

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

您的原始代码适用于我,但是可能在导致问题的空格或括号中存在细微差异。 VBA使用圆括号不仅将parameter passing给子函数,而且还用于评估数据。

还有一点需要提及的是,ByVal和ByRef都应该为你所要做的工作,因为对象总是通过VBA中的引用传递的。 ByVal / ByRef仅定义引用本身是否通过值或引用传递: https : //msdn.microsoft.com/en-us/library/ddck1z30.aspx

我想留下我以前的答案在这里,因为它仍然是一个有效的答案,张贴错误信息,可能会帮助某人寻找解决scheme。

先前的回答:

我的猜测是,你的一个加载的AddIns正在使用一个Module,ClassModule,Enum等命名workbook ,这会导致编译错误。

如果你看看你的代码,你也会看到工作簿被写成小写字母。 通常情况下,VBA编辑器会将其自动更正为Workbook除非某些其他types的名称存在干扰。

为了避免用Excel.Workbookreplaceworkbook ,请重试。

你的代码应该看起来像这样:

 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 

我遇到过同样的问题。 经过很多尝试和失败,我添加选项显式顶部。 当我执行代码时,它向我展示了Worksheetvariables的声明与传递的variables名称不匹配。 也就是说,声明了strFSheet并传递了strFSheet 。 改变这个解决了我的问题。 希望这有助于某人。