为什么VBA在传递Range对象时会抛出类型不匹配错误?

时间:2016-06-15 20:16:17

标签: .net vba excel-vba type-mismatch excel

我有这个功能(我基于一个函数here):

Function Foo(ByVal r As range) As String
    MsgBox "WHAT. The function worked? Wow!"
    Foo = "test"
End Function

我试过这样称呼它:

Let max_row = cells.CurrentRegion.Columns.Count
Set r = range(cells(2, ID_COL), cells(max_row, ID_COL))
Foo r

我总是得到错误:"运行时错误13,类型不匹配"一旦代码点击了对Foo的调用。

另外,我尝试过:

Foo (r)

这给出了错误:"对象预期" 我假设这意味着括号将指向其值的指针,而不是(总是?)在函数/子程序调用中使用。

我也尝试过编写没有" ByVal"但那也失败了。

有什么想法吗?

编辑尝试了@ScottCraner建议但错误仍然存​​在:

Dim text As String
Let max_row = cells.CurrentRegion.Columns.Count
Set r = range(cells(2, ID_COL), cells(max_row, ID_COL))
text = Foo(r)

编辑重要说明:这是从启用宏的Word文档运行,导入Excel库并从代码中打开工作簿。

3 个答案:

答案 0 :(得分:4)

使用()时,您需要将其分配给变量或其他方向:

Function Foo(r As Range) As String
    MsgBox "WHAT. The function worked? Wow!"
    Foo = "Test"
End Function

Sub fun()
Dim rng As Range
Set rng = Range("A2:A100")
Dim t As String
t = Foo(rng)
Debug.Print t
End Sub

enter image description here

您也可以使用Foo rngCall Foo(rng)

感谢永远正确的@Rory

但真正的问题似乎是您在其他地方使用了range这个词作为变量,子或函数,这取代了它作为对象的正确用法。

正如@ Mat'sMug所指出的

答案 1 :(得分:1)

所以问题结果是因为这个代码是从word运行的,以Excel库作为参考,Range类型默认为MS-Word Range对象而不是MS-Excel Range对象,这意味着我的函数正在寻找错误类型的参数。这是更正的代码(注意在定义Foo和Range变量r时显式引用Excel lib):

Function Foo(r As Excel.Range) As String
    MsgBox "WHAT. The function worked? Wow!"
    Foo = "Test"
End Function

Sub main()
    Set workbook = Excel.Workbooks.Open("example.xlsx")
    Set datasheet = workbook.ActiveSheet

    Dim rng As Excel.Range
    Set rng = datasheet.Range("A2:A100")
    Dim t As String
    t = Foo(rng)
    Debug.Print t
End Sub

正如@ScottCraner和其他人指出的那样,问题很容易就是我在其他地方有一个名为Range的变量/函数。以某种方式发生的事情,只有它在Word库中定义,而不是在我的代码中定义。

答案 2 :(得分:-1)

关闭Excel并重新启动计算机。

如果失败,请将代码复制到记事本中,删除代码所在的代码模块。插入新模块,然后将代码复制回excel。

Excel VBA文件很容易被破坏。

尝试一下,然后尝试Scott的解决方案,看看它是否有效。