Excel VBA传递对象ByRef从不执行任务
我已经使用VBA很多年了,但在这段时间里,我从未成功地通过工作簿或工作表ByRef,我不得不使用字符串名称并在partner子函数或函数中设置对象。。。所以,终于到了寻求帮助的时候了Excel VBA传递对象ByRef从不执行任务,excel,pass-by-reference,byref,vba,Excel,Pass By Reference,Byref,Vba,我已经使用VBA很多年了,但在这段时间里,我从未成功地通过工作簿或工作表ByRef,我不得不使用字符串名称并在partner子函数或函数中设置对象。。。所以,终于到了寻求帮助的时候了 Sub SubOne() Dim wb as workbook Dim filepath as string filepath = "//somepath/somebook.xlsx" Set wb = application.workbooks.open(filepath) Call SubTwo(wb)
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
关键字来避免此类问题。
使用SubTwo-wb
有关资料:
您的原始代码对我有效,但可能存在一些细微的差异
出现问题的空格或括号中。VBA不仅使用括号将参数传递给子函数,还使用括号计算数据
另一点需要提及的是,ByVal和ByRef都应该适用于您尝试执行的操作,因为在VBA中对象总是通过引用传递的。ByVal/ByRef仅定义引用本身是否通过值或引用传递:
我想在这里留下我以前的答案,因为它仍然是发布的错误消息的有效答案,可能有助于某人搜索解决方案
先前的答复:
我猜您加载的加载项之一正在使用名为workbook
的模块、类模块、枚举等,这会导致编译错误
如果您查看代码,您还将看到工作簿是用小写字母编写的。通常,VBA编辑器会自动将其更正为工作簿
,除非有其他类型名称干扰
若要避免此问题,请将工作簿
替换为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
我也有同样的问题。经过多次尝试并失败后,我在顶部添加了OptionExplicit。当我执行代码时,它显示工作表变量的声明与传递的变量名称不匹配。也就是说,声明了
shtFSheet
,并传递了strFSheet
。改变这个解决了我的问题。希望这对其他人有所帮助。sry我键入了一个错误匹配,因为我没有复制它,请重新尝试。使用this.ActiveWorkbookWorks可以输入相同的编译错误。文件路径是网络路径吗?是的,但我刚刚尝试了C:驱动器上的一个文件夹&仍然是相同的问题。奇怪的是,这不仅仅是我目前的工作地点,我从来没有做到这一点。我想我真倒霉!谢谢你的回复。我直接写在网页上,而不是从Excel复制,因此没有自动更正。这是多年来我尝试过数百次的伪代码。到目前为止,我从未尝试过指定类(Excel.Workbook),但没有任何帮助。我检查了非标准加载项&没有类似的模块等。所有其他人都是Microsoft(例如AnalysisToolPack)Ok,这解释了小写字母的问题。您发布的代码适用于我(使用Excel 2010)。我很少在VBA中使用ByRef,因为对象总是通过引用传递的。该参数仅定义引用是通过引用传递还是通过值传递。编译错误应突出显示特定行。我想这是SubTwo的定义。是否正确?请尝试将调用子两(wb)
替换为子两(wb)
编译器在调用子两(wb)的参数中突出显示对象名称,在本例中为调用子两(wb)的“wb”。如果我从SubTwo中删除ByRef说明符,我会得到完全相同的错误。如果我通过了拜瓦尔,它会起作用,所以它不是比赛的破坏者,但它令人沮丧!我正在使用Excel2007。