VBA是一种编程语言,它依托于Office软件,不能独立运行,通过VBA可以实现各种Office软件操作的自动化。
通俗易懂的来说就是在Excel中想实现什么功能,就可以通过VBA语言编写的程序区实现。
VBA编码语法
VBA的代码的开始和结束
Sub 代码名称()
代码内容
...
End Sub
数据类型
①字符串 String
②数字类型:整型 Integer、长整型 Long、单精度浮点型 Single(小数点后最多6位)、双精度浮点型 Double(小数点后最多14位)。
③日期型 Date
④布尔型 Boolean:True\False.
⑤变体型 Variant(不知道是什么类型,可定义为variant,但这种操作应当尽量避免)
变量
用于保存在程序运行过程中需要临时保存的值或对象。
定义变量:Dim 变量名 (As 数据类型)
Dim i as Integer
i=6
方法1:dim 变量名 as 数据类型
方法2:dim 变量名 as 数据类型,变量名 as 数据类型
方法3:dim 变量名,变量名 as 数据类型 ()
方法4:dim 变量名+数据类型符
Sub 变量测试()
Dim i As Integer
Dim i1 As Integer, str As String
Dim i2, i3 As Integer
Dim i4%
End Sub
变量名的命名规则
由字母、数字、下划线以及汉字构成
只能以字母或汉字开头,不可以是数字或者下划线开头
长度不可以超过255个字符
不可以使用VBA中的关键字
见名知意
变量名的后面可以添加一个符号,表示该变量盛装的数据的类型,常用符号:%、&、#、$、!
尽量不要使用中文命名
不要使用特殊符号,可以用英文字母、中文、数字、下划线,不能以数字开头
不能使用系统保留字,比如sub、for
大小写不敏感
注意
变量名字不要重复
VBA中变量可以不声明就使用,但是不建议,如果不声明就使用,那么该变量里面可以盛装任意类型的数据
字符串
几个常用的字符串函数:
Len(): 求长度
Trim(): 去掉两端空格
Replace(): 替代子串
Left(): 从左边取若干字符
Right(): 从右边取若干字符
Mid(): 从中间取若干字符
Instr(): 查找子串
LCase(), UCase(): 将字母变成小/大写
进行操作前可叠加使用Trim()和LCase()清除数据中的空格和因大小写不一致出现的问题。
for循环:
for i=1 to 10 step 2
cells(i,2)=7
next i
①循环
For … next
Do While … Loop
For Each in … Next
②判断
If ... Then ... (Else if ... Else ...) End if
Not, And, Or(优先级从左往右)
if分支结构:
if a>90 then
cells(1,1)=""
elseif a>70 then
cells(1,1)=""
elseif a>60 then
cells(1,1)=""
else
cells(1,1)=""
end if
BVA调试:
设置断点,让程序暂停
单步调试,每次只执行一次(F8)
添加监视,随时查看变量值
字符串:
设置双引号,否则会被认为是变量
特殊字符:空格 回车 换行,空串和空格字符串不一样
大写小写不一样,文本数字要分开,1是数字1,“1”是字符串
逻辑运算符 not and or (优先级从高到低)
while循环:
whlie cells(i,1)<>""
cells(i,2)=5
i=i+1
wend
do whlie cells(i,1)<>""
cells(I,2)=5
i=i+1
loop
面向对象
面向对象的概念:对象(系统中具体的事物)、类(对象的分类)、属性(是什么样子)、方法(能做什么)
常用的对象:
application(excel系统)
workbook工作簿
worksheet工作表
range单元格内容区域
为代表对象的变量赋值,必须使用set关键字
用worksheets引用工作表的两种方法:
根据工作表的显示方法,比如worksheets(5)
根据工作表的名称,比如worksheets("数据明细")
worksheet对象的name属性:
根worksheet.name代表了该工作表的名称,可以用它取得或者修改工作表名称
worksheets的count属性:代表了所属工作簿中一共有多少工作表
worksheets的add方法:在所属工作簿中新建一个工作表
举个例子:循环打开多个工作簿
估计好多人听说VBA是从合并工作簿知道的,合并工作簿是有通用的代码框架的,记住框架,再也不怕对工作簿进行其他操作。
Sub 循环打开工作簿()
Application.ScreenUpdating = False
myfile = Dir(ThisWorkbook.Path & "\*.xls*")
Do While myfile <> ""
If myfile <> ThisWorkbook.Name Then
Set wb = Workbooks.Open(ThisWorkbook.Path & "\" & myfile
我是需要填空的代码
Else
End If
myfile = Dir
Loop
Application.ScreenUpdating = True
MsgBox "完成"
End Sub
如果你要提取特定内容的单元格,只需要结合find方法,查找内容是“你好”的单元格的行号,并赋值。在空白处填上如下代码即可。
ThisWorkbook.Worksheets(1).Cells(a, 1)
= wb.worksheets(1).Cells.Find("你好", , xlValues, xlWhole, xlByColumns, xlNext, True, True).row
如果你要合并工作簿,那么只需要在填空的代码里,对单元格区域应用copy方法。在空白处填上如下代码即可。
wb.worksheets(1).range("a1").usedrange.copyThisWorkbook.Worksheets(1).range("a1")
Option Explicit
Sub 季度汇总()
Dim i, j, k, name
Dim w As Worksheet, r As Worksheet
Set r = Worksheets("季度汇总")
'循环扫描汇总表中的每一行,记住每次要查找的姓名
For i = 3 To 10
name = r.Cells(i, 2)
'循环扫描所有工作表,并用 w 指向该工作表
For Each w In Worksheets
'如果该工作表名字以“月”结尾,则认为是月报表
If Right(w.name, 1) = "月" Then
'循环扫描该月报表的每一行,判断其姓名列是否等于name
k = 3
Do While w.Cells(k, 2) <> ""
'如果第k行姓名等于name,则将该行累加到汇总表第i行
If LCase(Trim(w.Cells(k, 2))) = LCase(Trim(name)) Then
For j = 3 To 6
r.Cells(i, j) = r.Cells(i, j) + w.Cells(k, j)
Next j
End If
k = k + 1
Loop
End If
Next w
Next i
End Sub
网友评论