如何用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
相关产品推荐
相关产品推荐

