01-01、Excel VBA简介1.VBA是什么,能⼲什么
VBA可以说是⼀种编程语⾔,是VB的分⽀VBA的作⽤,可以将重复的Excel⼯作简单化2.VBA具备的基础知识
2.1基础操作,能发现Excel软件的局限性2.2有⼀定的函数功底
2.3会VB语⾔(会VB语⾔更好,不⼀定⼀定需要)3.保存
Excel启⽤宏⼯作簿,可以防⽌代码丢失
01-02、宏在⼯作中的运⽤1.宏的定义
宏:macro 形容词:巨⼤的,⼤量的,宏观的 名词:【电脑】巨(宏)指令 定义:椅⼦可以⾃动执⾏的代码(VBA)录制宏相当于摄像机的功能2.录制宏
在开发⼯具中的录制宏中进⾏宏的录制重复执⾏相同的操作。可以考虑⽤宏总结:
优点:重复执⾏相同操作,提⾼⼯作效率确定:不够智能化,⽆法交互⼯作,代码冗余解决⽅法:VBA 即是⽤写代码的⽅法代替录制宏3.宏在Excel中的地位
虽然宏看起来不够灵活,但对于学习VBA编程是⾮常重要的。3.1提⾼代码编写效率3.2帮助学习VBA知识
01-03、VBA基础知识1.VBA概念
Visual Basic for Applications(VBA)是⼀种Visual Basic的⼀种宏语⾔,主要能⽤来扩展Windows的应⽤程式功能VBA是寄⽣于VB应⽤程序的版本,必须依赖于⽗程序,如EXCEL,CAD,CORELDRAW2.VBA和VB的区别
2.1. VB是编写应⽤程序,⽽VBA是使已有的应⽤程序(EXCEL、CAD)⾃动化
2.2.VB具有⾃⼰的开发环境,⽽VBA必须寄⽣于已有的应⽤程序.
2.3.运⾏VB开发的应⽤程序,不必安装VB,⽽VBA开发的程序必须依赖于它的⽗应⽤程序3.VBA的⽤途
3.1.规范⽤户的操作,控制⽤户的操作⾏为3.2.操作界⾯⼈性化,⽅便⽤户操作
3.3.多步骤,重复步骤可以通过执⾏VBA代码来迅速实现3.4.实现⼀些⽆法实现的功能4.VBA功能展⽰
01-04、Excel VAB窗⼝介绍1.VBE就是VBA的编辑窗⼝1.1按住ALT+F11快捷键1.2开发⼯具-Visual Basic2.VBE窗⼝简介
2.1⽴即窗⼝:即使可以看到结果
2.2本地窗⼝:按F8键可以看到程序运⾏的步骤和每⼀步的结果3.过程(⼦过程和函数过程)3.1⼀般过程Sub aaa()End Sub
3.2⾃定义函数过程Function ff()End Functiom4.第⼀个VBA程序Sub 我的第⼀个程序()MsgBox \"我会VBA啦!\"End Sub
5.运⾏宏的⽅法,直接运⾏和图像运⾏
图像运⾏:在Excel菜单中点插⼊--图形--画⼀个图形--点击图形右键--指定宏--确定即可
01-05、Excel VBA代码编写规则1.VBE常见的设置
1.1⼯具--选项 ⾥⾯可以修改编写代码时的字体颜⾊和字号等1.2注释 不会参与运⾏,开发⾃⼰看的,需要在代码前加单引号(’)
统⼀加上解除注释块:选上⼯具栏的⼯具--右键--调出编辑窗⼝,上⾯有⼀个解除注释块和⼀个设置注释块。1.3代码的运⾏
上⾯的符号分别代表运⾏,暂停和终⽌运⾏的命令
F8可以⼀步⼀步的运⾏代码,可以检查代码的问题所在1.4代码的帮助
将代码选中(抹⿊),按F1即可以出来代码的使⽤⽅法2.代码的编写规则2.1⼦过程2.2函数过程
3.代码的换⾏(下划线+空格+换⾏)
01-06对象
1对象:现实中的对象,是真实存在的物体
在Excel中的对象指:⼯作薄、⼯作表、单元格、图表、透视表之类的
2.集合:也是⼀种特殊的对象,不过没有指定的哪个对象,知识⼀种统称,如“⼈”就是⼀个集合的叫法,在Excel中的集合如:workbooks,worksheets,cells等等3.常⽤的代码操作对象3.1⼯作薄(Workbooks)workbooks(N)第N个⼯作薄workbooks(“⼯作薄名”)ActiveWorkbooks活动⼯作薄ThisWorkbook代码所在的⼯作薄3.2⼯作表(Worksheets)Sheets(N) 第N个⼯作表Sheets(\"⼯作表名\")SheetN 第N个⼯作表ActiveSheet 活动⼯作表
worksheets 与 Sheets的区别3.3单元格(cells)
Range (\"单元格地址\")Cells(⾏号,列号)[A1]单元格简写
Activecell 活动单元格
Selection 当前被选取的区域
01-07、属性
VBA属性:指对象所具有的特征
⼈的属性:姓名,年龄,⾝份证号,住址等例:sub 属性()
Debug.Print sheet1.Name '.name即为⼯作表sheet1的属性
Debug.Print Sheet1.Range(\"a1\").Value '.value即为⼯作表sheet1的属性End Sub
例:Sub 属性赋值()
Sheet2.Name = \"改变⾃⼰\"
Sheet2.Range(\"a1\") = \"学习VBA\"End Sub
01-08、⽅法
⽅法:实际上是对对象的⼀种操作,他是⼀种动作,⼀种⾏为
例:
Sub 选择⽅法()
Range(\"a1:a10\").Select ‘选择了a1:a10单元格,没有指定⼯作表就默认为当前活动⼯作表’End Sub
Sub 复制⽅法()
Sheet1.Range(\"a1:a10\") = 1 '将1写⼊表⼀的a1:a10区域
Sheet1.Range(\"a1:a10\").Copy Sheet2.Range(\"a1\") '将表⼀的a1:a10区域的值复制到表2的a1End SubSub 删除⽅法()Sheets(3).DeleteEnd Sub
01-09、常量和变量
1.常量:常量是定义了之后不会变化的量常量定义格式:Const 常量名=常量表达式Sub 常量()
Const pi=3.1415926End Sub
2.变量:在定义之后还能再次赋值的量变量定义格式:Dim 变量 As 变量类型Sub 变量()Dim a As Integera=344 '此时a=344a=3455 ‘再次赋值a=3455End Sub
3.常量和变量的应⽤Sub 应⽤()
Const pi=3.1415926Dim a As Integera-200
Debug.print pi*aEnd Sub4.注意事项
4.1.VBA允许使⽤未定义的变量,默认是变体变量
4.2.变量强制性声明Option Explicit 或者在⼯具-编辑中设置每个程序都必须有变量声明5.变量的命名规则5.1以字母开头
5.2不能⽤保留字 如if end等5.3字符个数不能超过2555.4统⼀范围内必须是唯⼀的
01-10、数据类型
1.VBA中常见的数据类型
' 类型 注释 简写 占⽤内存' Integer 整型 % 2Byte' Single 单精度 ! 4Byte' Double 双精度 # 8Byte' Long 长整型 & 4Byte
' String 字符型 $ 定长或变长( 变长字符串最多可包含⼤约 20 亿 ( 2^31)个字符。 定长字符串可包含 1 到⼤约 64K ( 2^16 ) 个字符。)' Currency 货币型 @ 8Byte例:
Sub 数据类型()Dim a As IntegerDim b%End Sub
Sub 多数据类型声明()
Dim a As Integer, b As Single, c As StringDim d%, e!, f$
End Sub ‘中间⽤,隔开
01-11、判断语句之if
VBA中的IF条件判断语句,就像函数中的IF⼀样,可以单条件也可以多条件例1:
Sub 判断语句()
Dim a As Integer, b As Integera = 2b = 2
If a = b Then MsgBox \"相等\"End Sub例2:
'if判断语句有换⾏的话,就需要end if来结束Sub 判断语句2()
Dim a As Integer, b As Integera = 2b = 2
If a = b ThenMsgBox \"相等\"End IfEnd Sub例3:
'if……then……else……end ifSub 判断语句3()
Dim a As Integer, b As Integera = 2b = 3
If a = b ThenMsgBox \"相等\"Else
MsgBox \"不相等\"End IfEnd Sub
01-12、判断语句if的多条件例:
Sub 多条件判断()
‘if 条件 then 结果 elseif 条件 then 结果 elseif 条件 then 结果elseif 条件 then 结果……else 结果……end if
If Sheet1.Range(\"b1\") >= 90 ThenSheet1.Range(\"b2\") = \"优秀\"
ElseIf Sheet1.Range(\"b1\") >= 80 ThenSheet1.Range(\"b2\") = \"良好\"
ElseIf Sheet1.Range(\"b1\") >= 60 ThenSheet1.Range(\"b2\") = \"中等\"Else
Sheet1.Range(\"b2\") = \"较差\"End IfEnd Sub
VBA中的IIF函数与⼯作表函数if的语法结构是⼀致的例单条件:
Sub IIF函数应⽤()
Cells(2, 3) = IIf(Cells(1, 2) > 80, \"优秀\不优秀\")End Sub例多条件:
Sub IIF函数应⽤2()
Cells(2, 3) = IIf(Cells(1, 2) >= 90, \"优秀\
IIf(Cells(1, 2) >= 80, \"良好\中等\较差\")))End Sub
01-12B、if条件判断⼩结
1.单⾏形式1(If...Then)
If 条件判断 Then 条件成⽴结果
注意 在单⾏形式中,按照 If...Then 判断的结果也可以执⾏多条语句。所有语句必须在同⼀⾏上并且以冒号(:)分开。Sub test()
If 1 > 10 Then a = a + 1: b = 1 + a: c = 1 + bEnd Sub
2. 单⾏形式1(If 条件判断 Then 条件成⽴ Else 条件不成⽴)Sub test2()
If 1 > 1 Then MsgBox \"yes\" Else MsgBox \"no\"End Sub
3.块形式(If...Then…End)If 条件判断 Then条件成⽴结果End If
Sub test3()If 11 > 10 Thena = 1 + ab = 1 + ac = 1 + bEnd IfEnd Sub4.块形式的If嵌套 If 条件判断 Then成⽴时的结果ElseIf 条件判断 Then成⽴时的结果 …… Else
不成⽴时的结果End If
例:
If Sheet1.Range(\"b1\") >= 90 ThenSheet1.Range(\"b2\") = \"优秀\"
ElseIf Sheet1.Range(\"b1\") >= 80 ThenSheet1.Range(\"b2\") = \"良好\"
ElseIf Sheet1.Range(\"b1\") >= 60 ThenSheet1.Range(\"b2\") = \"中等\"Else
Sheet1.Range(\"b2\") = \"较差\"End IfEnd Sub
01-13、判断语句之SELECT
Select Case 语句 根据表达式的值来决定执⾏⼏组语句中的⼀种例1:
Sub select多条件判断1()i = 1
Select Case iCase Is > 0MsgBox \"正数\"Case ElseMsgBox \"负数\"End SelectEnd Sub例2:
Sub select多条件判断()
Select Case Sheet1.[d1].ValueCase \"A\"
Sheet1.[a3] = \"A型⾎的你,不是⼀个怎么样的⼈\"Case \"B\"
Sheet1.[a3] = \"B型⾎的你,更不是⼀个怎么样的⼈\"Case \"AB\"
Sheet1.[a3] = \"AB型⾎的你,更不是⼀个怎么样的⼈\"Case \"O\"
Sheet1.[a3] = \"O型⾎的你,是个不做的⼈\"End SelectEnd Sub
01-14、循环语句之do……loop
do……loop 循环语句,直到循环到满⾜某个条件Sub 循环()
Dim a As IntegerDo
a = a + 1
If a > 10 Then
MsgBox \"终于⼤于10\"Exit DoEnd IfLoopEnd Sub
01-15、循环语句之do……loop实例
例:程序:
Sub 等级()
Dim rs As Integerrs = 1Do
rs = rs + 1
If rs > 10 ThenExit DoElse
If Cells(rs, 2) > 90 Then Cells(rs, 3) = \"√\"End IfLoopEnd Sub
01-16、循环语句之do while……loop
do while 当……的时候,⾥⾯包含⼀个if函数的判断根据上⾯的例⼦进⾏改写:
Sub 循环while()Dim rs As Integerrs = 1
Do While Cells(rs, 2) <>\"\" '当单元格不等于空的时候rs = rs + 1
If Cells(rs, 2) > 90 Then Cells(rs, 3) = \"√\"LoopEnd Sub
01-17、循环语句之do until……loopdo until 直到什么的时候结束根据上⾯的例⼦进⾏改写:
Sub 循环until()Dim rs As Integerrs = 1
Do Until Cells(rs, 2) = \"\" '该单元格为空吗,为空的话就执⾏loop,否则就继续rs = rs + 1
If Cells(rs, 2) > 90 Then Cells(rs, 3) = \"√\"LoopEnd Sub例1:隔⾏填⾊
代码:
Sub 隔⾏填⾊()Dim rs As Integerrs = 2
Do Until Sheet1.Range(\"a\" & rs) = \"\"
Sheet1.Range(\"a\" & rs & \":\" & \"g\" & rs).Interior.ColorIndex = 7rs = rs + 2LoopEnd Sub
01-18、循环语句之while和until位置变化
while和until不但可以放在do后⾯,也可以放在loop后⾯事实上有时候循环在最后⼀⾏进⾏判断,更具有意义Sub doloop的最后判断循环()Dim pss As String, i As SingleDoi = i + 1
If i > 3 Then Exit Do '输⼊3次后就退出循环,只有3次机会pss = InputBox(\"请输⼊密码\")
Loop Until pss = \"123\" '当密码为123的时候结束循环End Sub
Sub doloop的最后判断循环()Dim pss As String, i As SingleDoi = i + 1
If i > 3 Then Exit Do '输⼊3次后就退出循环,只有3次机会pss = InputBox(\"请输⼊密码\")
Loop while pss = \"123\" '当密码不是123的时候结束循环End Sub
01-18B、循环语句do……loop⼩结
Do [{While | Until} 表达式] ‘while 和 until⼆选⼀[执⾏的⼀条或多条语句][Exit Do]
[[执⾏的⼀条或多条语句]Loop
while:当这个条件为True时就 循环until:直到这个条件为True时就 跳出循环或者可以使⽤下⾯这种语法:Do
[执⾏的⼀条或多条语句][Exit Do]
[执⾏的⼀条或多条语句]Loop [{While | Until}表达式]
⽤Do…Loop循环要注意的⼏点:
1. While与Until是放在Do后⾯还是Loop后⾯,取决于是先判断再循环,还是先循环再判断。前者则在Do后⾯,后者则在Loop后⾯。2. 可以在Do...Loop中的任何位置放置任意个数的 Exit Do 语句,随时跳出 Do...Loop 循环。3. Exit Do ,Do...Loop,If...Then通常结合使⽤.
4. 如果 Exit Do 使⽤在嵌套的 Do...Loop 语句中,则 Exit Do 会将控制权转移到 Exit Do 所在位置的外层循环。例:Sub test()Dim a%Doa = a + 1If a > 10 Then
MsgBox a & \"终于⼤于10\"Exit DoEnd IfLoopEnd Sub
Sub Test2()'注意这是⼀个死循环,按F8运⾏(中⽌死循环:ctrl+暂停键)Dob = b + 1 Do a = a + 1
If a > 3 Then MsgBox \"即将跳出内层循环\": Exit Do Loop
MsgBox \"即将进⾏外层循环\"LoopEnd Sub
01-19、循环语句for each ……next
当需要处理集合成员时,⼀般会⽤for each……next,实际上就是处理对象例⼦:在a2:a10单元格中,A1的全部标记为红⾊
Sub foreach循环1()
Dim rng As Range, n As Integer
For Each rng In Sheet1.Range(\"a2:a10\") '取出a2:a10中的内容If rng = \"A1\" Then rng.Interior.ColorIndex = 3 '填充颜⾊NextEnd Sub
例2:取出⼯作表的名称
Sub foreach循环2()
Dim wsh As Worksheet, a As Byte
For Each wsh In Worksheets '取出⼯作表中的每个sheet表n = n + 1
Sheet1.Cells(n, 3) = wsh.Name '将取出的⼯作表名称放⼊第3 列
NextEnd Sub
01-20、循环语句之for……next
for……next也是循环语句,与之前的do……loop不同的是for……next含有⼀个内置的计数器例:从1⼀直加到100Sub fornext循环()
Dim i As Integer, j As IntegerFor i = 1 To 100j = j + iNext
MsgBox jEnd Sub
例:知道单价和数量计算⾦额
Sub fornext循环2()Dim rng As IntegerFor rng = 2 To 21
Sheet2.Cells(rng, 4) = Sheet2.Cells(rng, 2) * Sheet2.Cells(rng, 3)NextEnd Sub
01-20B、For...NEXT⼩结与实例For...Next 语句
以指定次数来重复执⾏⼀组语句
语法
For 计数变量 = 初始值 To 终⽌值 [Step 步长值][执⾏的⼀条或多条语句][Exit For]
[执⾏的⼀条或多条语句]
Next [计数变量]可以忽略不写
注意:1.循环中可以在任何位置放置任意个 Exit For 语句,随时退出循环。
2.Exit For与 If...Then经常⼀起使⽤,⽬的是:找到符合条件后,跳出循环,⽽不必再进⾏不必要的循环。例:
Sub fornext⽰例()
Dim i As Integer, j As IntegerFor i = 2 To 16 Step 1
If Sheet3.Cells(i, 1) = \"2班\" Then Exit ForNext i
'计算出第⼀次出现2班⼈数的位置For j = 2 To 16 Step 1
If Sheet3.Cells(j, 1) = \"3班\" Then Exit ForNext j
'计算出第⼀次出现3班⼈数的位置MsgBox \"2班的⼈数是\" & j - i
'⽤第⼀次出现3班的位置减去2班出现的位置即为2班的⼈数End Sub
3.可以将⼀个 For...Next 循环放置在另⼀个 For...Next 循环中,组成嵌套循环。For I = 1 To 10For J = 1 To 10For K = 1 To 10...
Next KNext JNext I例:
01-21、⽤语句for……next制作九九乘法表
01-22、exit与end语句exit 是退出当前语句
1、exit do 2、exit for 3、exit function 4、exit sub例:找第⼀次出现⽥七的位置
Sub ⽥七位置()Dim n As IntegerFor n = 2 To 7
If Sheet1.Cells(n, 1) = \"⽥七\" Then Exit ForNext
MsgBox \"⽥七⾸次出现的位置为\" & n & \"⾏\"End Sub
end结束⼀个过程或者块
1、end 2、end if 3、end select 4、end sub
01-23、跳转语句
GoTo line⽆条件的转移到过程中指定的⾏
注意 太多的GoTo语句,会是程序代码不容易⽉底及调试
尽可能使⽤结构化的控制语句(Do……loop,for……next,if then……else)例:
Sub dotoline()
Dim str As String, k As Integer123:k = k + 1
If k > 3 Then Exit Sub
ste = InputBox(\"请登录⽤户名:\")If str <> \"admin\" Then GoTo 123
End Sub
例2:判断是否迟到
1/3是时间⾥⾯的8:00
01-24、错误分⽀语句
计算总分:
需要知道错误发⽣在第⼏⾏:
01-25、with语句
with语句,当对某个对象执⾏⼀系列语句时,不⽤重复指出对象的名称。
with的嵌套使⽤
01-26、VBA与公式
01-27、VBA与函数1
Sub 带⼯作表函数的计算()Dim i As IntegerFor i = 1 To 10
Sheet4.Cells(i, 4) = \"=sum(a\" & i & \":b\" & i & \")\"NextEnd Sub
Sub 公式带引号的计算()
Cells(12, 1) = \"=countif(a1:a10,\"\">9\"\")\"
'当公式中含有引号的时候,就要将原来的引号再加上引号,及双引号Cells(13, 1) = \"=sum(indirect(\"\"a1:a10\"\"))\"End Sub
01-28、VBA与函数2借⽤⼯作表函数
Application.WorksheetFunction. 在VBA编辑窗⼝中输⼊这样的代码,可以调⽤⼯作表函数例如:Application.WorksheetFunction.Sum
Sub 调⽤⼯作表函数()
MsgBox Application.WorksheetFunction.CountIf(Range(\"a1:a10\"), \"钢笔\")MsgBox Application.CountIf(Range(\"a1:a10\"), \"钢笔\")
MsgBox WorksheetFunction.CountIf(Range(\"a1:a10\"), \"钢笔\")End Sub
上⾯的例⼦说明Application和WorksheetFunction在调⽤函数的时候可以省略其中之⼀Sub VBA函数()
MsgBox VBA.Format(Range(\"b1\"), \"yyyy年m⽉d⽇\")MsgBox Format(Range(\"b1\"), \"yyyy年m⽉d⽇\")End Sub
当VBA和⼯作表函数不够⽤的时候,就需要⽤到⾃定义函数了,下⾯看从⾝份证中提取性别'⾃定义函数()
Function sex(rng As Range)
sex = IIf(Mid(rng, 15, 3) Mod 2, \"男\⼥\")End Function01-29、VBA与运算符1)赋值运算符 :=
2)数学运算符: &(字符连接符)、+(加)、-(减)、Mod(取余)、\\(整除)、*(乘)、/(除)、-(负号)、^(指数)3)逻辑运算符:Not(⾮)、And(与)、Or(或)、Xor(异或)、Eqv(相等)、Imp(隐含)
4)关系运算符: = (相同)、<>(不等)、>(⼤于)、<(⼩于)、>=(不⼩于)、<=(不⼤于)、Likelike⽤来⽐较两个字符串?Print 任何单⼀字符* 零个或多个字符。# 任何⼀个数字 (0–9)。
[charlist] charlist.中的任何单⼀字符?
[!charlist] 不在 charlist 中的任何单⼀字符。例:
Sub likess()
a = 1 Like \"[!2]\" '1不是⾮2中的任意⼀个End Sub '按F8可以看到结果为True
01-30、like的运算符
01-31、like运算符的运⽤例⼦:
代码:
Sub 运⽤()
Dim i As Integer, j As Integer, n As IntegerFor i = 2 To 6 For j = 2 To 14
If Cells(j, \"a\") Like Cells(i, \"e\") Then n = n + 1 Cells(i, \"f\") = n Next n = 0NextEnd Sub01-32、综合运⽤
以上例⼦中,找出未盘点的编码代码
第⼀章结束
因篇幅问题不能全部显示,请点此查看更多更全内容