Excel VBA传递对象ByRef从不执行任务

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)

我已经使用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)

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。