Excel VBA入门(二)数组和字典
数组和字典也是VBA的常用到数据类型之一。但是我翻了有四五本VBA教程相关的书,里面都没有介绍到字典,数组到是在介绍数据类型时有介绍,而并没有提到字典。
事实上,字典不是VBA内置的类型,它是Windows脚本语言的。但其实字典在VBA中也是非常重要的,它非常适用于需要进行非重复性数据的操作。我多次需要使用到字典,但很少用到数组。
1. 数组
如果有学过其它编程语言,应该对数组不陌生。其实数组就是多个变量的集合,而且它是有顺序的,通过索引来访问一个数组中的各个值。
但应该记住的是:数组中的各个数据,它们的类型必须是相同的。
数组也应当要先声明,后使用。VBA中的数组有动态数组和静态数组之分。
1.1 静态数组
所谓静态数组,即它的长度是固定不可变的。
声明语法如下:
Dim 数组名(a to b) As 数据类型
其中a和b均为数字,表示数据的索引起始值。也可以只写一个数字,则此时数组使用默认索引,从1开始,数字表示它的长度。
例如:
Dim MyArray1(10) As String
Dim MyArray2(10 to 20) As String
1.2 动态数组
如果在定义时并不知道需要使用的数组的长度是多少,则可以定义它为动态数组:
Dim Myarr3() As String
可以看到,定义动态数组,只需要在括号里面留空就行了。
待确定了数组的长度之后,可以使用ReDim
来重新定义数组
1.3 数组的赋值与取值
虽然都是通过索引来对数组进行赋值,但与其它主流的编程语言不同的是,VBA中不是使用中括号[]
而是使用小括号()
进行的。
Dim arr(5) As String
For i = 1 to 5
'赋值
arr(i) = i
Next
'取值
Debug.Print arr(1)
此外,也可以直接把Excel单元格中的数据赋值给数组。如上面定义的长度为5的一维数组,可以以以下方式把单元格中A1到A5的数据分别载入到数组arr中:
arr = Range("A1:A5")
1.4 多维数组
VBA中也支持多维数组。
如,定义一个四行五列的二维数组如下:
Dim Myarr(4, 5) as String
或者:
Dim Myarr(1 to 4, 5 to 8) As String
定义一个三维数组:
Dim Myarr(3, 4, 5) As String
或者:
Dim Myarr(1 to 3, 4 to 6, 7 to 9) As String
1.5 其它
网上有说到很多对数组的操作,例如求数组的上下界,对数组求和等,我觉得这些都不算是数组的特有操作,因为它对其它数据类型也是可以使用的,所以就不打算再介绍了。有需要用到的,可以再查询
2 字典
字典其实就是一些“键-值”对。在很多场合,它都能起到很大的作用,使用起来非常方便,有类似于微型数据库的作用,可用于临时保存一些数据信息。
2.1 创建字典
VBA中创建字典有两种方法
2.1.1. 引用声明
在VBE菜单中,选择“工具-引用”,在弹出的对话框中选择中边的“浏览”,此时会打开Windows系统的驱动目录(C:\Windows\System32),然后找到scrrun.dll,确定确定返回就行了。
添加引用后,就可以像定义其它变量一样声明使用字典了。
Dim d As New Dictionary
2.1.2. 直接创建
我目前基本上都使用的这种方法。可如下定义:
Dim d As Object
Set d = CreateObject("Scripting.Dictionary")
2.2 字典的方法
字典有6个方法,分别是Add、Exists、Keys、Items、Remove、RemoveAll。使用方法如下:
2.2.1 Add
用于添加内容到字典中。
d.Add key, item
第一个参数为键,第二个参数为键对应的值
2.2.2 Exists
用于判断指定的关键词是否存在于字典(的键)中。
d.Exists(key)
如果存在,返回True,否则返回False。通常会在向字典中添加条目的时候使用,即先判断字典中是否已存在这个记录,如果不存在则新增,否则进行其它的操作。
2.2.3 Keys
获取字典所有的键,返回类型是数组。
d.Keys()
2.2.4 Items
获取字典所有的值,返回类型是数组。
d.Items()
2.2.5 Remove
从字典中移除一个条目,是通过键来指定的。
d.Remove(key)
如果指定的键不存在,会发生错误。
2.2.6 RemoveAll
清空字典。
2.3 字典的属性
字典有4个属性:Count、Key、Item、ConpareMode
2.3.1 Count
用于统计字典中键-值对的数量。也可以简单理解为统计字典中键的个数。
d.Count
2.3.2 Key
用于更改字典中已有的键。如:
d.Key("apple") = "Orange"
如果指定的键不存在,则会产生错误。
2.3.3 Item
用于写入或读取字典中指定键的值,如果指定的键不存在,则会新增。如:
'读取
Debug.Print d.Item("apple")
'写入
d.Item("apple") = 10
2.3.4 CompareMode
CompareMode用于设置或者读取字典对象中比较字符串时的比较模式。
这个到目前为止我还没有用过。所以不讨论了。
本系列教程其它文章
Excel VBA 入门(零)
Excel VBA 入门(一)数据类型
Excel VBA 入门(二)数组和字典
Excel VBA 入门(三) 流程控制1-条件选择
Excel VBA 入门(四)流程控制2-循环控制
Excel VBA 入门(五)Excel对象操作
Excel VBA 入门(六)过程和函数
Excel VBA 入门(七)注释、宏按钮及错误处理
Excel VBA 入门(八)单元格边框
Excel VBA 入门(九)操作工作薄
Excel VBA 入门(十)用户窗体开发
Excel VBA入门(二)数组和字典的更多相关文章
- Swift语法基础入门二(数组, 字典, 字符串)
Swift语法基础入门二(数组, 字典, 字符串) 数组(有序数据的集) *格式 : [] / Int / Array() let 不可变数组 var 可变数组 注意: 不需要改变集合的时候创建不可变 ...
- Excel VBA入门(九)操作工作薄
虽然我前面讲过,在VBA中操作工作薄并不是件明智的事,但有些时候,还是避免不了要这么做.绝大多数情况下,我们要做的是获取到某个工作薄对象,并以此来获得其中的工作表对象,然后再对工作表中的数据进行处理. ...
- Excel VBA入门(八)单元格边框
本文基于以下文件 http://pan.baidu.com/s/1nvJtsu9 (部分)内容预览: 1. 边框样式 Sub cell_format() Dim sht As Worksheet Di ...
- Excel VBA入门(七)注释、宏按钮及错误处理
系统性的知识前面已经讲完,从本章开始,本系列教程涉及的将会是一些相对凌散的内容. 1. 注释 代码注释是一件利人利己的事,为了方便自己在代码需要更新修改时,依然能够快速地看懂自己完的每一行代码到底是什 ...
- Excel VBA入门(六)过程和函数
前面讲过,VBA代码有两种组织形式,一种就是过程(前面的示例中都在使用),另一种就是函数.其实过程和函数有很多相同之处,除了使用的关键字不同之外,还有不同的是: 函数有返回值,过程没有 函数可以在Ex ...
- Excel VBA入门(五)Excel对象操作
本章是本系列教程的重点.但我觉得应该不是难点.从第零章开始到学完本章,应该可以把VBA用于实战中了. Excel对象主要有4个: 工作薄 Workbook 工作表 Worksheet 单元格区域 Ra ...
- Excel VBA入门(四)流程控制2-循环控制
所谓循环控制,即在循环执行一段代码,用于完成一些重复性任务. VBA中的循环控制语句主要有3种:for.while.loop.对于大多数人来说,for的使用频率最高,而我个人也觉得for是最为灵活的, ...
- Excel VBA入门(三) 流程控制1-条件选择
VBA中的流程控制分为两种,其一是条件结构式的,即根据条件判断的结果去选择性执行相应的语句(块):另一种是循环,即循环地执行语句(块).本节介绍第一种. 1. IF if 语句其实包含有几种形式: ① ...
- Excel VBA入门(一)数据类型
与其它的编程语言一样,VBA也有它自己的数据类型.讲到数据类型,就离不开"变量"与"常量"这两个概念,变量与常量,都是用于保存数据的.顾名思义,"变量 ...
随机推荐
- iOS7 自己定义动画跳转
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/Liar0606/article/details/26399125 简单介绍 在iOS7系统中,假设你 ...
- 去掉UIWebView上下滚动出边界时的黑色阴影
for (UIView *viewin [_webViewsubviews]){ if ([viewisKindOfClass:[UIScrollView class]]){ for (UIView ...
- ubuntu 12.04 下 Vim 插件 YouCompleteMe 的安装
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4137402.html 1.需要保证vim的版本大于7.3.584,否则的话需要更新vim 可 ...
- "废物利用"也抄袭——废旧喷墨打印机和光驱DIY"绘图仪"
很长时间没有写博客,因为各种各样的事情占去大块时间,只有零碎时间偶尔在CSDN逛逛也偶尔回几个帖子.很久以前就看到一些光驱DIY雕刻机之类的,很是向往,最近这几天得闲就TB了一套Arduino UNO ...
- GOF23设计模式之享元模式(flyweight)
一.享元模式概述 内存属于稀缺资源,不要随便浪费.如果有很多个完全相同或相似的对象,可以通过享元模式,节省内存. 享元模式核心: (1)享元模式可以共享的.方式高效的支持大量细粒度对象的重用: (2) ...
- C# 中的委托和事件(2)
委托.事件与Observer设计模式范例说明 上面的例子已不足以再进行下面的讲解了,我们来看一个新的范例,因为之前已经介绍了很多的内容,所以本节的进度会稍微快一些: 假设我们有个高档的热水器,我们给它 ...
- IT诗词
年少太轻狂,误入IT行.白发森森立,两眼直茫茫.语言数十种,无一称擅长.三十而立时,无房单身郎. 年少不经事,埋头编程忙. 指键铿锵落,不及细思量. bug千百个,comment无一行. 休言敏捷易, ...
- 数据结构与算法JavaScript描述——栈的使用
有一些问题特别适合用栈来解决.本节就介绍几个这样的例子. 1) 数制间的相互转换 可以利用栈将一个数字从一种数制转换成另一种数制.假设想将数字n 转换为以b 为基数的数字,实现转换的算法如下. 使 ...
- 简单的SOCKET例子
定义实例socket.socket(),如果括号里不写参数,默认为IPV4+TCP 我们猜测客户端的完整代码如下: 同样我们猜测服务端的代码如下: 实际上运行客户端代码: 说明在py3里,网络编程发送 ...
- java 堆、栈、常量池等
寄存器:我们在程序中无法控制 栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中 堆:存放用new产生的数据 静态域:存放在对象中用static定义的静态成员 常量池:存放常量 ...