VBA学习笔记001_VBA语言概述
VBA基础
参考文档:https://zhuanlan.zhihu.com/p/27382819
打开VBE编辑器:在Excel中按Alt+F11
保存文件:有了宏,保存时就要选择“启用宏的工作簿”(Excel Macro-Enabled Workbook)
把文件所在路径设为信任(以免每次都提醒):Excel Options -> Trust Center -> Trust Center Settings:把文件所在路径设置于此
取消保存时的隐私告警:Excel开始->Excel选项->信任中心->信任中心设置...->个人信息选项——取消勾选"保存时从文件属性中删除个人信息"
Excel是一个应用程序(Application)
一个Excel文件称为工作薄(Workbook)
工作薄中的每张表都称为工作表(Worksheet)
工作表中的格子称为单元格(Cell),多个格子叫单元格区域(Range)
VBA语言基础
参考文档:https://zhuanlan.zhihu.com/p/27550524
变量定义方法:
Dim 变量名 As 数据类型
数据类型包括:
字符串String
数字:整数Integer、长整型Long、单精度Single、双精度Double
日期Date
布尔值Boolean:True/False
变体型Variant:不确定类型
对象型Object
枚举型Enum
连接字符串,用&
vbCr是一个字符串常量,表示回车
数组和字典
参考文档:https://zhuanlan.zhihu.com/p/27772253
数组是多个同类型变量的有序集合
Dim 数组名(num As 数据类型
默认情况下索引从0开始,则上述数组可以保存num+1个元素;
如果调整设置(Option Base 1),则数组索引从1开始,只能保存num个元素
如果不确定Base的设置,可以用LBound(数组名)、UBound(数组名),示例如下
Dim arr(10) As Integer
Dim i As Integer
For i = LBound(arr) To UBound(arr)
arr(i)=i
Next i
另一种避开Base选项造成影响的方法是,定义时直接给出数组的上下界
Dim arr(1 To 5) As Integer
VBE中可以调用Excel函数,如WorksheetFunction.Count(arr)或者WorksheetFunction.Sum(arr)
采用先定义后使用方式时,要注意数组名本身其实是Variant类型,定义时As 某种类型,其实是定义其元素的类型:
Dim arr(5) as String
arr = Array("a", "b", "c", "d", "e")
Debug.Print arr(3)
===>编译报错
Dim arr(5) as Variant
arr = Array("a", "b", "c", "d", "e")
Debug.Print arr(3)
===>编译报错
Dim arr as Variant
arr = Array("a", "b", "c", "d", "e")
Debug.Print arr(3)
===>编译通过,输出正确
查看文档,可以发现Array()函数的返回值是Variant,所以只有第三次,把arr定义为Variant时,才能正常赋值。
而且得到返回值的arr也被认定为数组,因为arr(3)可以正确输出。
个人猜测,在VB中Array本身不是一种单独的类型,在底层是通过Variant的某些设置实现的。也即数组可以被认为是一种有特殊设置的Variant。在定义时,数组名就是一个普通的Variant型变量。
(第二次尝试的错误在于Dim arr(5) as Variant,不是给arr定义为Variant,而是给arr中每个元素都定义为Variant,这样arr似乎就不是一个单纯的Variant了,而是一个有设置的variant了,故在后面通过返回值赋值时就会报错了)
关于字典
创建字典的方法:
Dim d As Object
Set d = CreateObject("Scripting.Dictionary")
字典的6个方法:Add、Exists、Keys、Items、Remove、RemoveAll
d.Add key, item
d.Exists(key)
d.Keys() '以数组返回所有键
d.Items() '以数组返回所有值
d.Remove(key)
d.RemoveAll() '清空字典
字典的4个属性:Count、Key、Item、CompareMode
d.Count '统计键值对的数量
d.Key("apple") = "Orange" `更改字典中已有的键
'读取某个值,apple为Key!
Debug.Print d.Item("apple")
'写入某个值
d.Item("apple") = 10
For Each Item In rng '高版本中Item不需要单独定义变量,Excel2007中需要定义为Variant
Debug.Print Item
Next
Set rng2 = wksT1.Range("E9:E11,H8:H10") '多个不连续的区域,可以用逗号隔开
'Cell本身就作为一个独立的操作单元,输出其值,或对其赋值(如果真要用Dim来定义的话,类型应该是Object)
'Cells(r,c),注意有s,括号内为(行,列)
wksT1.Cells(7, 1).Value = "IV"
过程和函数
过程没有返回值,函数有;
函数可以在Excel表格中被调用,过程不可以。
过程可以被指定给某个对象(按钮或图片),函数不可以
过程可以独立地直接执行,函数只能被调用——调用过程时要用“Call 过程名”
1 通过变量或数组保存信息
2 判断语句
3 循环
4 基本错误处置
Excel VBA中用单引号表示注释,单引号后面的部分不会被视为程序
以REM 开头的一行,也被视为注释
基本输入输出
MsgBox可以用来显示一个信息
MsgBox "确保打印机正确连接" '注意VBA中不使用返回值时,不用括号包围参数,函数名后直接空格接后续参数即可
Debug.Print "xxx" '在VBE立即窗口(如果没有显示,在“视图”中打开该窗口)中输出结果