VBA:可变范围的匹配

时间:2016-06-03 11:31:31

标签: excel vba excel-vba

我有问题。对于某个电子表格,我想找出小于阈值的值的位置(仅列)(进一步称为maxt)。我必须在VBA中解决这个问题,因为我需要在不同的工作表上给出累积的数字。

我能够检索小于阈值的最大值,但是vba匹配函数会返回一个错误,即无法找到该数字。 但是,如果将值maxt复制到单元格并且我使用包含maxt作为条件的单元格上的常规匹配函数(= MATCH(maxt的单元格;范围),则它可以正常工作。

问题(我的示例中只填充了A到C;不相关,因为它只对几个星座起作用)。

A B C

8 5 6 - >不起作用(错误:1004)

5 6 7 - >作品

7 6 7 - >作品

4 8 5 - >作品

以下是代码。

Dim myVar As Double
Dim myVarAdress As Long

For I = 1 To 10
myVar = Evaluate("=MAX(IF(A" & I & ":M" & I & "<6, A" & I & ":M" & I &   "))")
myVarAdress = Application.WorksheetFunction.Match(myVar, Range("A" & I & ":M" & I))

Next I

End Sub

提前致谢

2 个答案:

答案 0 :(得分:0)

更改myVarAdress = Application.WorksheetFunction.Match(myVar, Range("A" & I & ":M" & I))
myVarAdress = Application.WorksheetFunction.Match(myVar, Range("A" & I & ":M" & I), 0)
“0”表示您正在寻找完全匹配。你还应该添加一个条件,它将跳过你的“myVar”变量的0值。例如:

If myVar > 0 Then
    myVarAdress = Application.WorksheetFunction.Match(myVar, Range("A" & i & ":M" & i), 0)
End If

答案 1 :(得分:0)

在找到真正的解决方案之前,您的设置有两个必须解决的问题。

1)您正在尝试评估MAX()函数,该函数只有一个参数。您的IF()函数将返回小于6的值,或FALSE(0)。因此,无论你的MAX()函数是无关紧要的,你的IF()函数是无关紧要的,或者你在这两个函数中都有一个或多个参数。在任何情况下,当没有连续小于6的项目时,没有设置行为。这提高了myVar为0的可能性,这可能会导致错误的结果,因为:

2)你在MATCH()函数中省略了第三个参数。因为您的范围(当前)大于您的数据集,所以当您不使用MATCH()的第三个参数时,只要数据组织不正确,它就会失败。当您从IF()函数返回FALSE(由MAX()视为0)时,这尤其成问题,因为MATCH()与数据中的空白匹配。这意味着数据集的大小确实很重要。如果你已经填写了所有13行,你的第一行(可能)不会失败,但如果列B右边的任何值低于5,它实际上不会匹配你想要它的5行。此外,它如果在的任何列中突然没有任何低于6的值,则可能导致其他一些行失败。对于MATCH()没有空白来查找和视为0。

所有这一切,如果没有进一步澄清你想要如何清理这些问题,这里提出的解决方案(假设您希望第一次出现的最大值小于6,无论有多少次出现) :

Sub MatchSub()

Dim myVar As Double
Dim myVarAdress As Long

Dim rngMaxT As Range

Dim wsFindMax As Worksheet
Set wsFindMax = ActiveSheet

For i = 1 To 10
    myVar = Evaluate("=IF(A" & i & ":M" & i & "<6, A" & i & ":M" & i & ")")
    Set rngMaxT = wsFindMax.UsedRange.Rows(i)
    If rngMaxT(1, 1).Value = myVar Then
        myvaraddress = 1
    Else
        Set rngMaxT = rngMaxT.Find(myVar, , xlValues, xlWhole, xlByRows, xlNext, False)
        If rngMaxT Is Nothing Then
            'There is no value in the row less than 6
        Else
            myVarAdress = rngMaxT.Column
        End If
    End If

Next i

End Sub