vba 数组下标越界

Sub多列分项累计()Dimarr1()[f1].Resize(1,4)=(Range("a1:d1"))[j1]="次数"Setd=CreateObject("scri... Sub 多列分项累计()
Dim arr1()
[f1].Resize(1, 4) = (Range("a1:d1"))
[j1] = "次数"
Set d = CreateObject("scripting.dictionary")
arr = Range("a2:d" & Cells(Rows.Count, 2).End(xlUp).Row)
For i = 1 To UBound(arr)
If Not d.Exists(arr(i, 1)) Then
n = n + 1
d(arr(i, 1)) = n
ReDim Preserve arr1(1 To n, 1 To 5) ‘此处越界,为什么?
arr1(n, 1) = arr(i, 1)
arr1(n, 2) = arr(i, 2)
arr1(n, 3) = arr(i, 3)
arr1(n, 4) = arr(i, 4)
arr1(n, 5) = 1

Else
m = d(arr(i, 1))
arr1(m, 2) = arr1(m, 2) + arr(i, 2)
arr1(m, 3) = arr1(m, 3) + arr(i, 3)
arr1(m, 4) = arr1(m, 4) + arr(i, 4)
arr1(m, 5) = arr1(m, 5) + 1

End If
Next
[f2].Resize(n, 5) = arr1()
End Sub
展开
 我来答
姓王的wy451

2017-08-30 · TA获得超过48.3万个赞
知道大有可为答主
回答量:8万
采纳率:78%
帮助的人:8951万
展开全部
原因是用了Preserve参数,如果要保留数组原有数据,重定义数组是只能修改末维的下标,你修改一维下标,当然不行呀。两个解决方法:
1、一次性确定数组下标能满足数据的需要,如果不好确定就取Arr的行数,将数组定义语句放在循环体前:
ReDim arr1(1 To ubound(arr), 1 To 5)
2、Arr1的行列互换(也就是一维和二维互换),保存时再转置一下。
syx54
2017-08-31 · TA获得超过7379个赞
知道大有可为答主
回答量:6567
采纳率:83%
帮助的人:2768万
展开全部
要注意使用ReDim语句的2点:
1,ReDim在不使用Preserve时可以改变数组的维数以及任意维度上的下标。
2,ReDim Preserve只可以改变数组的最后一个维度的下标的上界。
在这里,你违反了上面第2点。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式