Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 尝试将范围作为函数输出返回,是否获取类型不匹配?_Excel_Vba - Fatal编程技术网

Excel 尝试将范围作为函数输出返回,是否获取类型不匹配?

Excel 尝试将范围作为函数输出返回,是否获取类型不匹配?,excel,vba,Excel,Vba,以下函数返回“类型不匹配”。我不明白,因为我注意到使用“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

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

由于Match无法找到所需内容,因此您的rng计算结果为“nothing”:

考虑一下这个代码

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

您得到该错误是因为Match无法找到您想要的内容,因此您的rng计算结果为“nothing”:

考虑一下这个代码

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

首先,我不明白你在做什么。您有一个参数
,但您正在第1行中搜索包含该值的单元格。例如,如果列=23,且P1包含23,则Match应返回16

您的例程失败,因为如果匹配失败,col设置为
错误2042
。在将col用作数字之前,应先测试col

在我的测试中,我将第1行设置为随机序列中的数字。我的匹配失败,因为单元格P1包含数字23,但变量列包含字符串“23”。当我将列重新分类为Long时,匹配成功了


我对Siddharth在出错时使用的
感到不满。我不喜欢对错误使用
来处理我预期的错误。我会在比赛后测试col是否为数字。

首先,我不明白你在做什么。您有一个参数
,但您正在第1行中搜索包含该值的单元格。例如,如果列=23,且P1包含23,则Match应返回16

您的例程失败,因为如果匹配失败,col设置为
错误2042
。在将col用作数字之前,应先测试col

在我的测试中,我将第1行设置为随机序列中的数字。我的匹配失败,因为单元格P1包含数字23,但变量列包含字符串“23”。当我将列重新分类为Long时,匹配成功了


我对Siddharth在出错时使用的
感到不满。我不喜欢对错误使用
来处理我预期的错误。比赛结束后,我会测试col是否为数字。

其他人的书写速度比我快。:-)还有一种可能性尚未提及

由于调试时没有出现错误,问题可能是您使用了
ActiveSheet
。如果激活了错误的工作表,则“匹配”将导致其他答案所述的错误

如果你是明确的,错误会消失吗

col = Application.Match(column, ThisWorkbook.Sheet(1).Range("1:1"), 0)

其他人写得比我快。:-)还有一种可能性尚未提及

由于调试时没有出现错误,问题可能是您使用了
ActiveSheet
。如果激活了错误的工作表,则“匹配”将导致其他答案所述的错误

如果你是明确的,错误会消失吗

col = Application.Match(column, ThisWorkbook.Sheet(1).Range("1:1"), 0)

要以值数组的形式返回结果,只需将返回类型更改为
Variant
并返回
rng.Value
。只要传递的
字符串存在于
thiswoolk.ActiveSheet.Range(“1:1”)
中,下面的代码就适用于我


要以值数组的形式返回结果,只需将返回类型更改为
Variant
并返回
rng.Value
。只要传递的
字符串存在于
thiswoolk.ActiveSheet.Range(“1:1”)
中,下面的代码就适用于我


人们总是可以选择在错误处理中添加更多代码。如果你知道你可能会面临什么样的错误,不妨像你正确地提到的那样抓住它。以上只是一个没有找到匹配项的示例:)@Siddharth Rout。我的话听起来比我想的更挑剔。我注意到您通常在错误中包含
。我同意,我们应该为意想不到的事情做计划。我唯一的批评,你不解释为什么。虽然我们得到OP的关注,但我认为我们应该提供比他们严格需要的更多的背景、背景和建议,因为这将帮助他们发展和成长。我从小就知道不检查错误的代价。也许我做得太多了,但我的强迫性错误检查确实有助于找出问题的原因。这是我试图将其传给下一代的一个教训。我同意你的观点:)下次将尝试在代码中包含更多注释。谢谢你的建设性批评:)谢谢,但我认为这不是我问题的原因。列是一个字符串,因此您首先描述的行为就是针对它的行为。我知道我没有处理错误2042,但这里的问题是其他的。在错误处理中,人们总是可以选择添加更多代码。如果你知道你可能会面临什么样的错误,不妨像你正确地提到的那样抓住它。以上只是一个没有找到匹配项的示例:)@Siddharth Rout。我的话听起来比我想的更挑剔。我注意到您通常在错误中包含
。我同意,我们应该为意想不到的事情做计划。我唯一的批评,你不解释为什么。虽然我们得到OP的关注,但我认为我们应该提供比他们严格需要的更多的背景、背景和建议,因为这将帮助他们发展和成长。我从小就知道不检查错误的代价。也许我做得太多了,但我的强迫性错误检查确实有助于找出问题的原因。这是我试图将其传给下一代的一个教训。我同意你的观点:)下次将尝试在代码中包含更多注释。谢谢你的建设性批评:)谢谢,但我认为这不是我问题的原因。列是一个字符串,因此您首先描述的行为就是针对它的行为。我知道