vba 下标越界怎么解决界

关于EXCEL VBA中数组下标越界的问题
关于EXCEL VBA中数组下标越界的问题
Set rng = Sheet2.Range(&A2:A& & Sheet2.[A65536].End(xlUp).Row + 1)
arr = rng.Value
For i = 1 To UBound(arr) - 1 Step 2
If Left(arr(i + 1), 3) = Left(arr(i), 3) Then
运行的时候提示if那一行下标越界,怎么解决这个问题?
匿名回答于
Set rng = Sheet2.Range(&A2:A& & Sheet2.[A65536].End(xlUp).Row + 1)
arr = rng.Value
采用单元格区域直接赋值给数组的时候,并不像数组公式里那样,单行或者单列的单元格区域返回一维的水平或者垂直数组,而是像工作表行列分布一样的二维数组。
因此引用数组里的值时,必须使用二维引用的方式,即arr(i)是错误的,必须使用arr(i,1)的格式。
请遵守网上公德,勿发布广告信息
相关问答:
匿名回答于
把If Left(arr(i + 1), 3) = Left(arr(i), 3) Then 这一句改为
If Left(arr(i + 1, 1), 3) = Left(arr(i, 1), 3) Then即可,因为按前面的语句形成的arr数组是二维数组。&& 文章内容
Excel VBA下标越界原因和方法
[日期:] & 来源:IT部落窝& 作者:IT部落窝 & 阅读:15432次[字体:
内容提要:文章介绍excel&VBA下标越界的原因,以及下标越界的解决方法。
  VBA初学者,常常会遇到下标越界问题。
  尽管出现下标越界的原因是多种多样,但终究是因为对象不存在或者超出范围,就会出现下标越界的提示框,如下图所示:
  Microsoft Visual Basic ~运行时错误'9'~下标越界,错误原因分析:
  如果使用数组时,数组的下标超出数组的可取值范围就会出现这个错误,这个数组可以是自定义的也可以是系统自带的。
1.自定义数组: dim arr1(1 to 5) arr1(10)=555因为arr1数组为1到5,这里却是10,所以就会报下标越界错误。
2.系统自带的数组:一个excel工作表表有3张SheetSub 下标越界()& MsgBox Sheets(4).NameEnd Sub这里的Sheets(4)显然已经超出了3张Sheet,因此也会报下标越界错误。
  总之,有多种情况会引起“下标越界”的报错。
  下标越界错误大概有以下的原因和解决方法:
  引用了不存在的数组元素。
  下标比可能下标范围大或小,或是在应用程序中这一边的数组没有指定范围。检查数组的声明以确认其上界和下界。若使用的是重新指定范围的数组,应使用 UBound 和 LBound 函数来决定数组访问。如果索引指定为变量,应检查变量名的拼写。
  声明数组时没有指定元素的数目。
  引用了不存在的集合成员。 试着使用 For Each...Next 结构代替指定元素下标。使用速写形式的下标,结果指定了错误的元素。
  下标越界不存在对应的工作薄、工作表名称是否写正确。
  当再次遇到VBA报下标越界错误时,就不会惊慌了,至少大概知道其原因了。我们再参照上面的思路去修改代码就可以解决下标越界的错误。
photoshop教程
平面设计教程查看: 706|回复: 3
VBA代码提示下标越界,如何解决
阅读权限30
在线时间 小时
各位老师,
以下代码出现下标越界,是哪里写的不正确,忘指正,谢谢!附上文件
Sub test()
& & Dim ar, br(), d As Object, i&, j&, k
& & Set d = CreateObject(&scripting.dictionary&)& && && && && && &&&'建立字典
& & With Sheets(&入库明细&)
& && &&&ar = .Range(&A5:J& & .[A65536].End(xlUp).Row)& && && && && &'取得工作表[入库明细]最后一行数值
& & End With
& & For i = 1 To UBound(ar)& && && && && && && && && && && && && &&&'从第一行开始循环至入库明细最后一行
& && &&&If Not d.exists(ar(i, 4) & &,& & ar(i, 5) & &,& & ar(i, 6)) Then& && &&&'如果字典里面没有品名+料号+宽这个信息
& && && && &ReDim br(1 To 12)& && && && && && && && && && && && && &'定义BR为拥有12行的1维数组
& && && && &For j = 1 To 3& && && && && && && && && && && && && && &'从数字1循环至3
& && && && && & br(j) = ar(i, j + 5)& && && && && && && && && && &&&' 举例:当i=1,j=1,即BR(1)=ar(1,6),即BR(1)=F5单元格中数值(该数值为60),以此类推
& && && && &Next j
& && && && &br(12) = ar(i, 10)& && && && && && && && && && && && && &'举例:当i=1,即BR(12)=ar(1,10),即BR(12)=J5单元格中数值(该数值为500),以此类推
& && &&&Else& && && && && && && && && && && && && && && && && && &&&'不满足上面的IF条件时,执行下面语句,即字典里面已经存在品名+料号+宽这个信息
& && && && &br = d(ar(i, 4) & &,& & ar(i, 5) & &,& & ar(i, 6))& && &'br=字典里面已经存在的品名+料号+宽,所对应的信息
& && && && &br(2) = br(2) + ar(i, 7)& && && && && && && && && && &&&'对长度进行累加,累加的值计入BR(2)
& && && && &br(3) = br(3) + ar(i, 8)& && && && && && && && && && &&&'对平方进行累加,累加的值计入BR(3)
& && && && &br(12) = br(12) + ar(i, 10)& && && && && && && && && && &'对金额进行累加,累加的值计入BR(12)
& && &&&End If
& && &&&d(ar(i, 4) & &,& & ar(i, 5) & &,& & ar(i, 6)) = br& && && & '将品名+料号+宽组合起来建立字典,字典所对应的信息为br
& & Next i
& & With Sheets(&出库明细&)
& && &&&ar = .Range(&A5:M& & .[A65536].End(xlUp).Row)& && && && && &'取得工作表[出库明细]最后一行数值
& & End With
& & For i = 1 To UBound(ar)& && && && && && && && && && && && && &&&'从第一行开始循环至出库明细最后一行
& && &&&If Not d.exists(ar(i, 5) & &,& & ar(i, 6) & &,& & ar(i, 7)) Then& && &&&'如果字典里面没有品名+料号+宽这个信息
& && && && &ReDim br(1 To 12)& && && && && && && && && && && && && &'定义BR为拥有12行的1维数组
& && && && &For j = 5 To 6& && && && && && && && && && && && && && &'从数字5循环至6
& && && && && & br(j) = ar(i, j + 5) + ar(i, j + 7)& && && && && &&&' 举例:当i=1,j=5,即BR(5)=ar(1,5+5)+ar(1,5+7),即BR(5)=J5+L5单元格中数值(该数值为100+(-20)),以此类推
& && && && &Next j
& && &&&Else& && && && && && && && && && && && && && && && && && &&&'不满足上面的IF条件时,执行下面语句,
& && && && &br = d(ar(i, 5) & &,& & ar(i, 6) & &,& & ar(i, 7))& && &'br=字典里面已经存在的品名+料号+宽,所对应的信息
& && && && &For j = 5 To 6& && && && && && && && && && && && && && &'从数字5循环至6
& && && && && & br(j) = br(j) + ar(i, j + 5) + ar(i, j + 7)& && && &'对实发米数和退补米数进行累加,累加的值计入BR(j)
& && && && &Next j
& && &&&End If
& && &&&d(ar(i, 5) & &,& & ar(i, 6) & &,& & ar(i, 7)) = br& && && & '将品名+料号+宽组合起来建立字典,字典所对应的信息为br
& & Next i
& & ReDim ar(1 To d.Count, 1 To 14)& && && && && && && && && && && &'重新定义ar为d.count行,14列的2维数组,d.count即为字典的条数,可理解为品名+料号+宽不重复的记录有多少条
& & For Each k In d.keys& && && && && && && && && && && && && && &&&'循环取出字典,即取出&品名+料号+宽&这个信息
& && &&&n = n + 1& && && && && && && && && && && && && && && && && &'开始计数
& && &&&ar(n, 1) = n& && && && && && && && && && && && && && && && &'写入库存汇总里A列的序号
& && &&&ar(n, 2) = Split(k, &,&)(0)& && && && && && && && && && && &'用split分列出料号
& && &&&br = d(k)& && && && && && && && && && && && && && && && && &'br=字典所对应的信息
& && &&&For i = LBound(br) To UBound(br)& && && && && && && && && & '从br的最小值循环至br的最大值
& && && && &Select Case i& && && && && && && && && && && && && && & '检索i的值符合以下哪个条件,符合条件就执行
& && && && &Case 1 To 7, 12& && && && && && && && && && && && && &&&'如果i值在1~7之间或等于12
& && && && && & ar(n, i + 3) = br(i)
& && && && &Case 8 To 9& && && && && && && && && && && && && && && &'如果i值在8~9之间
& && && && && & ar(n, i + 3) = br(i - 6) - br(i - 3)& && && && && & 'br(2)-br(5)即E列-H列
& && && && &Case 10& && && && && && && && && && && && && && && && & '如果i值等于10
& && && && && & If Val(br(3)) && 0 Then ar(n, i + 3) = br(12) / br(3) * ar(n, 12) '如果br(3)累计平方数不等于0,那么,ar(n,10+3)结存金额=br(12)累计金额/br(3)累计平方*ar(n,12)结存平方
& && && && &Case 11& && && && && && && && && && && && && && && && & '如果i值等于11
& && && && && & If Val(br(3)) && 0 Then ar(n, i + 3) = br(12) / br(3) '如果br(3)累计平方数不等于0,那么,ar(n,11+3)单价=br(12)累计金额/br(3)累计平方数
& && && && &End Select
& && & Next i
& && && &For i = 3 To 9 Step 3& && && && && && && && && && && && &&&'从3循环到9,每循环一次加3,即3,6,9
& && && && & If ar(n, i + 1) && && Then ar(n, i) = Split(k, &,&)(1)&&'如果ar(n, i + 1)累计数不等于空格,用split分列出宽,赋值给ar(n, i)
& && &&&Next i
& & With Sheets(&库存汇总&)
& && &&&Sheets(3).Range(&A5:O65536&).ClearContents& && &'清空工作表[库存汇总]A5:N&最后一行
& && &&&.[A5].Resize(n, 14) = ar& && && && && && && && && && && && &'相应区域写入ar数组
& & End With
& & Set d = Nothing& && && && && && && && && && && && && && && && & '清空字典
16:31 上传
点击文件名下载附件
19.74 KB, 下载次数: 5
阅读权限100
在线时间 小时
ar(i,10) 的第2维最大是10,
在Case 1 To 7, 12& && && && && && && && && && && && && &&&'如果i值在1~7之间或等于12
& && && && && &&&ar(n, i + 3) = br(i)
如果i&7,i+3就&10&&出错。
阅读权限30
在线时间 小时
您的ar維度不夠, 請改為: ReDim ar(1 To d.Count, 1 To 15)
阅读权限30
在线时间 小时
感谢版主 & Chip_Kenny的回复,问题得到了解决
最新热点 /1
ExcelHome每周都有线上直播公开课,
国内一流讲师真身分享,高手贴身答疑,
赶不上直播还能看录像,
关键居然是免费的!
厚木哥们都已经这么努力了,
你还好意思说学不好Office。
玩命加载中,请稍候
玩命加载中,请稍候
Powered by
本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任! & & 本站特聘法律顾问:徐怀玉律师 李志群律师查看: 3907|回复: 4
[已解决]VBA 定义工作表时出现下标越界
VBA 定义工作表时出现下标越界&&&如下程序在一些电脑运行正常,但有些电脑运行时出现“下标越界”,请高手指点。&&& Dim wsA As Worksheet&&& Set wsA = Workbooks("仓库收发料管理系统").Worksheets("收料单")&
[此贴子已经被作者于 12:51:52编辑过]
文件名要加路径吧?
如果是对象的下标越界,对象名错了,再检查一下吧
文件要打开,引用用全名。Dim wsA As WorksheetSet wsA = Workbooks("仓库收发料管理系统.xls").Worksheets("收料单")
以下是引用吕?布在 12:17:00的发言:文件要打开,引用用全名。Dim wsA As WorksheetSet wsA = Workbooks("仓库收发料管理系统.xls").Worksheets("收料单")引用全名解决,谢谢
Powered by

我要回帖

更多关于 骑砍 导入物品下标越界 的文章

 

随机推荐