我有这个功能(我基于一个函数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库并从代码中打开工作簿。
答案 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
您也可以使用Foo rng
或Call 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的解决方案,看看它是否有效。