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.Workbook
replaceworkbook
,请重试。
你的代码应该看起来像这样:
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
。 改变这个解决了我的问题。 希望这有助于某人。