Excel VBA 传递对象 ByRef 似乎永远无法工作
Excel VBA pass object ByRef never sems to work
我已经使用 VBA 很多年了,但在那段时间里,我从未设法通过工作簿或 sheet 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 类型不匹配编译错误?我错过了什么?
非常感谢
这对我有用:
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
关键字来避免此类问题。
而不是 Call SubTwo(wb)
使用 SubTwo wb
相关资料:Should I use Call keyword in VB/VBA?
你的原始代码对我有用,但可能存在细微差别
在导致问题的白色 space 或括号中。 VBA 使用括号不仅可以将参数传递给子程序/函数,还可以计算数据。
另一点要提到的是,ByVal 和 ByRef 应该都适用于您正在尝试做的事情,因为在 VBA 中对象总是通过引用传递。 ByVal / ByRef 仅定义引用本身是按值还是引用传递:https://msdn.microsoft.com/en-us/library/ddck1z30.aspx
我想在这里留下我之前的答案,因为它仍然是已发布错误消息的有效答案,可能会帮助其他人寻找解决方案。
上一个回答:
我的猜测是您加载的插件之一正在使用名为 workbook
的模块、ClassModule、Enum 等,这会导致编译错误。
如果您查看代码,您还会发现工作簿是小写的。通常 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
我遇到了同样的问题。经过多次尝试和失败后,我在顶部添加了 Explicit 选项。当我执行代码时,它告诉我 Worksheet 变量的声明与传递的变量名称不匹配。即声明了shtFSheet
,传递了strFSheet
。改变这个解决了我的问题。希望这对某人有所帮助。
我已经使用 VBA 很多年了,但在那段时间里,我从未设法通过工作簿或 sheet 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 类型不匹配编译错误?我错过了什么?
非常感谢
这对我有用:
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
关键字来避免此类问题。
而不是 Call SubTwo(wb)
使用 SubTwo wb
相关资料:Should I use Call keyword in VB/VBA?
你的原始代码对我有用,但可能存在细微差别 在导致问题的白色 space 或括号中。 VBA 使用括号不仅可以将参数传递给子程序/函数,还可以计算数据。
另一点要提到的是,ByVal 和 ByRef 应该都适用于您正在尝试做的事情,因为在 VBA 中对象总是通过引用传递。 ByVal / ByRef 仅定义引用本身是按值还是引用传递:https://msdn.microsoft.com/en-us/library/ddck1z30.aspx
我想在这里留下我之前的答案,因为它仍然是已发布错误消息的有效答案,可能会帮助其他人寻找解决方案。
上一个回答:
我的猜测是您加载的插件之一正在使用名为 workbook
的模块、ClassModule、Enum 等,这会导致编译错误。
如果您查看代码,您还会发现工作簿是小写的。通常 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
我遇到了同样的问题。经过多次尝试和失败后,我在顶部添加了 Explicit 选项。当我执行代码时,它告诉我 Worksheet 变量的声明与传递的变量名称不匹配。即声明了shtFSheet
,传递了strFSheet
。改变这个解决了我的问题。希望这对某人有所帮助。