Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 3303|回复: 2

[已解决]为何总是下标越界。

[复制链接]
发表于 2014-3-3 05:06 | 显示全部楼层 |阅读模式
本帖最后由 北漂的猪 于 2014-3-3 05:17 编辑

总是显示下标越界
但是数据量少的时候却可以运行

最佳答案
2014-3-3 08:17
你的数组brr定义得太小啦!
Sub aa()
Dim i%, j%, k%, n%, x%, y%, arr, brr(1 To 10000, 1 To 2000), d1 As Object, d2 As Object
Set d1 = CreateObject("scripting.dictionary")
Set d2 = CreateObject("scripting.dictionary")
arr = Range("A2:B" & Range("A" & Rows.Count).End(3).Row)
x = 1: y = 1
For i = 1 To UBound(arr)
    If Not d1.Exists(arr(i, 2)) Then
        x = x + 1
        d1(arr(i, 2)) = x
        brr(x, 1) = arr(i, 2)
    End If
    If Not d2.Exists(arr(i, 1)) Then
        y = y + 1
        d2(arr(i, 1)) = y
        brr(1, y) = arr(i, 1)
    End If
    brr(d1(arr(i, 2)), d2(arr(i, 1))) = brr(d1(arr(i, 2)), d2(arr(i, 1))) + 1
Next
Dim crr()
ReDim crr(1 To x - 1, 1 To 7)
For i = 2 To x
    crr(i - 1, 1) = brr(i, 1)
    For j = 2 To y
        For k = 1 To 3
            If brr(i, j) > crr(i - 1, k + 4) Then
                For n = 3 To k + 1 Step -1
                    crr(i - 1, n + 1) = crr(i - 1, n)
                    crr(i - 1, n + 4) = crr(i - 1, n + 3)
                Next
                crr(i - 1, k + 1) = brr(1, j)
                crr(i - 1, k + 4) = brr(i, j)
                Exit For
            End If
        Next
    Next
Next
[G7].Resize(1, 4) = Array("CODE", "DEVICES里出现次数最多", "出现次数第二多", "出现次数第三多")
[G8].Resize(x - 1, 4) = crr
End Sub

help.zip

103.1 KB, 下载次数: 10

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2014-3-3 08:17 | 显示全部楼层    本楼为最佳答案   
你的数组brr定义得太小啦!
Sub aa()
Dim i%, j%, k%, n%, x%, y%, arr, brr(1 To 10000, 1 To 2000), d1 As Object, d2 As Object
Set d1 = CreateObject("scripting.dictionary")
Set d2 = CreateObject("scripting.dictionary")
arr = Range("A2:B" & Range("A" & Rows.Count).End(3).Row)
x = 1: y = 1
For i = 1 To UBound(arr)
    If Not d1.Exists(arr(i, 2)) Then
        x = x + 1
        d1(arr(i, 2)) = x
        brr(x, 1) = arr(i, 2)
    End If
    If Not d2.Exists(arr(i, 1)) Then
        y = y + 1
        d2(arr(i, 1)) = y
        brr(1, y) = arr(i, 1)
    End If
    brr(d1(arr(i, 2)), d2(arr(i, 1))) = brr(d1(arr(i, 2)), d2(arr(i, 1))) + 1
Next
Dim crr()
ReDim crr(1 To x - 1, 1 To 7)
For i = 2 To x
    crr(i - 1, 1) = brr(i, 1)
    For j = 2 To y
        For k = 1 To 3
            If brr(i, j) > crr(i - 1, k + 4) Then
                For n = 3 To k + 1 Step -1
                    crr(i - 1, n + 1) = crr(i - 1, n)
                    crr(i - 1, n + 4) = crr(i - 1, n + 3)
                Next
                crr(i - 1, k + 1) = brr(1, j)
                crr(i - 1, k + 4) = brr(i, j)
                Exit For
            End If
        Next
    Next
Next
[G7].Resize(1, 4) = Array("CODE", "DEVICES里出现次数最多", "出现次数第二多", "出现次数第三多")
[G8].Resize(x - 1, 4) = crr
End Sub
回复

使用道具 举报

发表于 2014-3-3 08:29 | 显示全部楼层
测试了一下,你的数据运行后,x值为16,而y值为1535,在你的代码里,y是跟数组brr的第二维相关的,而你定义的数组brr(1 to 10000,1 to 1000),y值超过了brr第二维的下标,所以会出现下标越界的提示
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-3-29 16:39 , Processed in 0.533204 second(s), 10 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表