VBA每⽇⼀练(18),数组array的⽤法redimpreserve等
定义⽅式
dim arr11 (5)
dim arr12 (0 to 5 )
dim arr13 (1 to 5)
dim arr21(1,5)
dim arr22(0 to 1 ,0 to 5)
dim arr22(1 to 1 ,1 to 5)
dim arr3()
静态数组
dim arr51(5)
动态数组
dim arr61()
redim arr61(13)
redim arr61(20)
redim arr61(j)
redim arr61(1 to k)
dim arr71()
redim preserve arr71( 1 to 10)
dim arr81()
arr81(0)=1
redim preserve arr81( 1 to 10)
dim arr91()
arr91(1)=2
redim preserve arr91( 1 to 10)
数组的定义⽅式的差别
Dim arr1 As Range '定义为excel对象,arr1是对象名。range是EXCEL的对象,cells也是
'并且这样的数组⼀定是 2维数组
Dim arr2 '定义变量,arr2是变量名
'变量最灵活,变量可以被 对象赋值,也可以被数组直接赋值
Dim arr3() '定义为数组,arr3是数组名
'⽽且这是动态数组,index默认了从0开始
' 动态数组才配合⽤ redim ,静态数组不需要
' 动态数组只能改变最后1个维度
dim arr4(5) '这是静态数组,静态数组不需要redim
数组定义与数组个数
dim arr1(5) 'index是 0,1,2,3,4,5,共6个index
dim arr1(1 to 5) 'index是 1,2,3,4,5,共5个index
option base 2 dim arr1(5) 'index是 2,3,4,5,共4个index
什么时候⽤redim 和 preserve
数组先被定义为了 动态数组 dim arr1()
后⾯可以重新定义 redim arr1(k)
可以进⾏多次redim
如果下次redim想 保留之前 arr1⾥的数据,则需要写 redim preserve arr1(k)
容易出错的地⽅ redim preserve arr1(1 to k)往往会报错,越界,因为之前index从0开始,⽆法匹配preserve 代码中使⽤了ReDim Preserve语句,出现类型不匹配? 多半是因为在声明变量时写成了arr,⽽⾮arr()
举例⼦
如果要⽤ redim perserve arr1() ,那需要arr1先别定义为动态数组 dim arr1(), 只是定义为变量时不⾏的 dim arr1实际上这段代码不需要preserve!!⽤来语法举例,
Sub ponyma_array2()
Dim arr1() '当数组定义,且默认开始的index为0! preserve时需要有0的index
'dim arr1 当变量定义
'Application.WorksheetFunction.CountA (Range("c:c"))
'Debug.Print Application.WorksheetFunction.CountA("c:c")
'这种counta只会把"a:a"当成1个字符串,不知道是对象1列,只会统计出1
k = 1
m = 1
ReDim preserve arr1(0 To Application.WorksheetFunction.CountA(Range("c:c")))
' 下标越界 ReDim preserve arr1(1 To Application.WorksheetFunction.CountA(Range("c:c")))
' Debug.Print Application.WorksheetFunction.CountA(Range("c:c"))
' Debug.Print Range("c65536").End(xlUp).Row
For i = 1 To Range("c65536").End(xlUp).Row Step 1
If Cells(i, 3) <> "" Then
Debug.Print Cells(i, 3)
arr1(k) = Cells(i, 3)
Debug.Print arr1(k)
k = k + 1
' Debug.Print arr1(k),写在这⾥问题1:k已经变了,下⼀个k还没赋值为空,2最后的k越界
' 循环是很精巧的,放的地⽅很讲究,放得不对,就错误百出
End If
Next i
For j = 1 To UBound(arr1, 1)
Cells(m, 10) = arr1(j)
m = m + 1
Next j
End Sub
数组的边界
⼀维数组边界
lbound (arr1,1) 或 lbound (arr1) 下边界
ubound(arr1,1) 或 ubound(arr1) 上边界
⼆维数组边界
lbound(arr1,1) 第1维的下边界,excel⾥的最⼩⾏数
ubound(arr1,1) 第1维的上边界,excel⾥的最⼤⾏数
lbound(arr1,2) 第2维的下边界,excel⾥的最⼩列数
ubound(arr1,2) 第2维的上边界,excel⾥的最⼤⾏数
数组的赋值
如果要保留值改变数组的⼤⼩,只能修改数组的最后⼀维⼤⼩。
类型不匹配是因为re没有声明,你改成dim re()
1. Sub aa()
2. Dim arr, x, aa, bb, xx, cc, d, s
3. Dim re() '下⾯需要重新定义数组,所以开始要先定义re为⼀个数组
4. arr3 = Range("x5").CurrentRegion.Value
5. 'x5 的区域都是⾮空数值
6. ReDim re(1 To UBound(arr3) * 8, 1 To 1) '因为重新定义了数组,所以数组是空的
7. '如果重新定义前,数组赋值过,REDIM 后也会把数组清空的
8. '如果数组赋值过,REDIM 时还要保留源数据,需要加上 Preserve关键字
9. '写法 ReDim Preserve re(1 To UBound(arr3) * 8, 1 To 1)
10. '新数组re赋值,可以使⽤循环的⽅法进⾏赋值
11.
12. MsgBox re(6, 1)
13. For i = 1 To UBound(arr3)
14. For ii = 1 To 8
15. Cells(i, ii) = re(i, 1)
16. Next
17. Next
18. End Sub
VBA只能动态修改数组最后⼀维的⼤⼩
Sub text()
Dim arr(), i As Integer, j As Integer
Dim brr
i = Sheet2.Range("k65536").End(xlUp).Row
brr = Sheet2.Range("a1:k" & i)
For i = 2 To UBound(brr)
If brr(i, 11) = 2 Then
j = j + 1
ReDim Preserve arr(1 To 11, 1 To j)
For r = 1 To 11
arr(r, j) = brr(i, r)
Next
End If
Next
Sheets("表2").Range("a18").Resize(UBound(arr, 2), UBound(arr)) = Application.Transpose(arr) End Sub
dim arr(1 to 3 ) as string
dim arr() as variant
redim arr(1)
arr=Array("a","b","c")
动态数组
k=0
redim arr(1 to k)
k=k+1
Sub jackma101()
'尝试每个txt导⼊为1⾏,或1个sheet----往数组⾥append 不会!,只会⽤cells()=存起来⽂件名
x1 = input_files1("C:\Users\Administrator\Desktop\test1", "\*.txt")
'x1 = input_files1("C:\Users\Administrator\Desktop", "\*.txt")
'debug.print input_files1("C:\Users\Administrator\Desktop", "\*.txt")
End Sub
Function input_files1(PATH1, PATH2)
'取⽂件数量
'取⽂件名
Dim arr1()
k = 0
file1 = Dir(PATH1 & PATH2)
Debug.Print file1
arr1(k) = file1
Do Until Len(file1) = 0
file1 = Dir
k = k + 1
arr1(k) = file1
Debug.Print file1
数组全部赋值为1Debug.Print k
Loop
Debug.Print "sum= " & k
End Function
数组⾥辅助了
取出来为啥是空?
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论