以下函数返回“类型不匹配”。我不明白,因为我注意使用“Set”指令返回我的结果范围。
我调试了这个函数,我得到了一个合适的范围来返回,所以问题出在其他地方..嗯......
Function getVals(column As String) As Range
Dim col As Variant
col = Application.Match(column, ThisWorkbook.ActiveSheet.Range("1:1"), 0)
Dim rng As Range
Set rng = ThisWorkbook.ActiveSheet.Cells(1, col)
Set rng = rng.Offset(1, 0)
Set rng = Range(rng, rng.End(xlDown))
Set getVals = rng
End Function
先谢谢你们的帮助:)
更新:我正在研究如何将结果作为数组发送。我尝试了返回“variant”/“variant()”类型的函数的组合,并将rng.value2作为结果传递,但没有成功。
答案 0 :(得分:1)
要将结果作为值数组返回,只需将返回类型更改为Variant
并返回rng.Value
即可。只要column
中存在传递的ThisWorkbook.ActiveSheet.Range("1:1")
字符串,下面的代码就适用于我。
Function getVals(column As String) As Variant
Dim col As Variant
col = Application.Match(column, ThisWorkbook.ActiveSheet.Range("1:1"), 0)
Dim rng As Range
Set rng = ThisWorkbook.ActiveSheet.Cells(1, col)
Set rng = rng.Offset(1, 0)
Set rng = Range(rng, rng.End(xlDown))
getVals = rng.Value
End Function
Sub TestingGetVals()
Dim v As Variant, i As Integer
v = getVals("a") ' returns a 2-D array
For i = 1 To UBound(v)
Debug.Print v(i, 1)
Next i
End Sub
答案 1 :(得分:0)
你收到了这个错误,因为Match无法找到你想要的东西,因此你的rng正在评估“没有”:)
考虑这段代码
Option Explicit
Sub Sample()
Dim Ret As Range
If Not getVals("Value To Match") Is Nothing Then
Set Ret = getVals("Value To Match")
MsgBox Ret.Address
Else
MsgBox "Value To Match - Not Found"
End If
End Sub
Function getVals(column As String) As Range
Dim col As Variant
Dim rng As Range
On Error GoTo Whoa
col = Application.Match(column, ThisWorkbook.ActiveSheet.Range("1:1"), 0)
Set rng = ThisWorkbook.ActiveSheet.Cells(1, col)
Set rng = rng.Offset(1, 0)
Set rng = Range(rng, rng.End(xlDown))
Set getVals = rng
Exit Function
Whoa:
Set getVals = Nothing
End Function
答案 2 :(得分:0)
首先,我不明白你在做什么。您有一个参数column
,但您正在搜索第1行中包含该值的单元格。例如,如果column = 23,P1包含23,则Match应返回16。
您的例程失败,因为如果匹配失败,则col设置为Error 2042
。在将col用作数字之前,您应该测试col。
在我的测试中,我将行1设置为随机序列中的数字。我的匹配失败,因为单元格P1包含数字23但变量列包含字符串“23”。当我将列重新分类为Long时,匹配工作。
我对Siddharth使用On Error
感到不满。我不喜欢将On Error
用于我期望的错误。我会在匹配后测试col为数字。
答案 3 :(得分:0)
其他人写作的速度比我快。 :-)还有一种可能尚未被提及。
由于您在调试时没有收到错误,因此问题可能是您使用ActiveSheet
。如果错误的工作表处于活动状态,则匹配将导致其他答案所述的错误。
如果你是明确的,错误会消失吗?
col = Application.Match(column, ThisWorkbook.Sheet(1).Range("1:1"), 0)