VBA提取带表头A列唯一值统计重复数时报错下标越界如何解决
报错原因
你读取A列数据时已经跳过了表头,取的是A2:A&lastR的范围存入数组arr,这个数组的有效行数是lastR - 1,但原代码的循环逻辑还是按全表行数lastR遍历,当循环变量i超过数组的最大下标时,访问arr(i,1)就会触发下标越界的运行时错误9。
适配带表头场景的修正代码
Sub uniqueValues() Dim sh As Worksheet, lastR As Long, arr, arrFin, i As Long, dict As Object Set sh = ActiveSheet '可替换为你需要处理的工作表,比如Set sh = Sheets("Sheet1") lastR = sh.Range("A" & sh.Rows.Count).End(xlUp).Row arr = sh.Range("A2:A" & lastR).Value '补全工作表对象引用,避免取错范围 Set dict = CreateObject("Scripting.Dictionary") ' 循环上限改为数组的最大行下标,避免越界 For i = 1 To UBound(arr, 1) dict(arr(i, 1)) = dict(arr(i, 1)) + 1 Next i arrFin = Application.Transpose(Array(dict.Keys, dict.items)) sh.Range("B2").Resize(dict.Count, 2).Value = arrFin End Sub
修改说明
- 将循环的遍历上限从
lastR改为UBound(arr, 1),直接读取数组的最大行下标,不管数据行数多少都不会越界,适配性更强 - 给读取A列范围的代码补全了工作表对象
sh.,避免当前激活工作表不是目标表时读取错误数据 - 代码保留了原逻辑,运行后会自动把A列的唯一值从B2开始输出,对应重复次数从C2开始输出,完全匹配你需要的带表头场景的效果
内容的提问来源于stack exchange,提问作者visshnu
相关产品推荐
相关产品推荐

