Excel精英培训网

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

[已解决]下标越界

[复制链接]
发表于 2014-3-6 19:52 | 显示全部楼层 |阅读模式
本帖最后由 张雄友 于 2014-3-7 12:57 编辑

下标越界未解决。
最佳答案
2014-3-7 09:02
  1. Sub RctDataRnd()
  2.     Dim rw&, cl&, i&, j&, ii&, jj&, m&, n&, r&, t, k&, YY, crr, rng As Range, n2&
  3.     Set rng = Application.InputBox("请选择源区域", "温馨提示如A2:D21", , , , , , 8)
  4.     If rng Is Nothing Then Exit Sub
  5.     arr = rng
  6.     m = Application.CountA(rng)
  7.     rw = UBound(arr) - 1: cl = UBound(arr, 2)
  8.     n = Int(Val(InputBox("How many ?" & vbCr & " [1 to " & m & "]", "Get Rand", 12)))    '抽取个数n
  9.     If n <= 0 Or n > m Then MsgBox "HeadCounts is not correct.": Exit Sub
  10.     n2 = n
  11.     Randomize
  12.     ReDim jg$(1 To n2, 1 To 1)
  13.     For i = 1 To rw
  14.         For j = 1 To cl
  15.             Do
  16.                 r = Int(Rnd() * ((rw - i + 1) * cl - j + 1)) + (i - 1) * cl + j - 1
  17.                 ii = Int(r / cl) + 1: jj = r Mod cl + 1
  18.                 t = arr(ii, jj)
  19.                 If t <> "" Then
  20.                     arr(ii, jj) = arr(i, j): arr(i, j) = t
  21.                     jg(n, 1) = t
  22.                     n = n - 1: If n = 0 Then Exit For Else Exit Do
  23.                 End If
  24.             Loop
  25.         Next
  26.         If n = 0 Then
  27.             For j = j + 1 To cl
  28.                 arr(i, j) = ""
  29.             Next
  30.             Exit For
  31.         End If
  32.     Next


  33.     On Error Resume Next
  34.     If n2 < 65536 Then
  35.         YY = Val(InputBox("请输入要生成的列数?", ""))
  36.         r = n2 \ YY
  37.         If r * YY < n2 Then r = r + 1
  38.         ReDim crr(1 To r, 1 To YY)

  39.         For i = 1 To r
  40.             For j = 1 To YY
  41.                 crr(i, j) = jg((i - 1) * YY + j, 1)
  42.             Next j
  43.         Next i
  44.         Set rng = Application.InputBox("请选择存放区域(单个单元格即可)", "VBA", , , , , , 8)
  45.         rng.CurrentRegion.ClearContents
  46.         rng.Resize(r, YY) = crr
  47.     End If
  48. End Sub
复制代码
改成这样,数据能出来,不知道合不合要求。
另外,你前面那一段数据换位的,不知道是啥意思。

一下午都在下标越界.rar

12.27 KB, 下载次数: 6

发表于 2014-3-6 22:33 | 显示全部楼层
ReDim jg$(1 to n, 1 To 1) 出现错误,程序运行到这里时n=0
且jg前面也没有出现过,现在jg又进行了ReDim,必然是空数组,后面运算crr(i, j) = jg((i - 1) * YY + j, j) 的结果还是空的,什么也没有,可能改为crr(i, j) =arr((i - 1) * YY + j, j) 还有指望一些。
回复

使用道具 举报

 楼主| 发表于 2014-3-6 22:36 | 显示全部楼层
zgwei050 发表于 2014-3-6 22:33
ReDim jg$(1 to n, 1 To 1) 出现错误,程序运行到这里时n=0
且jg前面也没有出现过,现在jg又进行了ReDim, ...

一天没搞明白
回复

使用道具 举报

发表于 2014-3-6 22:45 | 显示全部楼层
QQ截图20140306224704.jpg

这个错误已经很明显了,前面的双重循环都不用看,就在循环结束后这一行下个断点,就发现问题了。
回复

使用道具 举报

 楼主| 发表于 2014-3-6 22:52 | 显示全部楼层
hwc2ycy 发表于 2014-3-6 22:45
这个错误已经很明显了,前面的双重循环都不用看,就在循环结束后这一行下个断点,就发现问题了。

怎么改好?
回复

使用道具 举报

发表于 2014-3-6 22:53 | 显示全部楼层
jg数组自始就没有赋过值,输出没有意义。
回复

使用道具 举报

发表于 2014-3-6 22:59 | 显示全部楼层
  1. Sub RctDataRnd()    '输出列数修改,输出的列数可以用 inputbox 来选择,假如用  inputbox 来选择输出,可以是1 列,5列,......用户可以根据需要决定,人性化。
  2.     Dim rw&, cl&, i&, j&, ii&, jj&, m&, n&, r&, t, k&, YY, crr, rng As Range, n2%
  3.     Set rng = Application.InputBox("请选择源区域", "温馨提示如A2:D21", , , , , , 8)
  4.     If rng Is Nothing Then Exit Sub
  5.     arr = rng
  6.     m = Application.CountA(rng)
  7.     rw = UBound(arr) - 1: cl = UBound(arr, 2)
  8.     n = Int(Val(InputBox("How many ?" & vbCr & " [1 to " & m & "]", "Get Rand", 12)))    '抽取个数n
  9.     If n <= 0 Or n > m Then MsgBox "HeadCounts is not correct.": Exit Sub
  10.     n2 = n
  11.     Randomize
  12.     For i = 1 To rw
  13.         For j = 1 To cl
  14.             Do
  15.                 r = Int(Rnd() * ((rw - i + 1) * cl - j + 1)) + (i - 1) * cl + j - 1
  16.                 ii = Int(r / cl) + 1: jj = r Mod cl + 1
  17.                 t = arr(ii, jj)
  18.                 If t <> "" Then
  19.                     arr(ii, jj) = arr(i, j): arr(i, j) = t
  20.                     n = n - 1: If n = 0 Then Exit For Else Exit Do
  21.                 End If
  22.             Loop
  23.         Next
  24.         If n = 0 Then
  25.             For j = j + 1 To cl
  26.                 arr(i, j) = ""
  27.             Next
  28.             Exit For
  29.         End If
  30.     Next
  31.     '[a1].Offset(1, cl + 1).Resize(i, cl) = arr '输出列数?????
  32.     ReDim jg$(1 To n2, 1 To 1)

  33.     On Error Resume Next
  34.     If n2 < 65536 Then
  35.         YY = Val(InputBox("请输入要生成的列数?", ""))
  36.         r = n2 \ YY
  37.         If r * YY < n2 Then r = r + 1
  38.         ReDim crr(1 To r, 1 To YY)

  39.         For i = 1 To r
  40.             For j = 1 To YY
  41.                 crr(i, j) = jg((i - 1) * YY + j, 1)
  42.             Next j
  43.         Next i
  44.         Set rng = Application.InputBox("请选择存放区域(单个单元格即可)", "VBA", , , , , , 8)
  45.         rng.CurrentRegion.ClearContents
  46.         rng.Resize(r, YY) = crr
  47.     End If
  48. End Sub
复制代码
后面的jg数组赋值的问题你自己想下,是怎么回事。
回复

使用道具 举报

 楼主| 发表于 2014-3-6 23:05 | 显示全部楼层
hwc2ycy 发表于 2014-3-6 22:59
后面的jg数组赋值的问题你自己想下,是怎么回事。

没有数据出来的?

一下午都在下标越界.rar

12.08 KB, 下载次数: 1

回复

使用道具 举报

发表于 2014-3-7 08:57 | 显示全部楼层
张雄友 发表于 2014-3-6 23:05
没有数据出来的?

你在空的数组里取值,然后写入单元格,单元格相当于没写一样,全是空的嘛。
回复

使用道具 举报

发表于 2014-3-7 09:02 | 显示全部楼层    本楼为最佳答案   
  1. Sub RctDataRnd()
  2.     Dim rw&, cl&, i&, j&, ii&, jj&, m&, n&, r&, t, k&, YY, crr, rng As Range, n2&
  3.     Set rng = Application.InputBox("请选择源区域", "温馨提示如A2:D21", , , , , , 8)
  4.     If rng Is Nothing Then Exit Sub
  5.     arr = rng
  6.     m = Application.CountA(rng)
  7.     rw = UBound(arr) - 1: cl = UBound(arr, 2)
  8.     n = Int(Val(InputBox("How many ?" & vbCr & " [1 to " & m & "]", "Get Rand", 12)))    '抽取个数n
  9.     If n <= 0 Or n > m Then MsgBox "HeadCounts is not correct.": Exit Sub
  10.     n2 = n
  11.     Randomize
  12.     ReDim jg$(1 To n2, 1 To 1)
  13.     For i = 1 To rw
  14.         For j = 1 To cl
  15.             Do
  16.                 r = Int(Rnd() * ((rw - i + 1) * cl - j + 1)) + (i - 1) * cl + j - 1
  17.                 ii = Int(r / cl) + 1: jj = r Mod cl + 1
  18.                 t = arr(ii, jj)
  19.                 If t <> "" Then
  20.                     arr(ii, jj) = arr(i, j): arr(i, j) = t
  21.                     jg(n, 1) = t
  22.                     n = n - 1: If n = 0 Then Exit For Else Exit Do
  23.                 End If
  24.             Loop
  25.         Next
  26.         If n = 0 Then
  27.             For j = j + 1 To cl
  28.                 arr(i, j) = ""
  29.             Next
  30.             Exit For
  31.         End If
  32.     Next


  33.     On Error Resume Next
  34.     If n2 < 65536 Then
  35.         YY = Val(InputBox("请输入要生成的列数?", ""))
  36.         r = n2 \ YY
  37.         If r * YY < n2 Then r = r + 1
  38.         ReDim crr(1 To r, 1 To YY)

  39.         For i = 1 To r
  40.             For j = 1 To YY
  41.                 crr(i, j) = jg((i - 1) * YY + j, 1)
  42.             Next j
  43.         Next i
  44.         Set rng = Application.InputBox("请选择存放区域(单个单元格即可)", "VBA", , , , , , 8)
  45.         rng.CurrentRegion.ClearContents
  46.         rng.Resize(r, YY) = crr
  47.     End If
  48. End Sub
复制代码
改成这样,数据能出来,不知道合不合要求。
另外,你前面那一段数据换位的,不知道是啥意思。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-2 06:04 , Processed in 0.472668 second(s), 11 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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