【问题标题】:Excel VBA pass object ByRef never sems to workExcel VBA 传递对象 ByRef 似乎永远不会工作
【发布时间】:2016-06-05 08:20:19
【问题描述】:

我已经使用 VBA 很多年了,但在那段时间里,我从来没有设法通过工作簿或工作表 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 类型不匹配的编译错误?我错过了什么?

非常感谢

【问题讨论】:

  • 对我来说很好。文件路径是网络路径吗?
  • 是的,但我刚刚尝试使用 C: 驱动器上的文件夹,但仍然存在同样的问题。奇怪的是,这不仅仅是我目前的工作地点,我从未设法做到这一点。我想我被诅咒了!

标签: excel pass-by-reference byref vba


【解决方案1】:

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

相关信息:Should I use Call keyword in VB/VBA?

您的原始代码对我有用,但可能存在细微差别 在导致问题的空白或括号中。 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

【讨论】:

  • 感谢您的回复。我直接写到网页上,而不是从 Excel 复制,所以没有自动更正。这是我多年来尝试了数百次的伪代码。到目前为止,我从未尝试过指定类(Excel.Workbook),但这没有帮助。
  • 我检查了非标准加载项,没有类似的模块等。其他都是微软的(比如分析工具包)
  • 好的,这解释了小写问题。您发布的代码对我有用(使用 Excel 2010)。我很少在 VBA 中使用 ByRef,因为对象总是通过引用传递。该参数仅定义引用是通过引用传递还是通过值more information here 传递。编译错误应突出显示特定行。我认为这是 SubTwo 的定义。对吗?
  • 另外请尝试用SubTwo wb替换Call SubTwo(wb)
  • 编译器突出显示调用 sub 的参数中的对象名称,在本例中为 Call SubTwo(wb) 的“wb”。如果我从 SubTwo 中删除 ByRef 说明符,我会得到完全相同的错误。如果我通过 ByVal,它可以工作,所以它不会破坏游戏,但令人沮丧!我正在使用 Excel 2007。
【解决方案2】:

这对我有用:

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

【讨论】:

  • sry 我输入错了,因为我没有复制它,再试一次
  • 使用 This.ActiveWorkbook 仍然出现相同的编译错误
【解决方案3】:

我遇到了同样的问题。经过大量尝试和失败后,我在顶部添加了选项 Explicit。当我执行代码时,它告诉我 Worksheet 变量的声明与传递的变量的名称不匹配。也就是说,shtFSheet 已声明,strFSheet 已通过。改变这个解决了我的问题。希望这对某人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多