结论:

本文涉及内容

  • 从4维数组看对多维数组的认识
  • 3维数组和数组嵌套的区别
  • 以及3维数组与redim()的使用注意点

数组的dim arr1() 或 redim arr1()

  • 数组可以dim 或者redim
  • 只有在循环过程中,不断的redim 我觉得才是动态数组!
  • 数组在redim arr1() 那一刻就被定义了,之后无法被改变
  • 如果数组已经 dim arr1() 后面就不能在redim 了
  • 但是redim 可以重复进行,所以也可以在循环过程中 redim

低级错误1:多维数组和数组嵌套是一回事吗?NO

  • 多维数组不同于数组嵌套
  • 多维数组,是数组结构的定义,书写的方式是 array(x,y) ---准确的写法是 array(0 to x, 0 to y)
  • 数组嵌套,是数组的某个元素的构成允许嵌套,书写的方式是  array()()
  • 还是理解的不深,以后还需要再思考

低级错误2:两种语法区分

  • 下面两者傻傻分不清楚
  • dim array1(1,1,1)       这个是 dim array1(0 to 1 ,0 to 1,0 to 1) 的简写,定义的是1个3维数组
  • 错误写法   dim array(1,1,1,1) 不允许使用保留字
  • arr1=array(1,1,1,1)       这个是用1个一维数组array(1,1,1)赋值给一个变量arr1

1 什么是 多维数组?

1.1 从1个4维数组举例说起

  • 定义4维数组
  • 简单的静态方法  dim arr1(a,b,c,d)
Sub test1001ccc()
'静态数组的方法定义4维数组Dim arr1(1, 1, 1, 1)
x = 1
For i = 0 To 1For j = 0 To 1For K = 0 To 1For m = 0 To 1arr1(i, j, K, m) = xx = x + 1Debug.Print "arr1(" & i & "," & j & "," & K & "," & m & ")=" & arr1(i, j, K, m) & "   ";NextDebug.PrintNextDebug.PrintNextDebug.Print
Next
End Sub

1.2 从4维数组的内容展示,尝试对4维数组的理解

这个是上面那个4维数组的内容展示

arr1(0,0,0,0)=1   arr1(0,0,0,1)=2   
arr1(0,0,1,0)=3   arr1(0,0,1,1)=4

arr1(0,1,0,0)=5   arr1(0,1,0,1)=6   
arr1(0,1,1,0)=7   arr1(0,1,1,1)=8

arr1(1,0,0,0)=9   arr1(1,0,0,1)=10   
arr1(1,0,1,0)=11   arr1(1,0,1,1)=12

arr1(1,1,0,0)=13   arr1(1,1,0,1)=14   
arr1(1,1,1,0)=15   arr1(1,1,1,1)=16

  •  dim arr1(1,1,1,1) 这个是个4维数组
  • 可以理解arr1(a,b,c,d) 每个 a  b  c d  代表1维
  • 也可以理解从数组的内容展示分组,每1维的展示关系,有这种逻辑的包含关系(是不是非要用3维坐标系思考的一种谬误?)
  • 但是数据的完整真实,确实一层层存在这种包含关系啊
  • 头脑上始终存在一个3维坐标系

  

1.3 极限情况下:每1维都只有1长度,还是多维数组吗? YES

如果只有每个维度只有1,整个数组只有1个元素呢,还是多维数组吗?我觉得是

  • 下面的还是3维数组
  • 可以理解维一个单位维1的小立方体?
Sub test1001ddd()
'静态数组的方法定义3维数组Dim arr1(0, 0, 0)
x = 1
For i = 0 To 0For j = 0 To 0For K = 0 To 0arr1(i, j, K) = xx = x + 1Debug.Print "arr1(" & i & "," & j & "," & K & ")=" & arr1(i, j, K) & "   ";NextDebug.PrintNextDebug.Print
Next
End Sub

    

2 三维数组的正常定义

2.1 定义为静态数组

2.1.1 静态数组的定义

  • 静态数组
  • 所谓的静态,就是指在使用数组以前,先界定数组的 维数,边界大小等等
  • 比如 dim arr1(3,3,3)  其实完整的写法是  dim arr1(0 to 3, 0 to 3, 0 to 3) ,下面展示了这两种写法是等同的
  • 接下来的问题:
  • 静态数组定义的数组,还可以被redim吗?NO, 下面有实验

2.1.2 对3维数组的展示

  • 其实从数组的维数来看,我不自觉的映射了,3维空间和3维坐标系的先入为主的思路

展示方式1

Sub test1001a()
'静态数组的方法定义三维数组Dim arr1(3, 3, 3)
N = 1
For i = 0 To 3For j = 0 To 3For K = 0 To 3arr1(i, j, K) = NDebug.Print "arr1(" & i & "," & j & "," & K & ")=" & arr1(i, j, K)N = N + 1NextNext
Next
End Sub

展示方式2

Sub test1001b()
'静态数组的方法定义三维数组Dim arr1(3, 3, 3)
N = 1
For i = 0 To 3For j = 0 To 3For K = 1 To 3arr1(i, j, K) = NDebug.Print "arr1(" & i & "," & j & "," & K & ")=" & arr1(i, j, K);N = N + 1NextDebug.PrintNextDebug.Print
Next
End Sub

Sub test1001c()
'静态数组的方法定义三维数组Dim arr1(0 To 3, 0 To 3, 0 To 3)
N = 1
For i = 0 To 3For j = 0 To 3For K = 1 To 3arr1(i, j, K) = NDebug.Print "arr1(" & i & "," & j & "," & K & ")=" & arr1(i, j, K);N = N + 1NextDebug.PrintNextDebug.Print
Next
End Sub

2.1.3 静态数组,可以redim吗? NO

  • 事实证明,已经 dim arr1() 过的数组,不能再被redim

2.2 在使用前一次性redim  和刚开始就 dim 感觉没啥区别吧,我感觉这只是 redim 并不是动态数组

  • 在循环外部一次性redim() 好数组的大小
  • 我感觉,这时候无论 redim(i,j,k) 这种,或者是 redim  arr3(3,3,3) 本质没区别
  • 都是使用数组前定义
  • 其实和 dim arr3(3,3,3) 也没啥区别把
Sub test1003a()
'动态数组的方法定义三维数组
'如果再循环外面,redim 数组会比较麻烦
Dim arr3()
a = 3
i = 3
j = 3
K = 3
ReDim arr3(i, j, K)
For i = 1 To 3For j = 1 To 3For K = 1 To 3arr3(i, j, K) = aDebug.Print "arr3(" & i & "," & j & "," & K & ")=" & arr3(i, j, K)a = a + 3NextNext
Next
Debug.PrintEnd Sub

和上面一样

Sub test1003b()
'动态数组的方法定义三维数组
'如果再循环外面,redim 数组会比较麻烦
Dim arr3()
a = 3
ReDim arr3(3, 3, 3)
For i = 1 To 3For j = 1 To 3For K = 1 To 3arr3(i, j, K) = aDebug.Print "arr3(" & i & "," & j & "," & K & ")=" & arr3(i, j, K)a = a + 3NextNext
Next
Debug.PrintEnd Sub

2.3 展示错误示例

  • 如果redim() 在循环外,且redim不合适则会 报错“越界”.比如 k=2,
  • 数组在redim arr1() 那一刻就被定义了,之后无法被改变
  • 比如 redim(i,j,k) 后面改 i, j ,k 无意义了!!当时 i j k 没赋值,就相当于 redim (0,0,0)
  • 记住 数组必须 redim () 当时那一刻数组就界定了。

错误例子1:虽然redim arr(i,j,k) ,数组已经被确定了,虽然 i,j,k  在redim 之后赋值,也不能改变数组了!

Sub test1004a()'这是一个错误示例,能看出arr3(0,0,0)可以,但是到 arr3(0,0,1)会报错了!
'在循环外redim数组,相当于dim为静态了
'redim 数组会比较麻烦,需要一定redim准确,或足够大Dim arr3()
a = 3ReDim arr3(i, j, K)
'如果不在redim之前给变量赋值,相当于变量还是为空,也就是redim(0,0,0)
'这种redim是无意义的
i = 3
j = 3
K = 3For i = 0 To 3For j = 0 To 3For K = 0 To 3arr3(i, j, K) = aDebug.Print "arr3(" & i & "," & j & "," & K & ")=" & arr3(i, j, K)a = a + 3NextNext
Next
Debug.PrintEnd Sub

错误例子2:上面的例子和直接 redim arr(i,j,k) ,完全不给 i , j ,k 赋值一样,因为vBA 默认变量不定义,初值为0

Sub test1004d()
Dim arr3()
a = 3
ReDim arr3(i, j, K)
'错误例子
'如果不在redim之前给变量赋值,相当于变量还是为空,这种redim是无意义的For i = 0 To 3For j = 0 To 3For K = 0 To 3arr3(i, j, K) = aDebug.Print "arr3(" & i & "," & j & "," & K & ")=" & arr3(i, j, K)a = a + 3NextNext
Next
Debug.PrintEnd Sub

而这样就是对的

  • 也就是 dim 或 redim 数组后,给数组赋值时,不要超过数组的空间就行
  • 比如下面的例子,i,j,k>=3就行
  • 但如果 i,j,k =2 也还是会报错
Sub test1004c()  '这个是对的
Dim arr3()
a = 3
i = 4   '只要大于等于3就行
j = 4
K = 4
ReDim arr3(i, j, K)For i = 0 To 3For j = 0 To 3For K = 0 To 3arr3(i, j, K) = aDebug.Print "arr3(" & i & "," & j & "," & K & ")=" & arr3(i, j, K)a = a + 3NextNext
Next
Debug.PrintEnd Sub

2.4 在循环内部一直多次动态 redim(i,j,k)  真正实现动态数组的感觉

  • redim arr1(i,j,k) 并且 i,j,k 一直在变化
  • 如果redim() 为变量,也就是数组的大小不能确定,是变化的,适合放在循环体内redim()多次,也就是变化多次
  • 注意 redim(i,j,k) 这种,当i,j,k 没有赋值的时候,变量为空,相当于没有redim()

Sub test1002()
'动态数组的方法定义三维数组,如果redim需要用到变量,把redim放在循环体里面会好一些
'因为相当于每次循环都在灵活的 又重新redim
Dim arr2()
m = 2
For I = 1 To 3For J = 1 To 3For K = 1 To 3'这里的redim有意义,因为具体的值会替代变量ReDim arr2(I, J, K)arr2(I, J, K) = mDebug.Print "arr2(" & I & "," & J & "," & K & ")=" & arr2(I, J, K)m = m + 2NextNext
Next
Debug.Print
End Sub

3 问题:多维数组 和 数组的嵌套是一回事吗?NO

3.1 特殊写法 arr1()()() ,这个是数组的嵌套,语法定义是  Array(arr1(), arr2()) 这种

  • array() 函数的作用,就是生存一个 一维数组
  • 这种特殊写法arr1(0)(1)(1),我理解为是第1个数组元素的,range里的第1行第1列,这个是数组嵌套
  • 语法外层肯定是一个 array() 函数,比如  arr1 = Array(Range("a1:a4"), Range("b1:b4"), Range("c1:c4"))
  • Rem array()定义的都是1维数组,但元素本身是2个维数组,但是这仍是一维数组!
Sub 测试1()Dim arr1arr1 = Array(Range("a1:a4"), Range("b1:b4"), Range("c1:c4"))
Rem array()定义的都是1维数组,但元素本身是2个维数组,但是这仍是一维数组!Debug.Print "arr1(0)(1)(1)=" & arr1(0)(1)(1)For I = 1 To UBound(arr1)Debug.Print "arr1(" & I & ")(2)(1)=" & arr1(I)(2)(1) '写成arr(i)会报类型不匹配,因为数组维数不对
Next I'这种特殊写法arr1(0)(1)(1),我理解为是第1个数组元素的,range里的第1行第1列For Each I In arr1(0)Debug.Print I;
Next
Debug.PrintFor Each I In arr1(1)Debug.Print I;
Next
Debug.PrintFor Each I In arr1(2)Debug.Print I;
Next
Debug.PrintEnd Sub

3.2 这才是三维数组的   dim arr(i,j,k)  或 redim (0 to i, 0 to j , 0 to k)  多维数组靠定义出来,只有定义为多维数组的才是多维数组

  • 多维数组靠定义出来,只有定义为多维数组的才是多维数组
三维数组的表示问题,和之前的不同了
Sub test_3d()Dim arr1(1 To 2)
Dim arr2(1 To 2, 1 To 2)
Dim arr3(1 To 2, 1 To 2, 1 To 2)
Dim arr4arr1(1) = 1
arr2(1, 1) = 10
arr3(1, 1, 1) = 100
'arr4(1)(1)(1) = 100  '错误Debug.Print arr1(1)
Debug.Print arr2(1, 1)
Debug.Print arr3(1, 1, 1)
'Debug.Print arr4(1)(1)(1)End Sub

3.3 测试多维数组和 数组嵌套的不同

Sub test1()Dim arr1
Dim arr2
Dim arr3
Dim arr4
Dim arr5(3, 4, 5)arr1 = Range("b1:b3")
Debug.Print arr1(3, 1)
'Debug.Print arr1(3)(1)arr2 = Range("b1:b3").Value
Debug.Print arr2(3, 1)
'Debug.Print arr2(3)(1)arr3 = Array(Range("a1:a3"), Range("b1:b3"))
'Debug.Print arr3(0, 1, 1)
Debug.Print arr3(1)(1)(3)'arr4 = Array(Range("a1:a3"), Range("b1:b3")).Value   '报错
''Debug.Print arr4(0, 1, 1)
'Debug.Print arr4(1)(1)(3)arr5(0, 0, 0) = 111
Debug.Print arr5(0, 0, 0)
'Debug.Print arr5(0)(0)(0)End Sub

3.4 显示3维数组 和嵌套数组里的内容,比较

3.4.1 多维数组显示,很方便

Sub testarr222()Dim arr222()
ReDim arr222(2, 2, 2)
a = 1'For i = LBound(arr222, 0) To UBound(arr222, 0)  '这样写报错
For i = LBound(arr222) To UBound(arr222)         '这样写OKFor j = LBound(arr222, 1) To UBound(arr222, 1)For K = LBound(arr222, 2) To UBound(arr222, 2)arr222(i, j, K) = aa = a + 1Debug.Print arr222(i, j, K);NextDebug.PrintNextDebug.Print
NextDebug.Print "arr222(1, 1, 1)=" & arr222(1, 1, 1)
'Debug.Print arr222(1)(1)(1)End Su

3.4.2 嵌套数组的显示,需要先清楚 嵌套结构,且无法直接 debug.print 被嵌套的数组内容

Sub testarr333()Dim arr333()arr11 = Array(1, 2, 3)
arr12 = Array(4, 5, 6)
arr13 = Array(7, 8, 9)
arr101 = Array(arr11, arr12, arr13)arr21 = Array(10, 11, 12)
arr22 = Array(13, 14, 15)
arr23 = Array(16, 17, 18)
arr102 = Array(arr21, arr22, arr23)arr31 = Array(19, 20, 21)
arr32 = Array(22, 23, 24)
arr33 = Array(25, 26, 27)
arr103 = Array(arr31, arr32, arr33)arr333 = Array(arr101, arr102, arr103)'For Each i In arr333
'   Debug.Print i
'Next'For i = LBound(arr333) To UBound(arr333)
'    Debug.Print arr333(i)
'Next
'Debug.Print arr333(1)(1)      'debug.print 不能直接显示数组
'Debug.Print arr333(1, 1, 1)   '不是多维数组,不能这样For i = LBound(arr333(0)(0)) To UBound(arr333(0)(0))Debug.Print arr333(0)(0)(i)
NextDebug.Print "arr333(1)(1)(1)=  " & arr333(1)(1)(1)End Sub

VBA: 什么是多维数组:从4维数组说起。兼3维数组和数组嵌套的区别相关推荐

  1. 嵌入式 ARM 汇编编程例题(二维数组按规律求和,求两数 gcd / lcm,求数组 min / max,字符串复制,排序)

    文章目录 0x00. 整数加减乘除 0x01. 一维数组按某种规律求和 0x01.1 求 1~100 之和 0x01.2. 求一维数组的和 0x01.2. 求一维数组的所有奇数的和 0x02. 二维数 ...

  2. qt 二维数组初始化_第十九章、C语言学习之数组3

    这一章我们来看一看多维数组. 我们假设有这么一个一维数组int a[6]:这个数组里面有6个元素,那么我们可以看成这样一幅图: 那么如果这个数组中a[0]这个元素不是单纯的一个变量,而是一个5个元素的 ...

  3. 机器学习之数学基础(二)~数组、向量、矩阵、向量空间、二维矩阵

    1. 概述 在学习机器学习(machine learning)或模式识别(pattern recognition)过程中,我经常会困惑于向量.数组和矩阵这三种数据结构,而在学习张学工教授<模式识 ...

  4. c语言多维数组指针地址讲解,C语言入门之多维数组的指针变量

    一.多维数组地址的表示方法 设有整型二维数组a[3][4]如下: 0 1 2 3 4 5 6 7 8 9 10 11 设数组a的首地址为1000,各下标变量的首地址及其值如图所示. 在前面曾经介绍过, ...

  5. c语言随机生成整数存放一维数组_C语言入门教程(十)多维数组

    作业: 1.编写程序从键盘得到一个非负数,统计出每个数字在各数位上出现的次数并把结果打印在屏幕上 一.变长数组 C99规范中允许使用变长数组 声明变长数组时可以使用变量表示存储区个数 如果多次运行这个 ...

  6. 二维数组 类型_「初识C语言」二维数组

    一维数组只有一个下标,称为一维数组,其数组元素也称为单下标变量.在实际问题中有很多量是二维的或多维的,因此C语言允许构造多维数组.多维数组元素有多个下标,以标识它在数组中的位置,所以也称为多下标变量. ...

  7. c语言字符串二维数组的动态分配应,C语言中动态分配二维数组复习过程.doc

    C语言中动态分配二维数组复习过程.doc C语言中动态分配二维数组在C中动态分配内存的,对于单个变量,字符串,一维数组等,都是很容易的.C中动态分配二维数组的方法,很少有C语言书中描述,我查找了有的C ...

  8. c语言二维数组中的周边,【C语言】二维数组中的查找,杨氏矩阵

    //二维数组中的查找,杨氏矩阵 //在一个二维数组中,每行都依照从左到右的递增的顺序排序.每列都依照从上到下递增的顺序排序. //请完毕一个函数.输入这种一个数组和一个数,推断数组中是否包括这个数. ...

  9. Java数组学习笔记(遍历、排序、多维数组、命令行参数)

    文章目录 数组的遍历和快速打印 冒泡排序和快速排序 数组和字符串排序的区别 多维数组建立和输出 命令行向main()传递参数 数组的遍历和快速打印 一.数组的遍历 数组的遍历有两种方法,一种是使用fo ...

最新文章

  1. PCL滤波介绍(3)
  2. vue 导航栏刷新页面定位:
  3. 在动作观察,运动想象和站立和坐姿执行过程中解码脑电节律
  4. ./configure: error: the HTTP rewrite module requires the PCRE library
  5. NOtePad++快捷键大全
  6. BigDecimal add方法问题:调用add后,求和结果没变
  7. tf卡量产工具万能版_新物1TB TF卡正式开卖!容量大得惊人,售价也同样不菲
  8. 组件 DataList 和 ObjectDataSource
  9. 微服务组件记事本:Skywalking的ES索引 · 收藏篇
  10. php服务模块在nginx中的安装失败,在已安装的nginx中添加模块
  11. linux 查看tdagent进程,Zabbix监控记录linux服务器近期的登录情况
  12. Oracle :备份 、还原数据库
  13. html增删改查按钮控件,HTML DOM节点的增删改查
  14. camunda 流程执行追踪_从Activiti分裂而来的camunda BPM
  15. Android--使用融云SDK开发即时聊天(一)----基本环境搭建
  16. 如何使Tello无人机能够通过Python进行条形码扫描?
  17. DeepChem手册3.10 MoleculeNet
  18. Packer Terraform 让 ESS 更灵活
  19. 昨晚《体育世界》LBJ在CCTV5
  20. 【Qt5】创建文件夹

热门文章

  1. 有啊网页诊断工具相关总结
  2. 谷歌和亚马逊在赌场门口拉客,你上谁的船?
  3. rabbitmq学习笔记2 : 添加用户和virtual hosts
  4. 2017年8月14日套题记录 | 普及组
  5. redis源码分析 -- cs结构之服务器
  6. 销售业绩管理系统 c语言作业,管理信息系统知识
  7. matlab csp详解,内容安全策略(CSP)详解
  8. IP-SAN客户端配置及使用
  9. EBS FA资产模块新增CIP在建工程手册
  10. HTML+css3个人博客html源码