【问题标题】:VBA: match of a variable rangeVBA:变量范围的匹配
【发布时间】:2016-06-03 11:31:30
【问题描述】:

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

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

问题(我的示例中只填写了 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

提前致谢

【问题讨论】:

    标签: vba excel


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      1) 您正在尝试评估一个只有一个参数的 MAX() 函数。您的 IF() 函数将返回小于 6 的值或 FALSE (0)。因此,要么您的 MAX() 函数无关紧要,要么您的 IF() 函数无关紧要,或者您在其中一个/两个函数上遗漏了一个或多个参数。在任何情况下,当连续没有少于 6 个项目时要做什么,没有固定的行为。这增加了 myVar 为 0 的可能性,这很可能导致错误的结果,因为:

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

      话虽如此,但没有进一步说明您希望如何解决这些问题,这里有一个建议的解决方案(假设您希望最大值的第一次出现小于 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-19
        • 1970-01-01
        相关资源
        最近更新 更多