ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 419|回复: 5

求解1048577的下标越界

[复制链接]

TA的精华主题

TA的得分主题

发表于 2023-4-20 21:34 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
Sub 按钮2_Click()
Dim WD As Worksheet
Set WD = ThisWorkbook.Sheets("排列")
Dim arr1() As Variant
Dim brr1()
arr1 = WD.Range("AZ3:BG1227").Value
Dim A, B, C, D, E As Integer
Dim a1, b1, c1, d1, e1 As Integer
Dim H As Long
ReDim brr1(1 To 1048576, 1 To 5)
H = 0
For A = 1 To 1224
If arr1(A, 1) <> "" And arr1(A, 2) <> "" Then
  a1 = arr1(A, 1)
   b1 = arr1(A, 2)
For B = 1 To 1224
If arr1(B, 3) <> "" And arr1(B, 4) <> "" Then
  If arr1(B, 3) = b1 Then
   c1 = arr1(B, 4)
For C = 1 To 1224
If arr1(C, 5) <> "" And arr1(C, 6) <> "" Then
  If arr1(C, 5) = c1 Then
   d1 = arr1(C, 6)
For D = 1 To 1224
If arr1(D, 7) <> "" And arr1(D, 8) <> "" Then
  If arr1(D, 7) = d1 Then
   e1 = arr1(D, 8)
H = H + 1
brr1(H, 1) = a1
brr1(H, 2) = b1
  brr1(H, 3) = c1
   brr1(H, 4) = d1
    brr1(H, 5) = e1
End If
End If
  Next D
End If
End If
  Next C
End If
End If
  Next B
End If
  Next A
WD.Range("CS3").Resize(H, 5) = brr1
Erase arr1()
Erase brr1()

Dim WE As Worksheet
Set WE = ThisWorkbook.Sheets("概率和踢号")
Set WD = ThisWorkbook.Sheets("排列")
Dim A2, B2, C2, D2, E2 As Integer
Dim a3, b3, c3, d3, e3 As Integer
Dim dd1, dd2, dd3, dd4, dd5 As Integer
Dim ad, bd, cd, dd, ed As Single
Dim f4, g4, h4 As Integer
Dim f, f1, f2 As Single
Dim G, G1, G2 As Integer
Dim AB, H1 As Long
Dim arr2(), arr3(), arr4() As Variant
Dim brr3() As Variant
arr2 = WE.Range("BQ2159:BW2193").Value
  arr3 = WE.Range("CE2153:CL2253").Value
   arr4 = WD.Range("CS" & 3 & ":CW" & H)
ReDim brr3(1 To 1048576, 1 To 5)

H1 = 0
For AB = 1 To H
dd1 = arr4(AB, 1)
  dd2 = arr4(AB, 2)
   dd3 = arr4(AB, 3)
    dd4 = arr4(AB, 4)
     dd5 = arr4(AB, 5)
For A2 = 1 To 35
If arr2(A2, 1) = dd1 Then
  ad = arr2(A2, 3)
If ad > 0 Then

For B2 = 1 To 35
If arr2(B2, 1) = dd2 Then
  bd = arr2(B2, 4)
If bd > 0 Then

For C2 = 1 To 35
If arr2(C2, 1) = dd3 Then
  cd = arr2(C2, 5)
If cd > 0 Then
   f = ad * bd * cd

For G = 1 To 101
If arr3(G, 1) > f Then
  f4 = arr3(G, 2)
If f4 > 3 Then

a3 = arr4(AB, 1)
b3 = arr4(AB, 2)
  c3 = arr4(AB, 3)

For D2 = 1 To 35
If arr2(D2, 1) = dd4 Then
  ed = arr2(D2, 6)
If ed > 0 Then
  f1 = f * ed

For G1 = 1 To 101
If arr3(G1, 4) > f1 Then
  g4 = arr3(G1, 5)
If g4 > 3 Then
  d3 = dd4

For E2 = 1 To 35
If arr2(E2, 1) = dd5 Then
  gd = arr2(E2, 7)
If gd > 0 Then
  f2 = f1 * gd

For G2 = 1 To 101
If arr3(G2, 4) > f2 Then
   h4 = arr3(G2, 8)
If h4 > 3 Then
   e3 = dd5

H1 = H1 + 1     (总提示这里下标越界9,上面重定义1 To 1048576,这里实际为1048577.好像1048577就是1)什么问题???
brr3(H1, 1) = a3
brr3(H1, 2) = b3
brr3(H1, 3) = c3
brr3(H1, 4) = d3
brr3(H1, 5) = e3
End If
End If
Next G2
End If
End If
Next E2
End If
End If
Next G1
End If
End If
Next D2
End If
End If
Next G
End If
End If
Next C2
End If
End If
Next B2
End If
End If
Next A2
Next AB

WD.Range("CX3").Resize(H1, 5) = brr3
Erase arr2()
Erase arr3()
Erase arr4()
Erase brr3()
ThisWorkbook.RefreshAll
MsgBox ("中奖")
End Sub

TA的精华主题

TA的得分主题

发表于 2023-4-21 08:30 | 显示全部楼层
红色部分是提取下标越界,楼主可以调测看数组边界以及变量h1对应的数字,对比看下吧


  (总提示这里下标越界9,上面重定义1 To 1048576,这里实际为1048577.好像1048577就是1)什么问题???

这个看看楼主的代码逻辑,看看什么情况

TA的精华主题

TA的得分主题

发表于 2023-4-21 08:51 | 显示全部楼层
本帖最后由 zhjlgaojuan 于 2023-4-21 08:59 编辑

(总提示这里下标越界9,上面重定义1 To 1048576,这里实际为1048577.好像1048577就是1)什么问题???
数组定义的是1 to 1048576,对于1048577当然是下标越界了,至于你说的1048577就是1,这个没听说过

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-4-22 17:21 | 显示全部楼层
zhjlgaojuan 发表于 2023-4-21 08:51
(总提示这里下标越界9,上面重定义1 To 1048576,这里实际为1048577.好像1048577就是1)什么问题???
...

谢谢回复。
我知道数据确实下标越界了,但是,什么原因导致的呢,因为已经重定义了大小,为什么还会出现大于下标的问题呢?问题出在哪里?

TA的精华主题

TA的得分主题

发表于 2023-4-22 18:09 | 显示全部楼层
LED147258 发表于 2023-4-22 17:21
谢谢回复。
我知道数据确实下标越界了,但是,什么原因导致的呢,因为已经重定义了大小,为什么还会出现 ...

“...上面面重定义1 To 1048576,这里实际为1048577..."
实际 1048577 比定义 1048576 大,当然就越界了啊。

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-5-1 22:28 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
liulang0808 发表于 2023-4-21 08:30
红色部分是提取下标越界,楼主可以调测看数组边界以及变量h1对应的数字,对比看下吧

谢谢你,确实是逻辑出现了问题。同VLOOKUP的循环没有退出导致的。
For G1 = 1 To 100
f7 = Application.WorksheetFunction.Round(arr3(G1, 3), 9)
  If f7 > f1 Then
   f4 = arr3(G1, 4)
    Exit For
     End If
      Next G1
For G2 = 1 To 100
f8 = Application.WorksheetFunction.Round(arr3(G2, 5), 9)
  If f8 > f2 Then
   f5 = arr3(G2, 6)
    Exit For
     End If
      Next G2
类似VLOOKUP的这种循环有多个,都没有Exit For。代码完成。谢谢!!!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-17 03:35 , Processed in 0.042039 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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