零. excel 2016 开启VBA
“Excel选项”对话框,
单击“自定义功能区”选项, 在右侧的面板的列表框中勾选“开发工具”复选框,最后单击“确定”按钮
一、VBA基础
注:快捷键 ctrl+空格:变量名称补全 , Ctrl+J
0. 注释
'
注释代码
调试输出:
' 注释
Debug.Print "Hello, World!"`
msgbox("hello")`
1. 变量声明
Dim xx as type
const xx as type = value
Dim i as Integer
i = 3
' 变量类型有
' String Integer Long Single Double
' Date Boolean Variant Object
1.1 字符串连接使用 &
,不要使用 +
1.2 数组
dim myarr(5) as integer '等价于dim myarr(0 to 5) as integer 直接声明一个固定长度为 6 的数组
dim myarr(5 to 10) as integer '声明一个下标由5到10的数组
dim dyn_array() as integer '声明一个动态数组
redim dyn_array()(array_size) '重新定义数组的大小
redim preserve dyn_array(array_size) '保留数组的数值
arr = Range("A1:A5")
循环
for each city in cities
msgbox city
next
For i = 0 to 5
'赋值
myarr(i) = i
Next
For i = 0 to 5
Debug.Print myarr(i)
Next
相关函数
set myArr=Array("Ford","Black","1999")
IsArray(myArr) 判断某个变量是否是数组
Erase(myArr)清除数组中的数据
LBound、UBound(myArr) 返回下界和上界数字
2. 逻辑比较
= <> > < >= <=
AND OR NOT
3. if语句:
if ... then
...
elseif
...
else
...
end if
4. for 语句
注:没有break和continue,建议使用while语句,修改变量值来达到跳出循环的目的
for counter=start to end [step step]
... exit for
next [counter]
或
for each element in group
... exit for
next [element]
5. while 语句
do while|until condition
...
loop
或
do
...
loop while|until condition
二、工作簿相关
1. range属性:
range("a5").select '选择单个单元格
range("A1:A10").select '选择一个单元格区域
range("A1,B6,C8").select '选择一些不相邻的单元格
range("A1:A10,C12,D3").select '选择不相邻的单元格和单元格区域
遍历range
for each tmpRange in someRange
...
next for
2. cells属性
cells(5,1).select 或cells(5,A).select
range(Cells(6,1),cells(10,1)).select
cells.select '选择所有单元格
3. offset属性
Range("A1").offset(1,3).select '选择A1的下面一行和右边3列的单元格
range("D15").offset(-2,-1).select
selection.offset(-2,-1).select
selection.resize(2,4).select
4. 选择单元格的其它方法
activeCell.end(xlToRight).select
activeCell.end(xlDown).select 'xlToLeft,xlUp
5. 选择整行和整列
selection.entirerow.select
selection.entirecolumn.select
6. 设置单元格内容
activesheet.range("A1:C4").value="=4*25"
activesheet.range("A1:C4").formula="=4*25"
7. 操作工作簿和工作表
WorkBooks.add '打开一个新的工作簿
workbooks.open filename:=xxx (必须是全路径!可以使用thisworkbooks.path &"\...")
workbooks(1).name
workbooks(2).activate
workbooks("chap02.xls").activate
workbooks(1).close
worksheets.add
worksheet.select
worksheet.activate
8. 打开和关闭系统警告提示
Application.DisplayAlerts = False
Application.DisplayAlerts = True
Application.ScreenUpdating=false
'然后结束时改回来 用于提升性能
Application.ScreenUpdating=True
使用
_+一个空格
,可以打断很长的代码行。
9. 必须注意设置对象的值要使用set,例如workbook等
10. 换行符 Chr(10)
11. 提高效率:
(1) 尽量使用VBA原生的属性、方法和worksheet函数:例子,如果要求
A1:A1000
的平均值,使用Application.WorksheetFunction.Average(Range("A1:A1000"))
,比自己写一个循环统计sum值再求平均值要好。(2)尽量减少使用对象引用,尤其在循环中,使用with语句要好一些,或者使用对象变量(注意使用set设置变量值)。
(3) 减少对象的激活和选择,例如
sheets("sheet3").select; range("A1").value=100... ;
可以改为
with sheets("Sheet3"); .Range("A1").value=100...
- (4) 关闭屏幕更新 Application.ScreenUpdating=false/true