VBA:可变范围的匹配

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

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

问题(我的例子中只填写了A到C;不相关,因为它不适用于几个星座)。

ABC

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 

提前致谢

更改myVarAdress = Application.WorksheetFunction.Match(myVar, Range("A" & I & ":M" & I))
myVarAdress = Application.WorksheetFunction.Match(myVar, Range("A" & I & ":M" & I), 0)
那“0”意味着你正在寻找完全匹配。 你也应该添加一个条件来跳过你的“myVar”variables的0值。 例如:

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

您的设置有几个不同的问题,必须解决才能find真正的解决scheme。

1)你正试图评估一个MAX()函数,它只有一个参数。 您的IF()函数将返回小于6的值,或者返回FALSE(0)。 所以无论你的MAX()函数是不相关的,你的IF()函数是不相关的,或者你在这两个函数中都遗漏了一个或多个参数。 无论如何,当没有连续的小于6的项目时,没有设定的行为。 这提高了myVar为0的可能性,这可能导致错误的结果,因为:

2)你遗漏了MATCH()函数中的第三个参数。 因为您的范围(当前)比您的数据集大(当前),当您closuresMATCH()的第三个参数时,只要数据组织不正确,就会失败。 当你从你的IF()函数返回FALSE(MAX()被视为0)时,这是特别有问题的,因为MATCH()与你的数据中的空白相匹配。 这意味着你的数据集的大小是重要的。 如果你已经填满了所有的13行,你的第一行可能(可能)不会失败,但是如果列B的右边有小于5的值,它实际上不会匹配到你想要的5行。同样,如果在任何列中突然没有低于6的值, 并且 MATCH()没有find和处理为0的空白,可能会导致其他一些行失败。

所有这一切都是说,没有进一步澄清你要如何清理这些问题,这里是一个build议的解决scheme(假设你想要第一次出现你的最大值小于6,无论有多less事件):

 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