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

VBA 数组定义,赋值,一维数组1VBA 数组的基础定义 1 1 什么是数组 就是一组数 字符等用同一个名字 这个名字就是 数组名 作为一个整体存储在一起 1 2 什么是元素这些被保存在同一个数组名下的 多个内容 称为 element 元素 数组里的元素是可以重复的 1 3 元素是怎么在数组内排序的 数组是有序的 用什么来标识顺序呢 就是 index index 是一串连续的整数 也可以为负数 index 必须

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

 

 

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

 

 

二维数组

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/215603.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午1:52
下一篇 2026年3月18日 下午1:52


相关推荐

  • html滑动解锁,js实现滑动解锁效能(PC+Moblie)

    html滑动解锁,js实现滑动解锁效能(PC+Moblie)js实现滑动解锁功能(PC+Moblie)实现效果:css样式代码略。html代码:页面上导入了jquery.mobile、jquerySlidetoconfirmIamhuman!js代码:window.onload=function(){varslider1=newSlider();slider1.Init();///屏幕大小发生改变时触发$(window).res…

    2022年6月18日
    34
  • 华三路由交换配置命令_h3c路由器配置命令都有哪些 h3c路由器配置命令大全【详解】…[通俗易懂]

    华三路由交换配置命令_h3c路由器配置命令都有哪些 h3c路由器配置命令大全【详解】…[通俗易懂]对于一般的家庭路由器而言,我们是不需要对他进行配置的。因为家庭路由器这一种小型路由器一般都已经了确定的指令去执行。但是对于一些大型路由器而言,配置命令是非常重要的。正是因为有了配置命令的存在,才能够使大型路由器实行大规模的命令执行。那么接下来,小编就来给大家以H3C路由器为例子,讲讲大型路由器的一些常用基本配置命令吧。快捷键Ctrl+A,将光标移动到当前行的开头Ctrl+B,将光标向左移动一个…

    2022年10月17日
    5
  • 在pycharm中查看python版本的方法

    在pycharm中查看python版本的方法方法一 importsyspri sys version 方法二点击 File Setting 可查看当前环境的 python 版本

    2026年3月27日
    2
  • python矩阵转置_对python矩阵转置transpose的实例讲解「建议收藏」

    python矩阵转置_对python矩阵转置transpose的实例讲解「建议收藏」对python矩阵转置transpose的实例讲解在读图片时,会用到这么的一段代码:image_vector_len=np.prod(image_size)#总元素大小,3*55*47img=Image.open(path)arr_img=np.asarray(img,dtype=’float64′)arr_img=arr_img.transpose(2,0,1).reshape…

    2022年6月2日
    38
  • 51单片机c语言 if 语句,单片机if语句的用法

    51单片机c语言 if 语句,单片机if语句的用法单片机 if 语句格式 sbitP2 0 A1 sbitP1 0 A2 sbit 语句等号后边应该是地址 sbitP2 0 A1 能通过编译码 本人试一下 test C 6 errorC141 syntaxerrorn pected 很遗憾 没通过 如果改成 sbitA1 P2 0 sbitA2 P1 0 试试 注意分号 语句只能使用英文字符 还有 if A1

    2026年3月19日
    3
  • Java单例模式8种方式 详解

    Java单例模式8种方式 详解Singleton所谓单例,指的就是单实例,有且仅有一个类实例,这个单例不应该由人来控制,而应该由代码来限制,强制单例。运用场景很多,例如网站的在线人数,window系统的任务管理器,网站计数器等等,这些都是单例模式的运用。单例模式有常见的8种形式,如下:1.Lazy1【不可用】懒汉式1:线程不稳定延迟初始化多线程不安全是最基本的实现方式,不支持多线程,因为没有synchronized加锁,多线程不能工作。实现图多线程则会出现,当Singleton_La

    2022年8月11日
    11

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号