You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用VBA判断Excel A列各值是否落在B/C列任意数值区间内

需求说明
  • A列存储约2000个待校验数值
  • B、C列存储多组数值区间,B列为区间起始值、C列为区间结束值,区间与A列数值无逐行对应关系
  • 校验规则:针对A列每一个数值,判断其是否落在B/C列定义的任意一个区间范围内,最终在D列对应行返回TRUE/FALSE结果,结果与A列数值一一对应
  • 示例效果参考:
    表格示例

校验逻辑示例:判断A2单元格的值时,需要依次校验是否匹配B2-C2、B3-C3、B4-C4……所有B/C列定义的区间,命中任意一个区间即返回TRUE,全部不命中返回FALSE;A3、A4等其余A列单元格按相同逻辑处理。

原有代码问题

原代码未对B/C列的区间做逐行遍历,直接将单个A列数值与整列B、整列C的多单元格区域做大小比较,无法实现逐区间匹配的逻辑,无法返回正确结果。

修正后可运行VBA代码
Sub CheckRg()
    Dim wk As Worksheet
    Dim aLastRow As Long, bcLastRow As Long
    Dim i As Long, j As Long
    Dim isMatch As Boolean
    
    Set wk = Sheet1
    ' 分别获取A列、B列的最后有效行号
    aLastRow = wk.Range("A" & wk.Rows.Count).End(xlUp).Row
    bcLastRow = wk.Range("B" & wk.Rows.Count).End(xlUp).Row
    
    ' 外层遍历A列所有待校验数值
    For i = 2 To aLastRow
        isMatch = False
        ' 内层遍历所有B/C列定义的数值区间
        For j = 2 To bcLastRow
            ' 跳过区间起始/结束值为空的无效行
            If Not IsEmpty(wk.Range("B" & j)) And Not IsEmpty(wk.Range("C" & j)) Then
                ' 判断当前A列值是否落在当前遍历到的区间内
                If wk.Range("A" & i).Value >= wk.Range("B" & j).Value _
                    And wk.Range("A" & i).Value <= wk.Range("C" & j).Value Then
                    isMatch = True
                    Exit For ' 命中任意区间即提前终止内层循环,减少冗余计算
                End If
            End If
        Next j
        ' 将判断结果写入D列对应行
        wk.Range("D" & i).Value = isMatch
    Next i
End Sub
代码说明
  • 分开计算A列待校验数据、B/C列区间数据的最后有效行,适配两类数据行数不一致的场景
  • 双层循环逻辑完全匹配需求:外层逐个处理A列数值,内层逐个核对所有区间
  • 命中区间后立即跳出内层循环,2000行量级数据计算速度极快,无卡顿问题
  • 自动识别并跳过B/C列的空行,避免无效值干扰判断结果
  • 直接输出布尔类型的TRUE/FALSE,与Excel原生逻辑函数返回格式一致,可直接参与后续公式计算

内容的提问来源于stack exchange,提问作者JMML

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 10:06:20