VBA 数组定义,赋值,一维数组 您所在的位置:网站首页 一维数组操作程序怎么写 VBA 数组定义,赋值,一维数组

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

2024-07-09 22:35| 来源: 网络整理| 查看: 265

1VBA数组的基础定义 1.1什么是数组? 就是一组数/字符等用同一个名字(这个名字就是:数组名),作为一个整体存储在一起 1.2什么是元素 这些被保存在同一个数组名下的,多个内容,称为element 元素数组里的元素是可以重复的 1.3元素是怎么在数组内排序的? 数组是有序的用什么来标识顺序呢?,就是index index  是一串连续的整数(也可以为负数),index必须 连续,整数,可以为正负index默认是从0开始,但是不同的数组 赋值方式会导致index初始为0,或1index默认为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

 

 

 

 

二维数组

 

 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有