试图将范围作为函数输出返回,导致类型不匹配?

时间:2012-01-13 19:04:19

标签: excel-vba vba excel

以下函数返回“类型不匹配”。我不明白,因为我注意使用“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作为结果传递,但没有成功。

4 个答案:

答案 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)