您的当前位置:首页正文

第一章、ExcelVBA基础知识

2023-11-22 来源:意榕旅游网
第⼀章、ExcelVBA基础知识

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、综合运⽤

以上例⼦中,找出未盘点的编码代码

第⼀章结束

因篇幅问题不能全部显示,请点此查看更多更全内容