【原创】VBA学习笔记(12)VBA的数组 array---基础知识(1)

52 篇文章 102 订阅
订阅专栏

一 数组 array

1.1 什么是数组?具体的例子

  • 以这个语句为例子
  • arr1=array(1, 2, 3)
  • 左边:变量名=数组名

 

  • 右边:数组,集合,多个元素集合,多个数据集合,
  • 右边的单个内容,1,2,3 是数组的元素/下标变量
  • 每个元素存储时,会标记1个(看不见的 )index 索引 下标

 

1.2 什么是数组,抽象的定义:数组也是变量,是一种可存储多个数据的特殊变量

  • VBA或其他语言里,变量是用来存储数据的。
  • 而一般来说,1个变量只能用来存储1个数据
  • 现在来了1个特例,有高手发明了数组的概念: 数组是一个特殊的变量,可以用来存储多个数据!(甚至是多维的多个数据!)
  • 数组就是多个单位/元素(element)有序的,连续存储在一起作为一个整体,统一叫1个名字(数组名)

 

1.3 数组的特点,index有序不重复,但数组的元素却可以重复

  • 什么叫有序?
  • 就是数组的内容存储是有序的
  • index 是有序(一般是从小到大)
  • index也应该是连续的,暂时没见过 index不连续的情况
  • index也不能重复
  • 但是数组存储的内容,是可以重复的

 

  1. 数组的index下标默认是从0开始的,比如split生成的,还有未指定index下标的,如 dim arr1(5)
  2. 但是数组的index下标也有从1开始的情况,比如range 赋值的变量,默认下标从1开始,如 arr2=range("b1:d5")
  3. 数组的index下标受控制的情况模块最前面 option base  -1
  4. 数组index下标最好自己定义好, 如  dim arr3(1 to 5)
  • Dim arr1(3)                      '其实是0-3,有4个元素
  • Dim arr1( 1 to 3)              '其实是1-3,有3个元素
  • Option base 1     
Sub test_array1()

Dim arr1()
Dim arr2()

arr1() = Range("c1:c13")
arr2() = Range("c1:o1")

For i = 1 To 13
   Debug.Print arr1(i, 1)
Next i


For i = 1 To 13
   Debug.Print arr2(1, i)
Next i

End Sub

 

1.4 数组的核心内容:就4个: 维数,每个维度大小,数据类型,数据

举例:

dim arr1(5)  as integer

dim arr2(2 to 6) as string 

dim arr3(3,5) as integer

  1. 数组的维数                : 数组可以是1维,2维等等,但数组的维数和嵌套不同!
  2. 每个维数大小           : 每个维数的 lbound()  to  ubound()
  3. 数组存储数据的类型: 可以是单一的,也可以是variant 变化的
  4. 数组存储的内容        : 每个值的具体内容

 

2 数组的分类

  • 这些概念拿到前面说,是因为自己作为新手,发现很容易弄混概念,分不清什么静态数组,什么是界定清晰的数组?
  • 数组定义和 静态动态是相关的,
  • 数组赋值也是和这些概念相关的,比如,静态数组不能被整体赋值,动态数组赋值前,要先界定清晰 维数和大小等。

 

2.1 什么叫完备(界定清晰)的数组,什么叫不完备的数组?---主要是指 数组的维数,维数大小(一般不管数组的数据类型)

 

  • 完备(界定清晰)数组:    数组的维数,每个维度长度都确定的数组。这样的数组可以给单一元素赋值操作,但如果是静态数组,数组不能被整体赋值。
  • 不完备(界定清晰)数组:数组的维数,每个维度长度不确定的数组,这样的数组可以整体赋值(变相确定数组维数和大小),但是没法单一元素赋值
  • 举例
  • dim arr1(5) as integer  这个就是一个界定清晰的数组!    dim arr1(5) as integer  等价于 dim arr1(0 to 5) as integer 
  • dim arr2()  等价于    dim arr2 () as  variant  这个其实就没有界定 数组的 维数,每个维数的大小是不清晰的。
Sub try2()

Dim arr1(5)
Dim arr2()
Dim arr3()
ReDim arr4(2)


arr1(0) = 1
'arr1 = array(1, 2, 3, 4, 5)   '不能给数组赋值,是不能给静态数组整个赋值?
'arr1() = Array(0, 1, 2, 3, 4, 5)
Debug.Print Array(1, 2, 3, 4, 5)(0)


arr2() = Array(1, 2, 3)

'arr3(0) = 1   '数组使用前,必须先redim 界定清晰(并不就是静态数组, redim arr3(2)虽然是动态的,也是界定清晰的)才可以赋值和使用
ReDim arr3(2)
arr3(0) = 555
Debug.Print arr3(0)

arr3 = Array(10, 20, 30, 40, 50)   '动态数组可以被整体赋值
Debug.Print arr3(1)

End Sub

 

2.2 什么叫静态数组,动态数组 ( VBA里没有static 和 dynamic关键字,不好判断) 

  • 数组何谓静态,动态?
  • 数组的4个关键要素:维数,维数大小,数据类型,数据。
  • 数据肯定可以改变,这是变量的基本特点。而数据类型,在数组定义时已经显式的声明,或者缺省为 variant了
  • 所以数组可以动态改变就是指:数组的维数和每个维数大小是否可以改变
  • 静态还是动态,和数组的变量类型无关
  • 静态还是动态,不是dim的一定是静态数组,dim arr1() 是动态数组
  • 静态 static      一般指 定义后不再可以修改的。在这里具体指  数组的维数,每个维数的大小不可改变
  • 动态 dynamic 一般指 定义后,在运行代码过程中还可以被改变的。在这里具体指  数组的维数,每个维数的大小可改变
  • 如果可以   dim arr1() as static  或 dim arr2() as dynamic 就很清晰,但VBA里不是这样

 

  • 但是VBA里不是这样----和数组的变量类型无关。
  • 静态数组:
  • dim arr1(4) 这样就是静态数组

 

  • 动态数组:
  • dim arr1()    这样就是动态数组,dim arr1() 和  redim arr1() 联动
  • redim arr2(3)  这样也可以动态定义,redim就是动态定义,不能redim  arr1(5)

静态数组特点:

  • 静态数组不能再次dim,也不能redim
  • 静态数组不能在改变大小
  • 静态数组也不能被一个数组赋值(整体赋值)

动态数组特点:

  • 动态数组,可以被整体赋值为一个数组。
  • 动态数组如果想对某一个值进行赋值或修改,需要先把维数和维数大小声明清楚后才可以。

 

 

2.3 数组的数据类型:只是决定了,数组存储的数据的数据类型,和动态/静态无关

数组的数据类型

  • integer
  • string 
  • variant  (默认缺省) 可以存储变量的数组,而因为变量本身可以存储各种类型,所以数组可以存储各种类型的数据。 但是占据空间大。

定义数组的数据类型的差别

  • 如果定义为如下几种,所有元素都只能是这种类型的数据,否则会报错
  • 如果 dim arr1(3) as integer
  • 如果定义为 din  arr1() as variant 或 dim arr1() 缺省,都会默认为,可以存储变量的数组。

 

2.4 什么叫1维数组,什么叫2维数组?

 

  • 数组的维数
  • 1维数组,arr1(i)
  • 2维数组,arr2(i,j)
  • 3维数组,arr3(i,j,k)

 

 

  • 维度这个概念,一般是空间的概念
  • 我理解数组的维数,肯定是多维坐标轴能表示的,虽然不一定和多维空间联系起来。
  • 我理解多和维度是 相乘的关系。
  • 比如具体到EXCEL的数据,1维是行,2维是行*列,3维是 行*列*sheet名,4维是   行*列*sheets* workbooks
  •  

  • 直接VBA定义的数组,少数特殊
  • array(1,2,3)    array() 只能生成1维数组
  • 而直接 dim arr1(i,j,k) 是3维数组,或更高维都可以。

 

  • 来自工作表的数组,最多只可能是2维数组,不可能是3维数组(少数特殊情况下是一维数组)
  • [{}] 这个类[a1:c10] 和 range("a1:c10")  其实就是类工作表的区域
  • [{1,2,3}] 是1维数组, [{1,2,3;4,5,6}] 是2维数组, [{1,2,3;4,5,6;7,8,9}] 并不是3维数组,而是2维数组
  • range("a1")  range("a1:a10")   range("a1:c10")  都是二维数组  虽然EXCEL也会行列首尾相连,视为一维数组,但是还是当二维数组来的准确
  • 用transpose 转化1列为1行,只是1维数组,而不是二维数组,这个很难记住。我觉得还是不用transpose 全当二维数组用来的准确

 

Sub try4()


a = [{1,2,3}]
Debug.Print a(2)


b = [{1,2,3;4,5,6}]
Debug.Print b(1, 1)


c = [{1,2;3,4;5,6}]
Debug.Print c(3, 2)

Debug.Print "数组区域如果是来自EXCEL的1行或1列,本质是2维数组,但EXCEL会把区域先行后列前后连接为1个1维数组,也可以看做1维度"
Debug.Print Range("a1:a3")(3)
Debug.Print Range("a1:a3")(3, 1)
Debug.Print Range("a1:c1")(3)
Debug.Print Range("a1:c1")(1, 3)

Debug.Print "取的EXCEL表的区域,也可以自动前后组合为1个1维数组"
Debug.Print Range("a1:c2")(5)
Debug.Print Range("a1:c2")(2, 2)


Debug.Print "单行但列也可以trasnpose"
Debug.Print Range("a1:a3")(3)
Debug.Print Range("a1:a3")(3, 1)
Debug.Print Application.Transpose(Range("a1:a3"))(3)
'Debug.Print Application.Transpose(Range("a1:a3"))(1, 3)  '工作表的1列组被transpose为1行,只被识别为1维数组,记不住!还不如不transpose 当二维数组用简单,真麻烦
'd = Application.Transpose(Range("a1:a3"))
'Debug.Print d(1, 3)
'Debug.Print Application.Transpose(Range("a1:a3"))(1, 3)
Debug.Print Application.Transpose(Application.Transpose(Range("a1:a3")))(3, 1)


End Sub

 

举例

  • 一维数组
  • dim arr1(1)               '并且index从0开始
  • array(1,2,3,4,5)       '并且index从0开始
  • [{1,2,3}]                    '因为来自工作表,所以index从1开始

 

  • 二维数组
  • range("a1")
  • range("a1:a10")
  • [{1,2,3,4,5;6,7,8,9,10}]
  • [{1,2,3;4,5,6;7,8,9;7,8,9;7,8,9;7,8,9;7,8,9;7,8,9;7,8,9}]
  • dim arr1(3,5)             '并且index从0开始             

 

  • 三维数组
  • dim arr1(5,6,3)          '并且index从0开始             

 

2.4 什么叫嵌套数组

  • 数组作为其他数组的元素,叫嵌套数组,并不是多维数组
  • arr1=array(1,2,3)
  • arr2=array(arr1,1,2,3)

 

3 数组的定义

3.1  如何定义数组? 类定义变量

  • 定义变量
  • dim  a
  • 定义数组,需要带括号。
  • dim a() 
  • dim b(1,2)

 

3.2 数组定义有哪些方式?

  • 只有3种方式
  • dim 
  • dim 配合 redim
  • redim 

 

  • 声明数组需要用到 dim 和redim 
  • 声明静态数组
  • dim arr1(5)   或 dim arr1(5,3) 

 

  • 声明动态数组
  • dim arr1()
  • redim   用于过程级 声明动态数组变量,配合  dim arr1() 使用

 

3.3  dim的一定是静态数组,redim 一定是动态数组吗? NO,dim可以定义静态数组或动态数组

  • dim 可以定义静态/动态数组。
  • dim arr1()   数组只能dim 一次,否则就是重复dim定义数组了
  • redim 是动态定义, redim时,必须带上维数,长度等

 

  • 数组定义
  • dim 数组名()
  • dim arr1(4) 这样就是静态数组
  • dim arr1()    这样就是动态数组,dim arr1() 和  redim arr1() 联动

 

  • redim 其实算不上定义
  • 与 Dim 语句、Static 语句不同,ReDim 语句是一个可执行语句,由于这一语句,应用程序在运行时执行一个操作。
  • redim arr2(3)  
  • 注意,如果是 redim preserve 则只能修改数组的最后1维的大小,而且不能修改数组的维数!!
  • 只是redim 则很自由,随意

 

Sub try6()


Dim arr1()
ReDim arr1(5)
arr1(3) = 111


ReDim Preserve arr1(6)
Debug.Print arr1(3)

ReDim Preserve arr1(10)     '因为1维数组只1维,用preserve 保持1维,随便改大小
Debug.Print arr1(3)

'ReDim Preserve arr1(2 To 12)     '因为1维数组只1维,用preserve 保持1维,但可以改变上界,扩大缩小都可以
'Debug.Print arr1(3)


ReDim Preserve arr1(0 To 9)     '也可以缩小
Debug.Print arr1(3)

'ReDim Preserve arr1(1 To 15)     '用preserve 不能改变index的下界限
'Debug.Print arr1(3)


ReDim Preserve arr1(0 To 2)     '因为1维数组只1维,用preserve 保持1维,但如果preserve 掉了老数据,则可能取不到 arr1(3)
'Debug.Print arr1(3)             ' 这样取不到arr1(3)


'ReDim Preserve arr1(5, 5)   ' 会提示下标越界,因为用了preserve关键字,则只能改变最后一维的大小,而不能改变维数
'Debug.Print arr1(3, 1)


ReDim arr1(5, 5)             '不用preserve 则 redim 随便改
Debug.Print arr1(3, 1)



End Sub

 

3.4 数组定义的总结

  • 什么叫数组的定义? 定义什么?
  • 基础定义:就是把一个变量定义为数组
  • 完整定义,声明: 把1个变量定位为数组,并且声明数组的 维数,大小,数据类型!

 

  • 定义时可以完备,也可以不完备
  • 不完备的声明,把变量定义为数组,   如 dim arr1()  这种一般要和 redim arr1 配合使用
  • 比较完备的声明:把变量定义为数组的同时,也定义数组的维数,维数的大小,数组的数值类型     dim arr1(5)  as interger  或 redim  arr2(2) 


例子

Sub try1()

Dim arr1()
Dim arr2(1 To 3)
ReDim arr3(1, 5)


ReDim arr1(2)
arr1(0) = 1
arr2(1) = 55
arr3(1, 1) = 666
a = arr1
c = arr1()
ReDim arr1(5)
'ReDim c(6)        '变量a,b.c.d等只是指向数组,本身还是个变量,并不是数组

b = arr3
d = arr3()
ReDim arr3(2, 6)
'ReDim b(2, 6)    '变量a,b.c.d等只是指向数组,本身还是个变量,并不是数组


Debug.Print arr1(0)
Debug.Print arr2(1)
Debug.Print arr3(1, 1)

Debug.Print a(0)
Debug.Print b(1, 1)
Debug.Print c(0)
Debug.Print d(1, 1)
      
c = "abc"        '变量a,b.c.d还是变量,还可以改变其指向的内容
Debug.Print c


End Sub


 

3.5 不同的数组,index的 下界 lbound() 默认值不同,VBA的数组一般默认是0,来自EXCEL表的默认为1

不同的数组

  • 数组函数定义的内容,arr1= array(1,2,5)
  • 数组可以是excel的range() 单位赋值而成的 变量/对象,如 arr1=range("a1:c10")
  • 比如这样也是数组 arr1=[{1,2,3}]
  • MS 出了一个 sequence() 函数,暂时还没用过

 

VBA的数组定义

  • 用VBA的一维数组函数array() 或者 dim  或者 redim 这几种方法,默认index从0开始
  • 当然 dim  或者 redim 可以声明从1开始或从其他开始
  • 比如 dim arr2(1 to 3) 或 option base 2 等等

来源于工作表的数组定义

  • 而从工作表区域赋来的数组,无论是1维还是2维,index都从1开始
  • [{}] 这种赋值方式,我认为是偏工作表的,所以index也从1开始
  • 因为 [a1:b5] 就等同于 range("a1;b5")
  • 一般情况下,存储相同类型的多个数据  dim arr1 as variant
  • 也可以存储不同类型的多个数据
Option Explicit

Sub testArr1()
'Dim arr1() As Integer  '这样定义数组是不够的,只定义了是数组,没定义维数和大小,可以试试这样会在赋值时报错
Dim arr1(3) As Integer  '定义为integer了,默认至少是0,而不是空
Dim i

arr1(0) = 0
arr1(1) = 1
arr1(2) = 2
'arr1(3) = "abc"  '这样会报类型不匹配

For i = LBound(arr1, 1) To UBound(arr1, 1)
   Debug.Print arr1(i)
Next

End Sub


Sub testArr2()

'静态数组,静态在维数不变,长度不变,具体的某个内容可以变化
'Dim arr2 As Variant '错误写法
Dim arr2(2) As Variant   '定义了一个静态数组,且为存储为变量类型
Dim i

arr2(0) = 1
arr2(1) = "a"

For i = LBound(arr2, 1) To UBound(arr2, 1)
   Debug.Print arr2(i)
Next
End Sub

 

 

 

4 把数组赋值给其他变量  (变量只是指向数组,但变量不是数组!)

  • 直接给变量赋值一个数组,相当于把变量定义为了数组,比如    dim arr1()   然后  a=arr1() ,也有 b=array(1,2,3)
  • 随便 a=arr1()
  • 变量指向了数组,可以用 a(1)  指向arr1(1) 
  • 但是a 仍然是变量,不是数组,所以不能redim a 
  • 所以我现在这种写法里,虽然没有声明 option explicit ,如果声明了 option explicit 就必须先定义  dim a  或 dim a as variant ,也就是a 是变量,而不是数组。只是数组也可以赋值给变量a
  • 每个变量的类型是,定义时声明的,赋值不改变数据类型,只能改变变量里存储的内容。

 

 

5  给数组赋值

  • 静态数组
  • 可以给静态数组的单个元素赋值改变,但不能给静态数组整体赋值
  • 动态数组
  • 可以给动态数组的单元元素改变赋值,也可以整体改变赋值
  • 但给动态数组单个元素赋值时,需要先声明数组的维数和大小,否则报错
Sub try2()

Dim arr1(5)
Dim arr2()
Dim arr3()
ReDim arr4(2)


arr1(0) = 1
'arr1 = array(1, 2, 3, 4, 5)   '不能给数组赋值,是不能给静态数组赋值?


arr2() = array(1, 2, 3)

'arr3(0) = 1   '数组使用前,必须先redim 界定清晰(并不就是静态数组, redim arr3(2)虽然是动态的,也是界定清晰的)才可以赋值和使用
ReDim arr3(2)
arr3(0) = 1


End Sub

 

 

二 数组的使用(老文档!)

2.1 数组使用前,必须先定义维数和大小

特别是动态数组,使用前必须先redim() 数组大小后才可以使用

  • 静态数组因为事先声明过了,所以可直接使用
  • 变量可以不事先定义,也可以不赋初值,不同类型的变量,默认初值不同
  • 数组必须实现声明大小后才可以使用,包括运算,或者赋值
Sub test4()
Dim arr1()


ReDim arr1(11)  '不redim会报错
j = 1   'j=1也不会出错,但是arr1(0)会为空,不会被赋值
For i = 1 To 11 Step 1
If Not IsEmpty(Cells(i, 1)) Then
 arr1(j) = Cells(i, 1)
 j = j + 1
End If
Next i


For j = 0 To UBound(arr1())
Cells(j + 1, 9) = arr1(j)  '单元格得从1开始,arr()得从0开始
Next j


End Sub

 

2.2 数组的赋值  与  数组项的赋值

静态数组的数组名不能被(整体)赋值,只有 数组的元素,变量,对象可以被赋值

  • 变量,对象,本身是可变的,可以被赋值为数组,也可以赋值为其他内容,其他数组,可以被整体赋值
  • 动态数组,也可以整体赋值,甚至改变维数
  • 静态数组,只能赋值改变其1个元素,不能被整体赋值改变为其他内容
Sub test001()


Dim arr1(3)               '如果已经声明为数组名了,arr1就代表arr1(),以后就不能给数组赋值
Dim arr2  As Variant      '相当于dim arr2
Dim arr3 As Object


'arr1 = Range("a1:c1")     '不能给数组整体赋值? 只能给数组里的元素赋值?arr1 = Range("a1:c1").value 也不行
arr1(0) = Range("a1")      '可以给数组的某个元素赋值
arr2 = Range("a1:c1")      '可以给变量赋值,赋予这个变量整个数组
Set arr3 = Range("a1:c3")  '可以把EXCEL的range 赋值给变量,或对象。然后默认都成为了2维数组。
Range("b2:c2") = 9999


Debug.Print "arr1(0)=" & arr1(0)
Debug.Print "arr2(1,1)=" & arr2(1, 1)
Debug.Print "arr3(1,1)=" & arr3(1, 1)


End Sub

 

Sub test1002()

Dim arr1(10)
Dim arr2()
Dim arr3

'如果先定义为静态数组
arr1(0) = "a"    '注意如果写成arr1(0)=a ,赋值内容其实为空,因为变量是a,未赋值。
arr1(1) = 1001

For Each i In arr1
    Debug.Print i & " ";
Next
Debug.Print

'arr1 = Range("a1:a11")  '不能给数组赋值,其实就是不能整体赋值
For Each i In arr1
    Debug.Print i & " ";
Next
Debug.Print

'如果先定义为动态数组,也很灵活
arr2 = Range("a1:a5")
For Each i In arr2
    Debug.Print i & " ";
Next
Debug.Print

arr2 = Range("b1:b7")
For Each i In arr2
    Debug.Print i & " ";
Next
Debug.Print


'变量是很灵活的
arr3 = Range("a1:a3")
For Each i In arr3
    Debug.Print i & " ";
Next
Debug.Print

arr3 = Range("b1:b5")    'arr3是变量,可以改变维度,大小都行
For Each i In arr3
    Debug.Print i & " ";
Next
Debug.Print



End Sub

 

3  数组的范围

3.1 数组的index 下限和上限 :LBound(arr)  和 UBound(arr) ,数组的维数从1开始 lbound(arr1,1 ) 或  lbound(arr) 默认都是第1维

  • 没有第0维得概念,
  • 不要和index可能从0开始搞混!

  

  • 1维下限   lbound(arr,1)   lbound(arr) 

  • 2维下限   lbound(arr,2)

  • 3维下限   lbound(arr,3)

Sub 测试1()
Dim arr1 As Variant
arr1 = Range("a1:c4")    
Debug.Print arr1(3, 3)
Debug.Print LBound(arr1)
Debug.Print UBound(arr1)
Debug.Print LBound(arr1, 2)  '二维数组,第1维默认是行数,往下数!
Debug.Print UBound(arr1, 2)  '二维数组, array(row,column)


Sub 测试2()
Dim arr2()
arr2 = Range("a1:c4")
Debug.Print arr2(3, 3)
Debug.Print LBound(arr2)
Debug.Print UBound(arr2)
Debug.Print LBound(arr2, 2)
Debug.Print UBound(arr2, 2)
End Sub

Sub 测试3()
Dim arr2()
arr2() = Range("a1:c4")
Debug.Print arr2(3, 3)
Debug.Print LBound(arr2)
Debug.Print UBound(arr2)
Debug.Print LBound(arr2, 2)
Debug.Print UBound(arr2, 2)
End Sub
End Sub

 

4 静态数组

4.1 静态数组定义等

  • 静态数组定义的语法:
  • dim arr1(10) as string  ,index是从0开始,包含11个元素
  • dim arr2(5 to 10) as string
Sub t3()

Dim arr(10) As String

For i = 1 To 10 Step 1
arr(i) = i
Debug.Print (arr(i))
Next i

Debug.Print arr(5)
Debug.Print arr(0)   '不显示下标越界
Debug.Print arr(11)  '会显示下标越界


End Sub

4.2静态数组是不能redim的

Sub t3()

Dim arr5(1 To 5) As Integer
ReDim arr5(1 To 10) As String   '不能对静态数组redim改变大小


End Sub

 

5 动态数组

 5.1 动态数组定义 

  1. dim arr1()  或 dim arr3()  as string 
  2. 不定义,直接赋值,比如arr1=range()   或 set arr1=range()
  • 数组重定义:redim
  • 只能重定义动态数组! 也必须重定义大小! 不redim前无法使用
  • redim时,下标可以是变量
Sub t3()

Dim arr3() As Integer  '如果定义dim arr3 as integer 会成为一个变量
Dim arr4() As Integer

For i = 1 To 5 Step 1
   ReDim arr3(1 To i)  '使用数组的内容之前,必须先redim 否则会显示下标越界
   ReDim arr4(1 To i)
    arr3(i) = i
    arr4(i) = i
    Debug.Print (arr3(i))
    Debug.Print (arr4(i))

Next i


End Sub

 

5.2 只有动态数组才能,也必须redim,静态数组不要redim

  • 静态数组就不要再redim
  • 动态数据就一定需要redim
Sub t4()

Dim arr2()
Rem Dim arr2(5, 6)  '使用动态数组 redim就不要和 静态数组定义格式混用

For i = 0 To 5 Step 1
For j = 0 To 6 Step 1

ReDim arr2(0 To i, 0 To j)  '动态数组,必须在使用前redim '如果要用静态数组也可以,但不要再redim了!


arr2(i, j) = i + j
Debug.Print arr2(i, j)


Next j
Next i

 

5.3 如果数组赋值时指向EXCEL对象,是二维数组,不能这么使用arr(1),而是arr(i,j)

  • 指向excel对象,比如range() 的 默认为2维数组,因为EXCEL表本身就是二维数组!
  • 二维数组的下标,需要用excel里的r1c1模式
  • 因为是二维数组,不能这么使用,即使只是1行或者1列数,但仍然是二维数据结构!
  • arr1()=range("a1:e1")  虽然看起来只是a1 b1 c1 d1 e1 这5个数,但由于是在excel表里的对象,是二维的 
Sub t3()

Rem Dim arr6 As Integer
arr6 = Range("a1:a5")
Debug.Print arr6(1, 1)
Debug.Print arr6(2, 1)
Debug.Print arr6(3, 1)
Debug.Print arr6(4, 1)
Debug.Print arr6(5, 1)


End Sub

 

6 二维数组

  • dim arr1(4,5) as string
  • dim arr1 (0 to 4,0 to 5) as intege
Sub t4()

Dim arr1(0 To 4, 0 To 5) As Integer

arr1(0, 0) = 999
Debug.Print arr1(0, 0)


End Sub

 

7  定义三维数组

定义静态3维数组

Sub t4()

Dim arr3(3, 4, 5)

arr3(0, 0, 0) = 888
Debug.Print arr3(0, 0, 0)



End Sub

定义动态3维数组


Sub test1001()

Dim arr1()
m = 1


For i = 1 To 3
    For j = 1 To 3
        For k = 1 To 3
            ReDim arr1(i, j, k)
            arr1(i, j, k) = m
            Debug.Print "arr1(i, j, k)=" & arr1(i, j, k)
            m = m + 1
        Next
    Next
Next

 


 

VBA数组(最新)--代码实现
07-15
VBA数组(最新)--代码实现 VBA数组(最新)--代码实现
VBA数组详解
std7879的博客
05-11 4129
声明数组 因为数组也是变量,所以,你必须用声明其它变量的类似方法声明数组——使用Dim语句。当你声明一个数组时,你便设定了该数组储存数据所需要的内存空间。 我们来看看一个数组声明的例子: Dim cities(6) As String Dim daysOfWeek(7) As String Dim lotto(6) As Integer Dim exchange(5, 3) As Variant 注意,变量名称后面带有括号以及括号里有数字。一维数组要求括号里带一个数字,这个数字决定了这个数组能够储
2024年技术自媒体经验分享 —— 开始尝试认真做 CSDN 的一年后的复盘_csdn变现可行吗
最新发布
2401_84166376的博客
05-05 2862
其实我一开始没有想要做知识星球的打算,感觉开一个新的平台太痛苦了。直到某一天,有一位粉丝点醒了我,他告诉我,他见证了太多 KOL 的陨落,就是因为没有仔细考虑商业化,没有形成付费闭环,入不敷出,从而放弃了这个行业。于是,我抱着试一试的心态,开通了我的知识星球 —— 英雄算法联盟。
VBA数组的运用
m0_54284125的博客
11-18 568
处理量大的数据,还是用数组方便。学习记录备忘
VBA数组介绍
qq_40797063的博客
05-08 1万+
vba数组详解 数组创建 Dim arr () 创建一个动态变量数组,不受长度/数据类型受制 Dim arr(5) as string 创建一个一维数组,下标从0开始,最大下标值为5 Dim arr(3,3) as string 创建一个二维数组,开始arr(0,0),最后一个arr(3,3) 数组的赋值 1.通过Array函数赋值 Dim arr() arr=Array("red","yellow","blue","black") 2.通过for循环赋值 Dim arr(3) d
原创VBA学习笔记(304)VBA数组array基础知识(2):数组更适合整体处理,字典更适合操作每个元素
奔跑的犀牛先生
01-08 2343
1 数组更像1个整体,而字典更像1个集合适合逐个处理。 设计数组和字典的人,目的性很不同 理解array 和 dictionary 两者的定位有很多差别 1.1 数组的特点 1.1.1数组方便的操作----数组最好用的方法是:循环 数组整体赋值 arr1=range() (动态)数组整体改变赋值 取得数组的上下限制,lbound() 和 uboun...
vba二维数组初始化,在VBA中创建二维数组列表
weixin_34430580的博客
01-13 772
I am trying to practice with creating 2d array lists in VBA. I believe I am having a syntax issue. I am having trouble adding the y axis items into the rows. I get an error:'Invalid Procedure or argum...
VBA数组完全教程
热门推荐
navy2009的专栏
03-01 7万+
兰色幻想VBA数组入门教程10集 1. 前言:不要把VBA数组想的太神秘,它其实就是一组数字而已。 2. 数组的维数: Sub 数组示例()   Dim x As Long, y As Long   Dim arr(1 To 10, 1 To 3)  '创建一个可以容下10行3列的数组空间   For x = 1 To 4     For y = 1 To 3        arr
VBA数组使用
01-19
数组和字典也是VBA的常用到数据类型之一。但是我翻了有四五本VBA教程相关的书,里面都没有介绍到字典,数组到是在介绍数据类型时有介绍,而并没有提到字典。 事实上,字典不是VBA内置的类型,它是Windows脚本语言的。
VBA编程基础-.ppt
12-21
VBA编程基础-.ppt
vba-vbs-access-python-microstation学习体会
10-19
vba-vbs-access-python-microstation学习体会
灌砂法压实度计算表1-VBA测试.xlsm
02-12
1、按照随机数据限制生成随机数,符合条件结果后停止计算
VBA-excel最基础入门教程.pdf
12-05
VBA-excel最基础入门教程.pdf
VBA 数组定义,赋值,一维数组
奔跑的犀牛先生
12-19 5万+
1VBA数组的基础定义 1.1什么是数组? 就是一组数/字符等用同一个名字(这个名字就是:数组名),作为一个整体存储在一起 1.2什么是元素 这些被保存在同一个数组名下的,多个内容,称为element 元素 数组里的元素是可以重复的 1.3元素是怎么在数组内排序的? 数组是有序的 用什么来标识顺序呢?,就是index index 是一串连续的整数(也可以为负数),index必须 ...
Excel VBA - 数组及其他知识
10-29 1万+
数组:定义数组: Dim arr(30 To 50) As Single    定义数组,从30到50,定义为浮点型~ arr(30) = 34.3 产生随机数,但是随机数要不同(1到20之间产生10个不同的随机数) Sub sdlkfjl() For i = 1 To 10 Cells(1, i) = Int(1 + Rnd() * 19) '给个随
VBA,我的第一门语言(带你走进VBA的世界)
shanesu的博客
11-26 1万+
VBA是我正式学习的第一门计算机语言,也是一门我感情很深的计算机语言。它带我领略了编程的乐趣,让我相信一切皆有可能,一切皆可实现。它也给我带来的很多乐趣,很多工作机会。让我给你介绍一下它。 什么是VBA 百度百科 Visual Basic for Applications(VBA)是Visual Basic的一种宏语言,是微软开发出来在其桌面应用程序中执行通用的自动化(O...
Erase arr(清空VBA数组)
weixin_33721427的博客
01-26 5235
'在循环中,如果需要清空VBA数组,可以用Erase方法来实现. '该示例使用 Erase 语句重新初始化固定大小的数组中的元素,以及释放动态数组存储空间。 Dim NumArray(10) As Integer ' Integer 数组。 Dim StrVarArray(10) As String '变长的 String 数组。 Dim StrFixArray(10)...
VBA基础知识整理(事件,数组
weixin_42578747的博客
05-13 1726
事件 Private Sub Worksheet_SelectionChange(ByVal Target As Range) MsgBox "单元格选择发生了改变" End Sub ---------------------------------- Private Sub Worksheet_Change(ByVal Target As Range) Application.Enabl...
VBA基础语法:数组
blog
01-10 2868
声明数组 数组的声明方式和其它的变量是一样的,它可以使用 Dim、Static、Private 或 Public 语句来声明。标量变量(非数组)与数组变量的不同在于通常必须指定数组的大小。若数组的大小被指定的话,则它是个固定大小数组。若程序运行时数组的大小可以被改变,则它是个动态数组数组是否从 0 或 1 索引是根据 Option Base 语句的设置。如果 Option Base 没有指...
VBA 使用UBound(myArray) = -1判断数组为空报错
04-21
对于这个问题,我可以告诉你,UBound函数返回的是数组的上限,在数组为空时,UBound函数会返回-1,因此使用UBound(myArray) = -1判断数组为空会报错。你可以使用UBound(myArray) = LBound(myArray) - 1来判断数组为空。

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • VBA 数组定义,赋值,一维数组 53839
  • 【原创】VBA学习笔记(12)VBA的数组 array---基础知识(1) 53615
  • EXCEL的换行符等,输入,替换,和 char(10) char(13)等 36785
  • VBA: 如何停止当前VBA程序(尤其是死循环)的运行,用程序停止其他程序,暂停程序等(未完成) 35380
  • VBA中的颜色,colorIndex 或color 或backcolor 34955

分类专栏

  • 线性代数 9篇
  • 数学学习 3篇
  • maths--概率和统计 24篇
  • VBA基础知识 52篇
  • VBA实验 69篇
  • letcode
  • maths--数学杂学
  • 学习编程
  • code学习资料整理分享 7篇
  • 一个韭菜的自我修养 35篇
  • BAT命令行 19篇
  • HTML&CSS
  • microPython和pyboard 2篇
  • pygame游戏 1篇
  • cocos creator
  • python 53篇
  • Unity 12篇
  • cocos 4篇
  • 社会与人生 62篇
  • learn 6篇
  • VBA 92篇
  • EXCEL 99篇
  • 命令行 40篇
  • 爱与家庭 6篇
  • 游戏开发 5篇
  • ps
  • 机器学习 3篇
  • 爬虫 3篇
  • html&css 23篇
  • js
  • c#
  • microPython 2篇
  • git 7篇

最新评论

  • 【小白学机器学习10】假设检验之1:F检验,F检验量的构造,F分布,F分布查表求P值等

    richxie: 1.2 软件自动F检验那里是不是写反了

  • VBA跨表操作和取数据的各种问题,如跨表取其他EXCEL工作簿的sheet名

    qq_48692802: 老师,要是想实现同一个工作薄中sheet1跟sheet2的数值加减应该怎么写。

  • EXCEL如何生成不重复的随机数 ,多方法+原理

    qq_36123991: 哥们你没给出解决方法啊

  • 【题目2】 大衍数列,斐波拉契数列等,用VBA 和python解决

    普通网友: 文章结构严谨有条,层次分明,读起来一点也不费劲,让人受益匪浅。【我也写了一些相关领域的文章,希望能够得到博主的指导,共同进步!】

  • VBA,关于application.ontime 调用其他sub /function (过程函数名带数字) 时,显示无法执行宏的解决办法

    lzzzl: 最好带模块前缀,有参数要加引号,如果遇到多文档,周期性运行的文档最好单独以管理员身份运行。

最新文章

  • 【题目2】 大衍数列,斐波拉契数列等,用VBA 和python解决
  • 【python】在python3下安装 jupyter notebook,报错remove_stale_contenttypes.pyi‘ 报错 ‘jupyter‘ 不是内部或外部命令,也不是可运行的
  • 【题目1】 切面条
2024年21篇
2023年100篇
2022年83篇
2021年57篇
2020年124篇
2019年292篇
2018年90篇

目录

目录

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

聚圣源四四方起的英文翻译名网免费取名苏辞月秦墨寒免费阅读全文企业独资起名静电绝缘成就怎么做女生起名字姓袁给替身起名字企业起名字大全免费企业公司名字免费起名blnp在劫难逃的意思孩子起名大全测试赤脚小子汉北河中老年服装店起名大全上海银七星滑雪场家具品牌名称起名神奇校车家庭清洁用品起名大全假面骑士kabuto剧场版特斯拉涨价52rrr宝宝软件起名排行榜剑尊叶玄叶灵最新章节动森起名字方姓的男宝宝起名www.ady9.net楼梯设计规范智能剑匣高端化妆品的起名淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男孩疑遭霸凌 家长讨说法被踢出群国产伟哥去年销售近13亿网友建议重庆地铁不准乘客携带菜筐雅江山火三名扑火人员牺牲系谣言代拍被何赛飞拿着魔杖追着打月嫂回应掌掴婴儿是在赶虫子山西高速一大巴发生事故 已致13死高中生被打伤下体休学 邯郸通报李梦为奥运任务婉拒WNBA邀请19岁小伙救下5人后溺亡 多方发声王树国3次鞠躬告别西交大师生单亲妈妈陷入热恋 14岁儿子报警315晚会后胖东来又人满为患了倪萍分享减重40斤方法王楚钦登顶三项第一今日春分两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?周杰伦一审败诉网易房客欠租失踪 房东直发愁男子持台球杆殴打2名女店员被抓男子被猫抓伤后确诊“猫抓病”“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火男孩8年未见母亲被告知被遗忘恒大被罚41.75亿到底怎么缴网友洛杉矶偶遇贾玲杨倩无缘巴黎奥运张立群任西安交通大学校长黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发妈妈回应孩子在校撞护栏坠楼考生莫言也上北大硕士复试名单了韩国首次吊销离岗医生执照奥巴马现身唐宁街 黑色着装引猜测沈阳一轿车冲入人行道致3死2伤阿根廷将发行1万与2万面值的纸币外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万手机成瘾是影响睡眠质量重要因素春分“立蛋”成功率更高?胖东来员工每周单休无小长假“开封王婆”爆火:促成四五十对专家建议不必谈骨泥色变浙江一高校内汽车冲撞行人 多人受伤许家印被限制高消费

聚圣源 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化