VBA 数组下标越界问题

Sub UpdateComplete()
Dim S As Worksheet
Dim C1 As Long
Dim R1 As Long
Dim R2 As Long
Dim N As Long
Set S = ThisWorkbook.ActiveSheet
C1 = S.Cells(1, Columns.Count).End(xlToLeft).Column
R1 = S.Cells(Rows.Count, 1).End(xlUp).Row
R2 = S.Cells(Rows.Count, C1).End(xlUp).Row

i = 0
j = 0
m = 0
Dim Newdate()
For k = 3 To R2
If DateValue(S.Cells(k, C1 - 3).Value) > DateValue(S.Cells(R1, 1).Value) _
And DateValue(S.Cells(k, C1 - 3).Value) <> DateValue(S.Cells(k - 1, C1 - 3).Value) Then

i = i + 1
ReDim Preserve Newdate(1 To i)
Newdate(i) = DateValue(S.Cells(k, C1 - 3).Value)
End If
Next k
Debug.Print Newdate(1)
N = UBound(Newdate) - LBound(Newdate) + 1
Dim DT()

For kk = 1 To N
For l = 1 To 225
j = j + 1
ReDim Preserve DT(1 To j)
DT(j) = Newdate(kk) + TimeValue(S.Cells(l + 1, 1))
Next l
Next kk

Dim PosArr()
For l = 1 To N * 225
m = m + 1
ReDim Preserve PosArr(1 To m, 1 To 2) (下标越界)

For ll = 2 To R2
If Abs(S.Cells(ll, C1 - 3).Value - DT(m)) < 0.000694 Then
PosArr(m, 1) = ll
PosArr(m, 2) = ll

ElseIf S.Cells(ll, C1 - 3).Value < DT(m) And S.Cells(ll + 1, C1 - 3).Value > DT(m) Then
PosArr(m, 1) = ll
PosArr(m, 2) = 0
End If

Next ll
Next l
End Sub

请问上面VBA代码哪里有问题,总出现下标越界和类型不一致问题?

首先您写的代码很不严谨。如:For k = 3 To R2您没有考虑到R2<3的情况,导致下标越界。

在第一个FOR循环中,如果没有出现符合条件的单元格,数组NEWDATE就没有赋值,这样又出现了下标越界的问题。第二个FOR循环中 DT(j) = Newdate(kk) + TimeValue(S.Cells(l + 1, 1))这句您定义的l变量赋值如果超过了符合条件的那个数组的最大值,肯
其次您没有约束您表格中的数据类型,一旦您写入的类型和代码类型不一致,马上出现类型不一致问题。然后你的变量值太大,没有约束,例如,第二个FOR循环中 DT(j) = Newdate(kk) + TimeValue(S.Cells(l + 1, 1))这句您定义的l变量赋值如果超过了符合条件的那个数组的最大值,肯顶会出现类型不一致。
最后,二维数组要先经过转置后才能进行循环操作。否则在定义后肯定会出现您括号中提示的下标越界问题。

PS:这个宏的目的我不是很明确,不过请把各种问题考虑到后再进行操作。追问

为什么二维数组要先经过转置后才能进行循环操作

追答

因为用Preserve 保持数组的内容,只能改变数组最后一维的上界,如果改变了其它维或最后一维的下界,那么运行时就会出错。所以,想要使用二维数组只能通过转置。

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-08-25
你的动态数组定义错误。变化的只能是列,不可以是行,

ReDim Preserve PosArr(1 To 2, 1 To m)

这样定义就可以了,但是,你后面写入数据时,也要这样写入,输出结果时,用transpose函数转置回来即可。

vba在excel中的应用中,下标越界怎么回事
下标越界错误大概有以下的原因和解决方法:1.引用了不存在的数组元素。2.下标比可能下标范围大或小,或是在应用程序中这一边的数组没有指定范围。检查数组的声明以确认其上界和下界。若使用的是重新指定范围的数组,应使用 UBound 和 LBound 函数来决定数组访问。如果索引指定为变量,应检查变量名的拼写。

为什么在excel中用vba时会出现下标越界的提示?
简单的理解:下标越界就是引用超出了所在的范围。当我们在excel的VBA中输入下面代码,运行,就会出现“运行时错误9下标越界”的提示。代码如下:Sub a()Dim arr() As String arr(1) = "你好"End Sub 其实上面的“运行时错误9下标越界”是因为定义的动态数组没有确定维数和尺寸。定义成固定维数和尺寸...

Excel VBA下标越界的原因分析与解决方法
下标越界错误大概有以下的原因和解决方法:引用了不存在的数组元素。下标比可能下标范围大或小,或是在应用程序中这一边的数组没有指定范围。检查数组的声明以确认其上界和下界。若使用的是重新指定范围的数组,应使用 UBound 和 LBound 函数来决定数组访问。如果索引指定为变量,应检查变量名的拼写。声明...

VBA 数组下标越界问题
首先您写的代码很不严谨。如:For k = 3 To R2您没有考虑到R2<3的情况,导致下标越界。在第一个FOR循环中,如果没有出现符合条件的单元格,数组NEWDATE就没有赋值,这样又出现了下标越界的问题。第二个FOR循环中 DT(j) = Newdate(kk) + TimeValue(S.Cells(l + 1, 1))这句您定义的l...

vba 数组下标越界
原因是用了Preserve参数,如果要保留数组原有数据,重定义数组是只能修改末维的下标,你修改一维下标,当然不行呀。两个解决方法:1、一次性确定数组下标能满足数据的需要,如果不好确定就取Arr的行数,将数组定义语句放在循环体前:ReDim arr1(1 To ubound(arr), 1 To 5)2、Arr1的行列互换(也...

VBA 数组下标越界问题
如:For k = 3 To R2您没有考虑到R2<3的情况,导致下标越界。在第一个FOR循环中,如果没有出现符合条件的单元格,数组NEWDATE就没有赋值,这样又出现了下标越界的问题。第二个FOR循环中DT(j) = Newdate(kk) + TimeValue(S.Cells(l + 1, 1))这句您定义的l变量赋值如果超过了符合条件的那个数组的最大值...

VBA下标越界,请见下边代码:
在VBA中,数组是否从 0 或 1 索引是根据 Option Base 语句的设置。如果 Option Base 没有指定为 1,则数组索引从零开始。如果从0开始则当下表为10时数据越界。以上,希望能帮到你。

VBA运行时错误9,下标越界
1、首先在SHEET表内设置好按钮,并指定到宏,(宏所在SHEET的名称为“图表”)。2、在VBA编辑器内输入如下的代码。(此代码的含义为遍布区域内的单元格,如果为空格,则隐藏空格所在的整列。3、在运行过程中出现了问题,下标越界,无法运行。4、查看问题原因为,在代码中的“SHEET1”工作表根本没有,...

VB中关于数组下标越界问题
可能是你print 输出的位置和 inputbox弹出窗口刚好重叠 因为你没设置窗体AutoRedraw=true 故该位置上的图形被inputbox抹掉了 还有就这么短的代码来看貌似是没有下标越界的可能 Option Base 1 Dim a() As String Private Sub Form_Click()ReDim a(4) As String Me.AutoRedraw = True For i = 1 ...

为什么我的VBA代码会下标越界?
' 假设row= 365ReDim arry(1 To 2, 1 To rw)'删除这一句==>ReDim arry(1 To rw)For I = 1 To rwarry(1, 1) = Cells(I, 1) ''下标越界 , 测试显示进入第一个数组arry(1,1) 就越界了Next IFor I = 1 To rwarry(2, I) = Cells(I, 3)Next IEnd Sub ...

相似回答