我有问题。对于某个电子表格,我想找出小于阈值的值的位置(仅列)(进一步称为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
提前致谢
答案 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