数组

一、数组基本概念

  • 一维、二维和三维数组

1、常量数组

array(1,2,3)
array(array(1,2,3),array("1","2","3"))

2、静态数组

arr(5) '五个元素,下标从0开始
arr(1 to 5) '五个元素,下标从1开始
arr(1 to 5,1 to 10) '二维数组,五行十列

3、动态数组

  • 动态数组确定元素的个数再进行redim,可以多次redim 调整容量
  • 就是可以动态确定数组的行和列
dim arr1()
dim i as integer
i = 10
redim arr(i)Sub test()Dim arrDim i As Integeri = 10ReDim arr(i)arr(1) = 123Debug.Print arr(1)ReDim arr(20)arr(19) = 188888Debug.Print arr(19)
End Sub

excel 提示框的启用和禁用:application.displayalerts = true

二、数组的读写

1、向数组写入数据

  • 常量数组可以直接赋值给一个变量即可使用
  • 静态和动态的数组通过循环进行赋值,可以直接指定位置进行赋值
  • 用单元格的区域进行赋值的时候要注意,只能赋值给一个普通的变量,然后这个变量就指向了包含行列的二维数组,不能给明确定义的数组变量进行range的批量赋值

2、从数组中读取数据

  • 可以直接将数组的赋值给单元格区域,需要注意的是,数组元素个数需要大于等于单元格数量,否则会出现错误,数组元素多了的话就是部分存进单元格,少了会出现错误的值
  • 一般的使用中为了提高代码运行的效率都是将单元格区域存入数组,进行加工处理后,再重新赋值到单元格这样速度会有所提升
  • 一维数组的话对应的是表的行,直接可以赋值到行,如果要赋值到列的话需要转置
Sub test()Dim arr(1 To 3)For i = 1 To 3arr(i) = i * 10Next i   Sheets(1).Range("a10").Resize(3, 1) = Application.Transpose(arr)
End Sub
  • 只要是单元格区域赋值到变量,那么这个变量指向的就是一个二维的数组,哪怕单元格的区域就是一行或者一列
Sub test()Dim arr, arr1arr = Range("a1:c1")arr1 = Range("a1:a10")Stop
End Sub

注意:一维数组的下标默认是从 0开始的,二维数组的下标默认是从 1开始的

3、动态扩容

数组的大小
  • 一维数组:ubound(arr)索引上界 lbound(arr)索引下界
  • 二维数组:ubound(arr,1) lbound(arr,1)行的索引上界和下界,其中的1换成2就是列了
动态扩容
  • 一维数组的扩容很简单,二维数组的扩容是针对列的,行是无法实直接现扩容的
  • 一般二维数组扩容行的话都是通过转置来实现的,先把行转列,扩容完后将列转行
  • 但是一般不这么玩,直接将行定义足够大即可,不是很追求性能和效率的话
Sub test()Dim arr, arr2()arr = Array(1, 2, 3)For i = 0 To UBound(arr):ReDim Preserve arr2(i)arr2(i) = arr(i)Next iDebug.Print UBound(arr)
End Sub'二维数组
Sub test()Dim arr, arr2()arr = Range("a1:d4")Dim x, k As IntegerFor x = 1 To UBound(arr):k = k + 1ReDim Preserve arr2(1 To 4, 1 To k)arr2(1, k) = arr(x, 1)arr2(2, k) = arr(x, 2)arr2(3, k) = arr(x, 3)arr2(4, k) = arr(x, 4)Next xRange("a8").Resize(k, 4) = Application.Transpose(arr2)
End Sub

4、清空数组

  • 数组的清空使用 erase
Sub test()Dim arr, arr2()arr = Array(1, 2, 3)Erase arr
End Sub

5、示例练习

  • 最终要实现的效果就是将 b 列中大于100的行填充为红色
Sub test11()Dim str, arr, allrows, x, x1allrows = Range("a65535").End(xlUp).Rowarr = Application.Transpose(Range("b1:" & "b" & allrows))For x = 1 To UBound(arr)If arr(x) > 100 Thenx1 = xIf x <> UBound(arr) ThenDox = x + 1Loop While arr(x) > 100str = str & x1 & ":" & x - 1 & ","Elsestr = str & x1 & ":" & x & ","End IfIf Len(str) > 10 ThenIntersect(Range("a:b"), Range(Left(str, Len(str) - 1))).Interior.ColorIndex = 3End IfEnd IfIf x = UBound(arr) ThenIntersect(Range("a:b"), Range(Left(str, Len(str) - 1))).Interior.ColorIndex = 3End IfNext x
End Sub

三、数组和函数

  • 用一些函数来操作数组可以大大简化我们的编程

1、最值

  • application.max|min|large(arr,2)|small
  • 其中的 large 后面的数字可以指定第几大的,small 也是一样的

2、求和

  • application.sum

3、统计个数

  • application.count 统计数字的个数
  • counta 统计填充的字符数

4、数组查找

  • application.match("ab",arr,0)
  • 很多类似的可以用来在单元格区域使用函数都可以用在数组上,因为二者在vba中本质都是数组

5、其他函数

  • split 和 join:vba的内置函数可以省略vba.split的写法直接使用
Sub test()Dim tete = "ha-ll-o"arr = Split(te, "-")ha = Join(arr, "|")
End Sub

  • filter:测试发现好像只能针对一维数据进行过滤
Sub test()Dim arr, arr1arr = Range("a1:b1")arr1 = Filter(Application.Index(arr, 1, 0), "h", True)
End Sub

  • index:后面的两个数字分别是行列的索引,数字为0代表取整行或者整列
Sub test()Dim rgrg = Range("a1:d4")arr = Application.Index(rg, 0, 1)
End Sub
  • vlookup:倒数第一个参数true或false代表精确或模糊匹配,第二个参数代表查找匹配项的列数
Sub test()Dim arr, arr1arr = Range("a1:d6")arr1 = Application.VLookup(Array("h", "h123"), arr, 1, 1) Stop
End Sub
  • sumif 和 countif

四、数组排序

1、冒泡

2、选择

3、插入

4、希尔

关于排序的详解介绍参考博文:十大经典排序算法


字典

一、字典的基本概念

  • vba中的字典的概念和 python 中的字典的概念是一致的,就是用来存储键值对的集合
  • 取出所有的键可以使用 keys ,取出所有的项可以使用 items
  • 键值不允许重复,item 可以
  • 字典的特点就是可以实现快速查找
  • 局限在于只能包含两列

二、创建字典

1、直接创建

Sub test()Dim dictSet dict = CreateObject("scripting.dictionary")dict("a") = 12MsgBox dict("a")
End Sub

2、引入相应的支持库

  • 下面的代码需要引入支持库才可以使用
Sub test()Dim dict As New Dictionarydict("h") = "hello"Debug.Print dict("h")
End Sub


三、字典操作

1、装入数据

  • 这样装入数据如果键值重复的话会发生错误
dict.add cells(1,1).value ,cells(1,2).value

2、读取数据

Sub test()Dim dict As New Dictionarydict.Add "h", "hello"dict.Add "h1", "123"Range("a1").Resize(dict.Count) = Application.Transpose(dict.Keys)Range("b1").Resize(dict.Count) = Application.Transpose(dict.Items)
End Sub

3、修改数据

  • 这样的赋值就能修改数据了,如果不存在的话就是新增一个
dict("h") = 1234
dict("h") = "hello"

4、删除数据

Sub test()Dim dict As New Dictionarydict.Add "h", "hello"dict.Add "h1", "123"dict.Remove ("h")MsgBox dict.Exists("h")dict.RemoveAllMsgBox dict.Count
End Sub
  • 区分大小:binaryCompare设置的话区分大小写,TextCompare不区分大小写
Sub test()Dim dict As New Dictionarydict.CompareMode = TextComparedict.Add "h", "hello"dict.Add "H", "123"
End Sub

四、数组字典联合使用之下棋法

  • 核心就是确定数据的行数和列数,基本的应用就是对重复项进行汇总
Sub test()Dim hang As Integer, maxrow As IntegerDim arr, arr2Dim arr3 As New Dictionarymaxrow = Range("a65536").End(xlUp).Rowarr = Range("a1:b" & maxrow)For i = 1 To UBound(arr)If arr3.Exists(arr(i, 1)) ThenRange("e" & arr3(arr(i, 1))) = Range("e" & arr3(arr(i, 1))) + arr(i, 2)Elsehang = hang + 1arr3(arr(i, 1)) = hangRange("d" & hang) = arr(i, 1)Range("e" & hang) = arr(i, 2)End IfNext i
End Sub

Excel VBA(04)数组和字典相关推荐

  1. 学习Excel VBA(一)——VBA理论初步

    学习Excel VBA(一)--VBA理论初步 一.Excel VBA的数据类型 1.基本数据类型 2.枚举类型(类似于C语言的enum) 3.自定义类型(类似于C语言的typedef struct) ...

  2. Excel VBA 字典/数组 示例

    A 将数组作为字典的ValuePrivate Sub CommandButton3_Click() Dim arr, arr1, i&, d As Object arr = Sheets(3) ...

  3. vba数组如何精确筛选_利用数组和字典,实现按指定规则的排序

    大家好,今日我们继续讲解数组与字典解决方案,今日讲解第47讲:利用字典和数组,实现按指定规则的排序.随着字典讲解的深入,我们发现字典真的很神奇,在VBA代码中,给人以十分清爽的感觉,在这套数组与字典解 ...

  4. vba数组如何精确筛选_VBA数组与字典解决方案第10讲:数组及数组公式的制约性和集合性二...

    今日继续讲解VBA数组与字典解决方案,的内容是第10讲,今日继续给大家讲解数组及数组公式结果的制约性和集合性,上节讲到截图的结果返回的是3,而不是0!这是为什么呢?我们仍然看下面的截图: 再次回顾E5 ...

  5. vba ado效率低吗_VBA数组与字典,数据单条件匹配之方法

    浮躁的心静下来,静定"空"心,去感悟真实的时间,静下心,常存感恩之心,做善事,一生无愧.怀平常心,做平常事,日夜安宁.人之欲望不止,一山还比一山高,岂能如愿?看淡纷争,看轻得失,心 ...

  6. vba 数组赋值_VBA数组与字典解决方案第18讲:VBA中静态数组的定义及创建

    大家好,我们今日继续讲解VBA数组与字典解决方案,今日讲解第18讲:VBA数组如何定义,又该如何创建呢? 从这一讲开始,我们开始进入VBA数组阶段,VBA数组和工作表数组有着不同的意义,在很大程度上, ...

  7. 建立数组并写入数据_VBA数组与字典解决方案第37讲:在VBA中字典的应用

    大家好,我们今日继续讲解VBA数组与字典解决方案第37讲内容:在VBA中字典的应用.对于字典,也许许多的朋友对此比较陌生,在有的语言里字典也称之为MAP,应用也是比较广泛的. 字典,其实就是一些&qu ...

  8. excel vba真正的动态数组实例-按需定义数组大小

    excel vba真正的动态数组实例 一.动态数组的定义 动态数组的定义,一开始不需要给数组标明上界和下界.直接定义即可,如下面的代码: Dim MyStr() As String 这样,就定义了一个 ...

  9. vba 数组赋值_VBA数组与字典解决方案第31讲:VBA数组声明及赋值后的回填方法

    大家好,我们今日继续VBA数组与字典解决方案,今日讲解VBA数组的声明,一些朋友会问了:数组都讲了这么长时间了,怎么才讲声明啊?是的,有些知识不到一定的程度即使讲了,大家也不能深入的理解,只有到了一定 ...

  10. 【Excel VBA和Python对照学习】创建字典

    Excel VBA和Python双语对照学习 我们从小学习语文,都用过字典.查字典时可以从第一页开始,一页一页地往下找,直到找到为止.这样做明显效率低下,特别是字的位置比较靠后的时候.所以查字典时不这 ...

最新文章

  1. android图片选择器框架支持长图,基于RxJava的Android图片选择器. – RxPicker
  2. 线性回归原理和实现基本认识(转载)
  3. [蓝桥杯][2014年第五届真题]分糖果-模拟
  4. y空间兑换代码_Python爬虫实战:QQ空间全自动点赞工具
  5. 惰性求值——lodash源码解读
  6. 机器学习笔记(六) ---- 支持向量机(SVM)
  7. 12c闪回 oracle_Oracle 12c R2新特性: PDB级闪回(Flashback PDB)
  8. IOS MenuController的部分操作
  9. Julia : Jupyter notebook 中试玩Julia
  10. 主表和附表的关联关系,普通字段就可以实现为什么还要有主键外键?之间有什么关系
  11. 路由器与交换机的区别?
  12. “工欲善其事,必先利其器”-- 教你几招如何选择合适的数据可视化工具
  13. 【C++从青铜到王者】第十八篇:C++之多态
  14. 【航天】【火箭】长征九号
  15. 如何在VC中调用第三方lib库(step by step)
  16. R报错|Package ‘MASS’ version 7.3.55 cannot be unloaded
  17. Dusk Network DayBreak测试网初体验
  18. 【leetcode】青蛙跳楼梯问题
  19. oracle入门常用
  20. 前景理论的直觉模糊多属性决策及matlab

热门文章

  1. 【可达性分析中的增量更新和原始快照】
  2. 修改滚动条样式的方法
  3. 一个有用的命令jcmd
  4. Linux系统内部流量转发机制,使用TC实现基于Linux系统的流量管理
  5. jquery vue 替代_vue能代替jquery吗
  6. 【MATLAB】理解采样频率和信号频率的关系
  7. IOS安卓友盟消息推送详细配置以及证书更新
  8. Kyligence 春季论坛成功举办,助力企业构建数字化管理新体系
  9. vi 从第几行到第几行 替换_vi命令加行号查找替换等命令
  10. 形状类似小于等于号的符号是啥