【问题标题】:VBA to check if multiple values fall within multiple rangesVBA检查多个值是否在多个范围内
【发布时间】:2022-06-10 21:03:04
【问题描述】:

我在 Excel 的 A 列中有一个大约 2000 个值的列表,然后在接下来的两列中有一个值范围的开始和结束的列表。范围值与第一列中的值不对应。我想检查 A 列中的每个值,该值是否在 B 列和 C 列中列出的任何范围内。

例如,在下图中,查看 A2 是否属于 B2-C2、B3-C3 或 B4-C4。然后对于 A3 和 A4 也是如此。对于其中的每一个,我希望在 D 列中输入真/假。真/假值将对应于 A 列中的值。

我一直在尝试在 VBA 中执行此操作,但我对让它搜索范围并不完全有信心。当前代码如下。

Sub CheckRg()
Dim wk As Worksheet, frow As Long, i As Long

Set wk = Sheet1
frow = wk.Range("A" & Rows.Count).End(xlUp).Row

For i = 2 To frow
    If wk.Range("A" & i).Value >= wk.Range("B:B").Value And wk.Range("A" & i).Value <= wk.Range("C:C").Value Then
    wk.Range("D" & i).Value = "TRUE"
    Else
        wk.Range("D" & i).Value = "FALSE"
    End If
Next i

End Sub

【问题讨论】:

  • 我现在已经更新了代码 - 如果有人能告诉我哪里出错了,我将不胜感激! Sub CheckRg() Dim wk As Worksheet, frow As Long, i As Long Set wk = Sheet1 frow = wk.Range("A" & Rows.Count).End(xlUp).Row For i = 2 To frow For j = 2 皱眉 If wk.Range("A" & i).Value >= wk.Range("B" & j).Value And wk.Range("A" & i).Value
  • wk.Range("B:B").Value 不会按您的预期工作。无论如何:为什么是 VBA?一个简单的公式就可以解决问题。

标签: excel vba


【解决方案1】:

这个公式在没有 VBA 的情况下应该可以解决问题:

=COUNTIFS($B:$B,"<="&A2,$C:$C,">="&A2)<>0

您可以像这样在代码中使用它:

Sub CheckRg()
    
    Dim wk As Worksheet, frow As Long, i As Long
    
    Set wk = Sheet1
    frow = wk.Range("A" & Rows.Count).End(xlUp).Row
    
    For i = 2 To frow
        With Excel.WorksheetFunction
            wk.Range("D" & i).Value = .CountIfs(wk.Range("B:B"), Evaluate("""<=""" & "&A" & i), wk.Range("C:C"), Evaluate(""">=""" & "&A" & i)) <> 0
        End With
    Next i

End Sub

【讨论】:

    【解决方案2】:

    低效的双循环

    • Evil Blue Monkey 的解决方案中提出了一种更好的方法。
    • 您需要检查A 列中的每个单元格与BC 列中的每个单元格对,这需要第二个循环来减慢在预期有数千行时的操作。
    • 这里有一个例子说明你可以如何去做。
    Sub CheckRg()
        
        Dim ws As Worksheet: Set ws = Sheet1
        Dim lRow As Long: lRow = ws.Range("A" & Rows.Count).End(xlUp).Row
    
        Application.ScreenUpdating = False
        
        Dim i As Long
        Dim j As Long
        Dim MatchFound As Boolean
        
        For i = 2 To lRow
            For j = 2 To lRow
                If ws.Range("A" & i).Value >= ws.Range("B" & j).Value _
                        And ws.Range("A" & i).Value <= ws.Range("C" & j).Value Then
                    MatchFound = True
                    Exit For
                End If
            Next j
            If MatchFound Then
                ws.Range("D" & i).Value = True
                MatchFound = False
            Else
                ws.Range("D" & i).Value = False
            End If
        Next i
    
        Application.ScreenUpdating = True
    
        MsgBox "Range checked.", vbInformation
    
    End Sub
    

    【讨论】:

      猜你喜欢
      • 2018-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多