VBA 数组定义,赋值,一维数组

1VBA数组的基础定义

1.1什么是数组?

  • 就是一组数/字符等用同一个名字(这个名字就是:数组名),作为一个整体存储在一起

1.2什么是元素

  • 这些被保存在同一个数组名下的,多个内容,称为element 元素
  • 数组里的元素是可以重复的

1.3元素是怎么在数组内排序的?

  • 数组是有序的
  • 用什么来标识顺序呢?,就是index 
  • index  是一串连续的整数(也可以为负数),index必须 连续,整数,可以为正负
  • index默认是从0开始,但是不同的数组 赋值方式会导致index初始为0,或1
  • index默认为0的情况:动态数组每一维的index都默认从0开始, dim arr1()  或 arr2=array(1,2,3)
  • index默认为1的情况:数组被excel对象赋值时默认从1开始,range() 或 [{1,2,3}]
  • index可以被控制,直接写 arr(1 to 3) 或 option base 1

 

2数组的生成

2.1数组的定义方式

  • Dim arr1       '定义了一个变量
  • Dim arr2()     '定义了一个动态数组,定义时重大变化,其中arr2就是数组名
  • Dim arr3(3)    '定义为静态数组

 

2.2数组的赋值方式

  • 逐个赋值?? 有区别吗?
  • 静态数组的逐个赋值
  • 动态数组的逐个赋值

 

  • 整体赋值
  • 整体赋值1:用array()函数进行整体赋值,arr1=array(1,2,3)
  • 整体赋值2:用[{}] 的表达式形式赋值,arr1=[{"a",2,3}]
  • 整体赋值3:用range,row, column等EXCEL的对象, 如 arr1=range("a1:a10")


 

3 数组的分类

3.1数组按来源分

  • VBA原生数组
  • EXCEL对象的数组

理论上,从EXCEL对象导入的range一定是二维数组

如果导入是cells等可以试试

可以试试row  cloumn ,selection

 

3.2 VBA原生数组分类

  • 常量数组
  • 静态数组
  • 动态数组:动态数组的维数,长度都不确定

 

3.3数组按维度区分

区分的意义不是很大,一般都只用1维数组,2维数组,最多3维数组把。

  • 1维
  • 2维
  • 3维

 

 

4 用不同的方式 定义 和赋值 数组

4.0 数组名

  • 不管通过定义 dim arr1() 
  • 还是通过赋值   arr1= array()  或 arr1=range()
  • 一旦arr1() 成为数组,arr1  等价于  arr1() 都表示这个数组

 

4.1先定义为变量,再赋值为数组

 

  • (如果没有option explict)
  • 如果最初定义为变量
  • Dim arr1  等价于  dim arr1 as variant  等价于  先无定义
  • 那么当变量被赋值为一个数组时
  • 变量名arr1就成了数组名,arr1()就表示是数组了
  • 当这个变量有又被赋值为其他内容时,就不再代表数组了
Sub ponyma_array101()

Dim arr1       '定义了一个变量

arr1 = Array(1, 2, 3, 4, 5)
'赋值时,重大变化,arr1就是数组了,arr1也是数组名
'使用array函数,构造一个1维数组,然后赋值给变量。默认是从index的0开始


For i = 0 To UBound(arr1, 1)
   Debug.Print "arr1的第" & i & "个元素是" & arr1(i), "i是index"
Next
Debug.Print ""

k = 0
For Each i In arr1
  Debug.Print "arr1的第" & k & "个元素是" & i, "但是k不是index"
  k = k + 1
Next
Debug.Print ""


'变量仍然可以被赋值为其他内容
arr1 = 1
Debug.Print "arr1现在的的为" & arr1


End Sub

 

4.2  定义为动态数组

  • 我理解动态数组,dim arr1()   是维度,长度都没确定的数组
  • 要使用数组(也就是读,写的时候),数组必须 先界定维度和大小。
  • 如何先定义数组呢?
  • 方法1:都先redim
  • 方法2:直接给数组赋值(不光界定了维度和大小,还赋值了)
  • redim arr2() 的用法 几乎等价于   arr2=array() 赋值(赋值更进了一步)
  •  
  • 动态数组的赋值
  • arr2=array() ,或arr2=range() 等等,各种数组赋值都可以
  • arr2=1 是错误的,数组不能再被赋值为1个数值!只能是数组!
  •  
  • 数组可以随意redim,改变维度,长度都可以
  • 就像数组可以被覆盖赋值一样
  • 除非 redim preserve 要保留数组之前的值,就得让新redim的内容,包含之前的index范围!

 



Sub ponyma_array101()

Dim arr2()     '定义了一个动态数组,定义时重大变化,其中arr2就是数组名
Dim arr20()
Dim arr30()
Dim arr40()

arr2 = [{0,1,2,3,4,5}]
'arr2() 和arr2这2个不是一个东西? 事实证明是一个东西
'事实上不能同时声明 dim arr2 和 arr2(),会报错重复声明
'Debug.Print arr2(0) 出错证明这种赋值,是从index1开始的,不是默认方式


For i = 1 To UBound(arr2, 1)
   Debug.Print "arr2的第" & i & "个元素是" & arr2(i), "i是index"
Next
Debug.Print ""

k = 1
For Each i In arr2
  Debug.Print "arr2的第" & k & "个元素是" & i, "但是k不是index"
  k = k + 1
Next
Debug.Print ""


'由于arr2已经数数组,不能直接把1个值,赋值给数组,数组名的
'arr2 = 1
'Debug.Print arr2


arr2() = Array("a", "b", "c")
'arr2 和arr2() 是等价的
'arr2== Array("a", "b", "c")

For i = 0 To UBound(arr2, 1)
   Debug.Print "arr2的第" & i & "个元素是" & arr2(i), "i是index"
Next
Debug.Print ""

k = 1
For Each i In arr2
  Debug.Print "arr2的第" & k & "个元素是" & i, "但是k不是index"
  k = k + 1
Next
Debug.Print ""


'不管数组里有没有赋值,只要不preserve,数组随便redim
'redim 功能,其实和全部重新赋值一样
'写在这里会报错,后面这句 arr20(1) = 1  '动态数组没赋值前,是不能操作array的读和写的
ReDim arr20(5)
ReDim arr20(1, 7)

ReDim arr20(3)
arr20(1) = 100
Debug.Print arr20(1)

arr20 = Array(6, 66, 666)
Debug.Print arr20(1)

Debug.Print ""
 


ReDim arr40(5)
arr40(1) = 2
ReDim arr40(1, 7)
arr40(1, 1) = 22
ReDim arr40(3)
arr40(1) = 222
Debug.Print arr40(1)


'如果redim preserve,必须让新的redim包含老的index范围
arr30 = Array(10, 20, 30)
'ReDim Preserve arr30(0 To 2) 这样会报错
ReDim Preserve arr30(0 To 20)
Debug.Print arr30(0)
Debug.Print ""


End Sub

 

[特别] redim  还可以带参数,比如 redim (k)

  • 如果知道数组大小,可以一次redim到位
  • 适合不知道数组大小时,还可以多次redim


Sub ponyma_array101()

Dim arr5()
Dim arr6()
'redim(k)  说明redim可以带变量
'两种redim都可行

For i = 0 To 10
  ReDim arr5(i)    '多次redim,适合不知道数组大小时
  arr5(i) = i * i
  Debug.Print arr5(i)
Next


Debug.Print "换行";   '不换行
Debug.Print " "       '打印1个空格
Debug.Print ""   '换行
Debug.Print      '换行



ReDim arr6(10)   '知道数组大小,一次redim到位
For i = 0 To 10
  arr6(i) = i * i
  Debug.Print arr6(i)
Next


End Sub
  • 动态数组,可以整体赋值,或单独赋值
  • 动态数组,单独赋值前,必须先 界定好数组,比如redim 或 arr1=array 等
  • 动态数组,可以随意,整体赋值,改变数组内容。但不能被赋值为非数组的变量值等

 

静态数组

  • redim (5) 
  • 静态数组不能再被重新redim  比如 redim(3) 会报错

 

 

5 数组的遍历

5.0 对数组的遍历存在2个思路

  • 思路1:遍历index,然后查找对应的element
  • 思路2:或者直接遍历element

 

遍历index真正保险的写法是

lbound() 和 ubound() 其实都是取的 index的上下范围

For i = lbound(arr2,1) To UBound(arr2, 1)

      Debug.print arr2(i)

next

 

 

5.1 一维数组

Sub ponyma_array1()
'先学习1维数组,和数组赋值,以及取1维数组index和element


Dim arr1       '定义了一个变量
Dim arr2()     '定义了一个动态数组,定义时重大变化,其中arr2就是数组名
Dim arr3(3)

arr1 = Array(1, 2, 3, 4, 5)   '赋值时,重大变化,arr1就是数组了,arr1也是数组名
'使用array函数,构造一个1维数组,然后赋值给变量。默认是从index的0开始
                                                  

For i = 0 To UBound(arr1, 1)
   Debug.Print "arr1的第" & i & "个元素是" & arr1(i), "i是index"
Next
Debug.Print ""

k = 0
For Each i In arr1
  Debug.Print "arr1的第" & k & "个元素是" & i, "但是k不是index"
  k = k + 1
Next
Debug.Print ""
'结论1:可以用变量,被赋值为一个数组
'获得数组元素的方法,可以遍历index,也可以直接遍历element




arr2 = [{0,1,2,3,4,5}]
'arr2() 和arr2这2个不是一个东西? 事实证明是一个东西
'事实上不能同时声明 dim arr2 和 arr2(),会报错重复声明
'Debug.Print arr2(0) 出错证明这种赋值,是从index1开始的,不是默认方式


For i = 1 To UBound(arr2, 1)
   Debug.Print "arr2的第" & i & "个元素是" & arr2(i), "i是index"
Next
Debug.Print ""

k = 1
For Each i In arr2
  Debug.Print "arr2的第" & k & "个元素是" & i, "但是k不是index"
  k = k + 1
Next
Debug.Print ""

arr3(0) = 99
arr3(1) = 1
arr3(2) = 2
arr3(3) = 3



For i = 0 To UBound(arr3, 1)
   Debug.Print "arr3的第" & i & "个元素是" & arr3(i), "i是index"
Next
Debug.Print ""

k = 0
For Each i In arr3()
   Debug.Print "arr3的第" & k & "个元素是" & i, "但是k不是index"
   k = k + 1
Next
Debug.Print ""


End Sub

 

 

 

 

二维数组

 

 

  • 14
    点赞
  • 106
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值