Excel 尝试将范围作为函数输出返回,是否获取类型不匹配?
以下函数返回“类型不匹配”。我不明白,因为我注意到使用“Set”指令返回结果范围 我调试了函数,得到了一个合适的返回范围,所以问题出在别处。。嗯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
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的关注,但我认为我们应该提供比他们严格需要的更多的背景、背景和建议,因为这将帮助他们发展和成长。我从小就知道不检查错误的代价。也许我做得太多了,但我的强迫性错误检查确实有助于找出问题的原因。这是我试图将其传给下一代的一个教训。我同意你的观点:)下次将尝试在代码中包含更多注释。谢谢你的建设性批评:)谢谢,但我认为这不是我问题的原因。列是一个字符串,因此您首先描述的行为就是针对它的行为。我知道