VBA列内重复项计数报错:If语句越界问题排查
你的VBA代码问题分析与修正方案
核心问题拆解
- 数组越界直接原因:从Excel单元格区域读取到的数组是二维数组(哪怕是单列数据),你用
colArray(a)这种一维数组的方式访问,必然触发越界错误。正确的访问格式应该是colArray(a, 1)(第二维代表列索引,单列数据固定为1)。 - 完全误用冒泡排序逻辑:你的数据已经是升序排好的,根本不需要做排序操作——冒泡排序的代码会直接打乱原有数据的顺序,完全违背你统计重复值的需求。
- 变量未声明+统计逻辑混乱:
counter、i、countStart都没提前声明,尤其是i根本没赋值就用在Offset(i-1,0)里,这会导致运行错误;而且嵌套循环里每次都写入H列,逻辑完全混乱,会重复覆盖数据。
修正后的代码(适配已排序数据)
因为数据已经是升序,只需要一次遍历就能完成重复值统计,不需要嵌套排序循环:
Option Explicit ' 强制变量声明,避免隐式错误 Sub CountSortedDuplicates() Dim dataRange As Range Dim colArray() As Variant Dim counter As Long Dim i As Long ' 获取C列从C6开始的有效数据范围 Set dataRange = Range(Range("C6"), Cells(Rows.Count, "C").End(xlUp)) colArray = dataRange.Value ' 读取为二维数组 ' 处理空数据的情况 If UBound(colArray) < LBound(colArray) Then Exit Sub ' 初始化计数器,第一个值至少出现1次 counter = 1 Range("H6").Value = counter ' 给第一个值的H列写入计数 ' 从第2行数据开始遍历,和前一行对比 For i = LBound(colArray) + 1 To UBound(colArray) If colArray(i, 1) = colArray(i - 1, 1) Then counter = counter + 1 Else counter = 1 ' 遇到不同值,重置计数器 End If ' 将计数写入对应行的H列(和C列行号一一对应) Range("H" & 6 + i - 1).Value = counter Next i End Sub
代码逻辑说明
- 用
Cells(Rows.Count, "C").End(xlUp)替代Range("C6").End(xlDown),避免中间有空行时提前终止范围选择 - 先处理空数据的边界情况,防止数组越界
- 从第二个元素开始遍历,和前一个元素对比:相同则计数+1,不同则重置为1
- 每次遍历后直接将计数写入对应行的H列,保证一行对应一个统计值
内容的提问来源于stack exchange,提问作者Katie Stearns
相关产品推荐
相关产品推荐

