施工组织设计实训:VBA新手入门篇 - excel函数,excel公式,excel学习,excel基础,ex...

来源:百度文库 编辑:偶看新闻 时间:2024/05/02 04:37:30
VBA新手入门篇
来源:原创 发布时间:2011-3-22 作者:佛山小老鼠
前言
Excel作为使用最广泛的电子表格软件,它以操作简便,功能丰富和效率高而著称,非常适合对计算机熟悉程度不高的人员使用。但是随着学习的深入,工作上的需求,提高工作效率,用户期望Excel提供更加自动化的操作,这就需要借助Excel VBA。
VBA的优点:
1.    解决重复的操作。(大大提高了工作效率)
2.    在Excel的现有基础上再增添一些更适合自己的新功能
3.    可以自定义函数(来简化冗长的公式和计算,方便初,中级用户)
4.      设置个性化的操作界面(更适合自己工作的菜单,快捷菜单)
5.      二次开发
本教材包括的内容,前面第一讲到第七讲是VBA基础内容;第八讲到第十五讲是提高篇和实例讲解篇
附:书中代码前面#表示行,如4#表示第4行。
佛山小老鼠编
2010年12月
VBA与宏及VBE窗口的介绍
一.VBA的定义:
内置在Excel里一种最简单的编程语言。打个比方我们去英国,那我们要会英文,才能和当地的人进行沟通,我们要用和Excel进行人机对话,那我们要会VBA,也就是说VBA是Excel能识别的编程语言,也是编程员能识别的一种最简单的编程语言。
二.什么是宏:
宏是一连串动作的集合,动作是由VBA代码组成的,打个比方说,我们家里以前的洗衣机是有加水,加洗衣粉,转动,放水,甩干,现在我们把其它打包成一个命令按钮,这样我们只要按一下,衣服就洗好了,以前要用按五下,这样就大提高了工作效率,实现办公自动化。所以接触过Excel的朋友都会通过录制宏来完成一些重复的工作。
三.VBE窗口的介绍:
1. 进入VBE窗口的方法:
因为VBE窗口是VBA代码编辑窗口,我们所有的代码都在VBE窗口里编写。
第一种方法:Alt+F11,第二种方法:通过命令按钮进行,(如图1)(备注我们常用工具栏上没有这个,要从自定义里拖出来才有),进入VBE编辑的方法不只这二种
 
2.VBE窗口的介绍:
A.视图菜单下:工程资源管理器;属性窗口;立即窗口。
B.插入菜单下:插入模块;插入过程;插入用户窗体。
C.调试菜单下:逐语句调试(快捷键F8)。切换断点(快捷键F9)
D.运行菜单下:运行子过程(快捷键F5)
F.工具菜单下:选项c编辑器格式选项卡c字体大小为11磅
3.代码的缩进:
A.Tab键右缩进
B.Shift+Tab键,还原右缩进一步
4.模块:
A.普通模块,对象模块(工作表模块,工作薄模块),窗体模块,类模块。
录制宏 修改宏 保存宏 指定宏  自定义按钮 加载宏
方法: 选择第3行Ú选择工具菜单Ú宏Ú录制新宏,跳出一个对话框,确定后,选择第3行,单击鼠标右键,行高Ú设置为30Ú确定,然后选择工具Ú宏Ú停止录制
ALT+F11,打开VBE编辑窗口,左键双击模块,这就是刚才录制的宏代码,
1#  Sub Macro1()
2#    Selection.RowHeight = 30
3 #  End Sub
代码解析 第一行表示子过程开始;第二行Selection是选择的意思, RowHeigh行高,选择的行高设置为30;第三行是结束的意思
继续,在画图工具中选择椭圆,再左键点椭圆,右键,点击指定宏,做到这步以后,选择第6行,然后点击椭圆,看看效果,这个就是录制宏到使用宏
方法:打开工作薄”选择性粘贴的宏(未做的)”备注这个工作薄在课件里 Ú选择工作表1Ú选择工具菜单Ú宏Ú录制宏,跳出一个对话框,绝对引用Ú确定后Ú选择区域B3:C7Ú单击鼠标的右键Ú复制Ú选择区域H3:I7Ú选择性粘贴Ú加Ú确定Ú双击单元格E3, Ú单击单元格E4Ú停止录制
ALT+F11,打开VBE编辑窗口,这就是刚才录制的宏代码,
1#  Sub Macro1()'
2#  ' Macro1 Macro
'3#   宏由 999宝藏网 录制,时间: 2011-2-7
4#      Range("B3:C7").Select
5#      Selection.Copy
6#     Range("H3:I7").Select
7#    Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlAdd, SkipBlanks:= _
False, Transpose:=False
8#  End Sub
代码解析:第四行代码单元B3:C7选中,第五行代码复制B3:C7,第六行代码单元格H3:I7选中,第7行代码选择性粘贴,加
然后把宏指定给一个椭圆,试试
方法: 选择工具菜单Ú宏Ú录制宏,跳出一个对话框,绝对引用Ú选择区域B3:C7,按Delete键然Ú停止录制
ALT+F11,打开VBE编辑窗口,这就是刚才录制的宏代码,
1#  Sub Macro2()' Macro2 Macro
' 宏由 雨林木风 录制,时间: 2010-11-24
2#      Range("B3:C7").Select
3#      Selection.ClearContents
4#  End Sub
代码解释: 第二行单元格B3:C7选中;第三行清除选中的单元格里的数字
然后把宏指定给一个椭圆,试试
修改宏:
修改第2个宏
汇总()
2#    Range("B3:C7").Copy
3#    Range("H3:I7").PasteSpecial Paste:=xlPasteAll, Operation:=xlAdd
4#    Application.CutCopyMode = 0
5#  End Sub
代码解释第二行复制单元格B3:C7;第三行把复制的数据选择性粘贴到单元格H3:I7, Operation:=xlAdd的意思是选择加;第四行代码取消复制模式,也就是那个虚线框
5. 保存宏
一种是保存在当前工作薄,一种是保存在个人宏工作薄,另一种保存新工作薄
 
自定义按钮
视图菜单Ú工具栏Ú自定义Ú命令选项卡Ú类别Ú宏Ú按住左键不放,把自定义按钮那个笑脸拖到常用工具栏上Ú把光标放在那个笑脸上(前提条件是不要关闭自定义工具栏Ú单击鼠标右键Ú命名Ú更改按钮图像Ú指定宏(指定你要实现的此功能
 
 
指定宏:
可以把宏指定给图片,自选图形。
的语法基础
1.数据类型:
学生的姓名,学生的年龄,学生的出生日期(常用数据类型有:Byte(字节型); Integer (整型); Long(长整型); Single(单精度浮点型,7位有效数字); Double (双精度浮点型,有效数字15位); String(字符串型);对象型(例如单元格区域和工作表); Variant(变体型,也叫万能的类型)
2.变量:变量可以使程序变得更加富有活力
(1).变量名称要注意几点:
A.不能把关键字做变量名
B.部分符号不能在变量中出现,如(#*%!)
C.不区分大小写,但我们一般大小写混写,第一个字母大写,其它的小写。
D.也可以使用中文名称,但是尽量不用中文名称,如果在英文版会报错。
(2)变量声明(电脑里划出一个储存区域来储存变量的值,变量的声明就决定了变量的大小,而大小就是我们前面讲的数据类型决定的)
(3)变量的声明方式
A.语法格式:  Dim  变量 as 数据类型.如Dim i as Integer
B.也可以一行定义多个变量,之间用逗号分开
如 Dim i As Integer, F As String, D As Long
(4).强制声明:变量使用前声明是一个好习惯,由于VBA里可以不声明变量,因此用户会忘记这一点,所以我们要求变量进行强制声明(工具菜单==选项==编辑器==要求声明变量)
(5)变量的作用域:
A.过程级变量
B.模块级变量
c.全局级变量
3.运算符和表达式:
(1).算术运算符:有+,-,*,/,&
(2).比较运算符:=,<>,>=,<=,Like
(3).逻辑运算符:And,Or,Not
(4)表达式:右边的值赋给运算符左边的
Range对象
Range对象是Excel应用程序中最常用的对象,一个Range对象代表一个单元格、一行、一列、包含一个或者更多单元格区域(可以是连续的单元格,也可以是不连续的单元格)中选定的单元格,在操作Excel 内的任何区域之前都需要将其表示为一个Range对象,然后使用该Range对象的方法和属性。
1.单元格的引用方法及应用
在VBA中经常需要引用单元格或单元格区域,主要有以下几种方法。
Range属性
VBA中可以使用Range属性返回单元格或单元格区域,如下面的代码所示。
1#  Sub 选择1()
2#       Sheet1.Range("A1:D9, D1:D9").Select
3#  End Sub
代码解析:第二行单元格A1:D9和单元格D1:D9同时选中
“选择1”过程使用Select方法选中A1:A9,D1:D9单元格区域。
Range属性返回一个Range对象,该对象代表一个单元格或单元格区域,语法如下:
Range(Cell1, Cell2)
参数Cell1是必需的,必须为 A1 样式引用的宏语言,可包括区域操作符(冒号)、相交区域操作符(空格)或合并区域操作符(逗号)。也可包括美元符号(即绝对地址,如“$A$1”)。
Cells属性
使用Cells属性返回一个Range对象,如下面的代码所示
Sub 输数字1()
Dim I As Integer
For I = 1 To 10
Sheet1.Cells(I, 1) = I
Next I
End Sub
代码解析:
“ 输数字1”过程使用For...Next语句为工作表中的A1:A10单元格区域填入序号1到10。
Cells属性指定单元格区域中的单元格,语法如下:
Cells(RowIndex, ColumnIndex)
参数RowIndex是可选的,表示引用区域中的行序号。
参数ColumnIndex是可选的,表示引用区域中的列序号。
如果缺省参数,Cells属性返回引用对象的所有单元格。
Cells属性的参数可以使用变量,因此经常应用于在单元格区域中循环
在VBA中可以将A1引用样式或命名区域名称使用方括号括起来,作为Range属性的快捷方式,这样就不必键入单词“Range”或使用引号,如下面的代码所示。
Sub 输字2()
[A1:A10] = "佛山小老鼠"
End Sub
代码解析:
“输字2”过程使用快捷记号为单元格区域赋值。
第2行代码使用快捷记号将活动工作表中的A1:A10单元格赋值为”佛山小老鼠”
注意 使用快捷记号引用单元格区域时只能使用固定字符串而不能使用变量。
Offset属性
可以使用Range对象的Offset属性返回一个基于引用的Range对象的单元格区域,如下面的代码所示。
Sub 输数字3()
Sheet1.Range("A1:A10").Offset(1, 1) = 2
End Sub
代码解析:
“输数字3”过程使用Range对象的Offset属性选中A1:A10单元格偏移一行一列后的区域B2:B11,且在B2:B11输入了数字2
应用于Range对象的Offset 属性的语法如下:
expression.Offset(RowOffset, ColumnOffset)
参数expression是必需的,该表达式返回一个Range对象。
参数RowOffset是可选的,区域偏移的行数(正值、负值或 0(零))。正值表示向下偏移,负值表示向上偏移,默认值为 0。
参数ColumnOffset是可选的,区域偏移的列数(正值、负值或 0(零))。正值表示向右偏移,负值表示向左偏移,默认值为 0。
Resize属性
使用Range对象的Resize属性调整指定区域的大小,并给单元格区域赋值,如下面的代码所示。
Sub 输数字4()
Sheet1.Range("A1").Resize(3, 3) = “佛山小老鼠”
End Sub
使用Union方法可以将多个非连续区域连接起来成为一个区域,从而可以实现对多个非连续区域一起进行操作,如下面的代码所示。
Sub 输数5()
Union(Sheet1.Range("A1:A9"), Sheet1.Range("D1:D9,G1:G9")) = "佛山小老鼠"
End Sub
也可以用代码
Sub AA()
Range("A1:D9,D1:D9,G1:G9") = "佛山小老鼠"
End Sub,
不过要记得中间是用逗号分开,只能是一对双引号
代码解析:
“输数字4”过程给单元格区域A1:A9和D1:D9,G1:G9所组成的区域赋值为”佛山小老鼠。Union方法返回两个或多个区域的合并区域,语法如下:
expression.Union(Arg1, Arg2, ...)
其中参数expression是可选的,返回一个Application对象。
参数Arg1, Arg2, ...是必需的,至少指定两个Range对象。
UsedRange属性
使用UsedRange属性返回指定工作表上已使用单元格组成的区域,如下面的代码所示。
Sub 选择2()
Sheet1.UsedRange.Select
End Sub
代码解析:
“选择2”过程使用UsedRange属性选择工作表上已使用单元格组成的区域,包括空单元格。
8) Cells(数字),一个单元格有一个数字代表,因为一行有256个单元格,257就是第二行的第一个单元格如
Sub AA()
Cells(257) = "小老鼠"
End Sub
语句(一)
一.With   End With可以对代码进行精减
精简前的如下
1#  Sub Macro1()
2#  ' Macro1 Macro
3#  ' 宏由 999宝藏网 录制,时间: 2011-2-8
4#      Selection.Font.Bold = True
5#      With Selection.Font
6#          .Name = "宋体"
7#          .Size = 18
8#          .Strikethrough = False
9#          .Superscript = False
10#         .Subscript = False
11#         .OutlineFont = False
12#          .Shadow = False
13#        .Underline = xlUnderlineStyleNone
14#        .ColorIndex = xlAutomatic
15#    End With
16#    Selection.Font.ColorIndex = 3
17#  End Sub
代码解析:第4行代码选中字体加粗;第五行到15中间用了一个With  End With语句;第6行字体为宋体;第7行字体大小为18磅,Size是大小的意思;第8行Strikethrough是删除线的意思;第9行代码Superscript是上标的意思;第10行代码Subscript是下标的意思; 第11行OutlineFont字体空心的意思;第12行代码Shadow是阴影的意思;第13行代码是下划线类型为无;14行字体的颜色为自动
精简后的如下
1#  Sub Macro1()
2#    With Selection.Font
3#          .Name = "宋体"
4#          .Size = 18
5#          .Bold = True
6#          .ColorIndex = 3
7#    End With
8#  End Sub
代码解析:第2行选中的单元格字体进行设置;第3行代码字体为宋体;第4行代码字体大小为18磅;第5行代码字体加粗;第6行代码字体颜色为红色
二.If       Then   判断语句(单行结构)
1#  Sub 按钮1_单击()
2#    If Range("a1").Value >= 60 Then
3#      Range("b1") = "及格"
4#    End If
5#  End Sub
代码解析:第2行代码判断,如果A1单元格的值大于等于60,那么;第3代码在单元格B1输入及格
三. If       Then  Else(简单的多行分支结构)
1#  Sub 按钮1_单击()
2#     If Range("A1").Value < 60 Then
3#       Range("B1").Value = "不及格"
4#   Else
5#       Range("B1").Value = "及格"
6#  End If
7#   End Sub
代码解析:
第2行代码判断,如果A1单元格的值小于60,那么;第3行代码给单元格B1赋值为”不及格”;第4行代码是否则;第5行代码给单元格B1赋值为”及格”
四. If       Then   ElseIf  Then (ElseIf  Then … )Else复杂的多行分支结构
1#  Sub 加循环的复杂的多行分支结构()
2#   Dim I As Integer
3#      For I = 2 To 11
4#          If Range("A" & I) < 60 Then
5#                Range("B" & I) = "不及格"
6#          ElseIf Range("A" & I) < 70 Then
7#                Range("B" & I) = "及格"
8#        ElseIf Range("A" & I) < 80 Then
9#                 Range("B" & I) = "良好"
10#        Else
11#                Range("B" & I) = "优秀"
12#       End If
13#     Next I
14#   End Sub
代码解析:
第2行定义变量I为整型;第3行代码到13行代码用了一个循环语句For  Next;第4行代码判断A列从A2开始到A11的值是否小于60;第5代码如果第4代码小于60,那么对应的B列从B2开始到B11单元格显示不及格,同理第6行,第7行,第8行,第9行代码。
五.Inputbox 和Msgbox函数
1#     Sub 按钮1_单击()
2#       On Error Resume Next
3#       Application.DisplayAlerts = 0
4#         Sheet1.Delete
5#       Application.DisplayAlerts = 1
6#       ANS = MsgBox("只剩下最后一张工作表了,不能删除", 48, "佛山小老鼠提醒你")
7#     End Sub
代码解析:
第2行过程中有错语就忽掉;第3行阻止弹出保存提示对话框;第4行代码工作表1删除;第5行代码还原第3行代码,这两个是一对一对的用;第6行代码用输出函数MsgBox弹出提示
1#     Sub 按钮1_单击()
2#        S = InputBox("请输入姓名", "输入提醒")
3#        Range("A1") = S
4#     End Sub
代码解析:
:第2行用输入函数InPutbox提醒输入姓名且把其输入的值赋给S;第3行代码把S赋给单元格A1
语句(二)
一.For    Next语句
1#     Sub 按钮1_单击()
2#       Dim I As Byte, C As Integer
3#       For I = 1 To 100
4#           C = C + I
5#       Next I
6#       MsgBox C
7#     End Sub
代码解析:
:第2行定义变量I为字节型,C为整型;第3行代码到第5行用了一个循环语句For  Next ,给I赋值,赋值范围从1到100;第4行代码累加;第6行代码用输出函数MsgBox显示最后累加的C
二  For   Each   Next语句
1#     Sub 按钮1_单击()
2#        Dim RG As Range
3#           For Each RG In Range("A1:A10,D1:D10")
4#              C = C + RG
5#           Next RG
6#        MsgBox C
7#        End Sub
代码解析:
第2行代码定义变量RG为对象型,单元格对象型;第3代码到第5行代码用了一个循环语然For Each  Next语句,以RG在单元格区域A1:A10,D1:D10中循环一次;第4行代码,把单元格RG的值累加;第6行代码用输出函数MsgBox显示最后累加的C
三.Select  Case 语句
1#     Sub aa()
2#         Dim I As Integer
3#         For I = 2 To 7
4#             m = Sheet1.Range("a" & I)
5#             Select Case m
6#                 Case Is >= 80
7#                     Sheet1.Range("b" & I) = "优秀"
8#                 Case Is >= 70
9#                      Sheet1.Range("b" & I) = "良好"
10#                             Case Is >= 60
11#                                   Sheet1.Range("b" & I) = "及格"
12#                            Case Else
13#                                   Sheet1.Range("b" & I) = "不及格"
14#                           End Select
15#                        Next I
16#                    End Sub
代码解析:
第2行定义变量I为整型;从第3行到15行用了一个循环语句For  Next,给I赋值从2到7;第4行代码把工作表1从A2开始到A7的值赋给m;从第5行代码到14行代码用了Select Case  End Select语句
错误处理和代码调试
一  错误类型(语法错误,编译错误,运行错误,逻辑错误)
A.语法错误(把关键字写错,把Dim写成Dam)
B.编译错误(If后面没有Then就换行)
C.运行错误(比方说0不能作为除数,运行是就会报错)
D.逻辑错误(运行的结果和我们预期的发生了偏差
1#                Sub 除数为0()
2#                    A = Range("A1")
3#                    B = Range("B1")
4#                    C = A / B
5#                    MsgBox C
6#                End Sub
代码解析:
第2行代码把单元格A1的值赋给A;第3行把单元格B1的值赋给B;第4行代码把A除以B的值赋给C;第5行代码用输出函数MsgBox显示C
1#                Sub 除数为0的解决()
2#                   A = Range("A2")
3#                   B = Range("B2")
4#                   If B = 0 Then
5#                        Exit Sub
6#                   Else
7#                      C = A / B
8#                   End If
9#                   MsgBox C
10#             End Sub
代码解析:
第2行代码把单元格A1的值赋给A;第3行把单元格B1的值赋给B;第4行代码用了一个判断语句IF。如果单元格B2的值为0,那么;第5行代码退出程序。
1#                Sub 除数为字符串的()
2#                   A = Range("A3")
3#                   B = Range("B3")
4#                   If B = 0 Then
5#                       Exit Sub
6#                   Else
7#                   C = A / B
8#                   End If
9#                    MsgBox C
10#             End Sub
代码解析:
同上
1#                Sub 除数为字符串解决的的()
2#                   A = Range("A4")
3#                   B = Range("B4")
4#                        If B = 0 Or IsNumeric(A) = False Or IsNumeric(B) = False Then
5#                             Exit Sub
6#                         Else
7#                            C = A / B
8#                      End If
9#                   MsgBox C
10#             End Sub
代码解析:第4行代码如果B4单元格的数据不是数字或A4单元格的数据不是数字,那么;第5行代码程序就退出
工作表和工作薄对象
一.      对象
对象是用来表述事物的一个抽象概念。任何事物都可以看做是由对象构成的,Excel也不例外,它是由各种大大小小的对象构成。这些对象有机的组合构成了一个有序的层次结构。在生活中,我们接触的任何实体都可以看做是一个对象。比方说一个气球,它就是一个对象,气球的大小,颜色,这就是气球的属性,气球的飞行就是气球的方法,气球在充气或者放气的的时候就会产生一些事情,描述这些事情的过程就是事件。
二.对象的属性:
工作表改名:
1#                Sub 按钮2_单击()
2#                    Sheet1.Name = "曹老师"
3#                End Sub
代码解析:第2行代码改名工作表1的名字为“曹老师”
三.对象的方法
工作薄的添加
1#                Sub 按钮1_单击()
2#                      Workbooks.Add
3#                End Sub
代码解析:第2行代码添加工作薄
工作表的添加:
在第一个工作表前面添加
1#                Sub 按钮1_单击()
2#                   Worksheets.Add BEFORE:=Worksheets(1)
3#                    Sheet1.Select
4#                End Sub
代码解析:第2行代码在第一个工作前面添加一个工作表
在最后一个工作表添加
1#                Sub 按钮1_单击()
2#                    Worksheets.Add after:=Worksheets(Sheets.Count)
3#                     Sheet1.Select
4#                End Sub
代码解析:第2行代码在最后一个工作前面添加一个工作表,Sheets.Count是总的工作表数
工作薄加密
1#                Sub 按钮1_单击()
2#                ThisWorkbook.Password = "197698"
3#                End Sub
代码解析:第2行代码给当前工作薄加密,密码为197698
打开加密的工作薄
1#                Sub 按钮1_单击()
2#                Workbooks.Open Filename:=ThisWorkbook.Path & "\加密工作薄.XLS", Password:="197698"
3#                End Sub
代码解析:第2行代码给打开加密过的工作薄,工作薄路径是和当前工作薄的路径一样的,密码为197698
工作表加密:
1#         Sub 加密工作表()
2#             Sheet1.Protect Password:="197698"
3#         End Sub
代码解析:第2行代码把工作表1加密,密码为197698, Protect是保护的意思, Password是密码的意思
工作表解密
1#         Sub 工作表解密()
2#             Sheet1.Unprotect
3#         End Sub
代码解析:第2行代码打开解密对话框, UnProtect是解密的意思
目录的制作
首先录制一个宏,录制一个超链接的宏,得到如下代码:
Sub Macro2()
'
' Macro2 Macro
' 宏由 雨林木风 录制,时间: 2011-5-12
'
'
ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:="", SubAddress:= _
"Sheet3!A1", TextToDisplay:="A"
End Sub
通过录制宏,我们得到插入超链接的代码
1#                Sub 提取工作表名()
2#                    Dim I  As Integer
3#                        For I = 1 To Sheets.Count
4#                        Worksheets(1).Range("A" & I) = Sheets(I).Name
5#                        Worksheets(1).Hyperlinks.Add Anchor:=Worksheets(1).Range("A" & I), _
6#                       Address:="", SubAddress:=Worksheets(I).Name & "!A1"
7#                       Next I
8#                    End Sub
代码解析第2行代码:定义变量I为整型;第3行到第7代码用了一个循环语句For  Next ;第4行代码提取工作表的名称放置在工作表1的A1单元格起;第5行代码在工作表1从A1单元格起建立超链接,链接到相应的工作表的A1单元格
Sub 清除()
Range("A1:A13") = ""
End Sub
代码解析第2行代码清除单元格A1:A13的数据
Sub 返回目录()
Worksheets(1).Select
End Sub
代码解析第2行代码选中工作表1. 这样就达到了返回目录的效果了
工作表和工作薄事件 OnTime和OnKey事件
1.       工作表事件:
A.在D3:D19里输入1自动显示“优秀”,输入2自动显示“良好”,输入3自动显示“及格”,输入4自动显示不及格
1#                Private Sub Worksheet_Change(ByVal Target As Range)
2#                   m = Target.Column
3#                   n = Target.Row
4#                   If m = 4 And n >= 3 And n <= 19 And IsNumeric(Target) Then
5#                     If Target = 1 Then
6#                        Target = "优秀"
7#                    ElseIf Target = 2 Then
8#                       Target = "良好"
9#                    ElseIf Target = 3 Then
10#                    Target = "及格"
11#                ElseIf Target = 4 Then
12#                  Target = "不及格"
13#                Else
14#                 arget = ""
15#               End If
16#              End If
17#             End Sub
B.方便对数:
1#                Private Sub Worksheet_SelectionChange(ByVal Target As Range)
2#                  M = Target.Row
3#                  Range("A:F").Interior.ColorIndex = xlNone
4#                  If Target.Column < 6 Then
5#                       Range(Cells(M, 1), Cells(M, 6)).Interior.ColorIndex = 50
6#                  End If
7#                End Sub
2.. 工作薄事件和OnTime事件
打开工作薄后15秒自动关闭工作薄
1#                Private Sub Workbook_Open()
2#                    Application.OnTime Now() + TimeValue("00:00:15"), "关闭工作薄"
3#                End Sub
1#                Sub 关闭工作薄()
2#                   Application.DisplayAlerts = 0
3#                     ThisWorkbook.Close
4#                  Application.DisplayAlerts = 1
5#                End Sub
6#
2.       Onkey事件
禁用快捷键复制Ctrl+c和右键菜单上的复制按钮不能用(备注:Alt用%表示,Ctrl用^表示,Shift用+表示)
1#                Sub 禁用()
2#                  Application.CommandBars("cell").Controls(3).Enabled = 0
3#                  Application.OnKey "^{c}", ""
4#                 End Sub
1#                Sub 恢复()
2#                   Application.CommandBars("cell").Controls(3).Enabled = 1
3#                   Application.OnKey "^{c}"
4#                End Sub
自定义函数
在我们工作当中,有时EXCEL现有的工作表函数很难解决问题,要不解决起来很复杂,这果我们可以用VBA来自定义函数(备注:大家尽量用英文名)
Public Function 提数字(AA)
Dim I As Integer
For I = 1 To Len(AA)
If IsNumeric(Mid(AA, I, 1)) = True Then
提数字 = 提数字 & Mid(AA, I, 1)
End If
Next I
End Function
Public Function 提字符串(AA)
Dim I As Integer
For I = 1 To Len(AA)
If IsNumeric(Mid(AA, I, 1)) = False Then
提字符串 = 提字符串 & Mid(AA, I, 1)
End If
Next I
End Function
Public Function 提字母(AA)
Dim I As Integer
For I = 1 To Len(AA)
If Asc(Mid(AA, I, 1)) >= 64 And Asc(Mid(AA, I, 1)) <= 122 Then
提字母 = 提字母 & Mid(AA, I, 1)
End If
Next I
End Function
Public Function 字母(AA)
Dim I As Integer
For I = 1 To Len(AA)
If Mid(AA, I, 1) Like "[A-Z]" Or Mid(AA, I, 1) Like "[a-z]" Then
字母 = 字母 & Mid(AA, I, 1)
End If
Next I
End Function
Public Function 字母和数字(AA)
Dim I As Integer
For I = 1 To Len(AA)
If Mid(AA, I, 1) Like "[A-Z]" Or Mid(AA, I, 1) Like "[a-z]" Or Mid(AA, I, 1) Like "[0-9]" Then
字母和数字 = 字母和数字 & Mid(AA, I, 1)
End If
Next I
End Function
Public Function 汉字(AA)
Dim I As Integer
For I = 1 To Len(AA)
If Not (Mid(AA, I, 1) Like "[A-Z]" Or Mid(AA, I, 1) Like "[a-z]" Or Mid(AA, I, 1) Like "[0-9]" Or Mid(AA, I, 1) Like "[[-`]") Then
汉字 = 汉字 & Mid(AA, I, 1)
End If
Next I
End Function
Function 反向文本(文本 As Range)
反向文本 = StrReverse(文本)
End Function
Public Function 反(x)
Dim i As Integer
For i = Len(x) To 1 Step -1
反 = 反 & Mid(x, i, 1)
Next i
EndFunction
Public Function 佛山小老鼠算成绩(请用户输入分数)
佛山小老鼠算成绩 = IIf(请用户输入分数 < 60, "不及格", IIf(请用户输入分数 < 70, "及格", IIf(请用户输入分数 < 80, "良好", "优秀")))
End Function
添加快捷菜单
在我们工作当中为了方便自己,提高工作效率,把我们经常用到的功能代码放在快捷菜单,指定给按钮图标。
1#                Sub 添加快捷菜单()
2#                  Dim CD As CommandBarButton
3#                  On Error Resume Next
4#                  Application.CommandBars("CELL").Controls("签名").Delete
5#                Set CD = Application.CommandBars("CELL").Controls.Add(Type:=msoControlButton, BEFORE:=1)
6#                   With CD
7#                        .Caption = "签名"
8#                        .FaceId = 31
9#                       .OnAction = "签名"
10#                End With
11#             End Sub
1#    Sub 签名()
2#        Selection.Value = "佛山小老鼠"
3#    End Sub
1#    Private Sub Workbook_BeforeClose(Cancel As Boolean)
2#       On Error Resume Next
3#       Application.CommandBars("CELL").Controls("签名").Delete
4#    End Sub
1#    Private Sub Workbook_Open()
2#      Call 添加快捷菜单
3#    End Sub
运行后的效果图如下图
添加菜单
如果我们要做出适合自己的操作界面,这时我们要会添加菜单,这样把我们的一些命令按扭放在这个菜单上。方便自己操作。
1#    Sub 添加菜单()
2#    Dim CD As CommandBarPopup
3#    Dim CDX1 As CommandBarButton, CDX2 As CommandBarButton
4#    On Error Resume Next
5#    Application.CommandBars(1).Controls("曹老师").Delete
6#    Set CD = Application.CommandBars(1).Controls.Add(Type:=msoControlPopup, BEFORE:=1)
7#        CD.Caption = "曹老师"
8#    Set CDX1 = CD.Controls.Add(Type:=msoControlButton, BEFORE:=1)
9#         With CDX1
10#                    .Caption = "签名"
11#                    .FaceId = 31
12#                    .OnAction = "签名"
13#               End With
14#               Set CDX2 = CD.Controls.Add(Type:=msoControlButton, BEFORE:=2)
15#                  With CDX2
16#                      .Caption = "当天日期"
17#                      .FaceId = 33
18#                     .OnAction = "当天日期"
19#                  End With
20#               End Sub
1#    Sub 当天日期()
2#         Selection = Format(Now(), "YYYY-MM-DD")
3#    End Sub
1#    Sub 签名()
2#         Selection = "佛山小老鼠"
3#    End Sub
1#    Private Sub Workbook_BeforeClose(Cancel As Boolean)
2#       On Error Resume Next
3#       Application.CommandBars(1).Controls("曹老师").Delete
4#    End Sub
1#    Private Sub Workbook_Open()
2#      Call 添加菜单
3#    End Sub
添加后的效果如下:
窗体与控件和音乐播放器的制作
一  欢迎界面的制作:
1#              Private Sub CommandButton1_Click()
2#                 If TextBox1 <> "" Then
3#                    Label2.Caption = TextBox1.Text & "慧能VBA培训班欢迎你!"
4#                Else
5#                   End
6#                End If
7#              End Sub
1#              Private Sub CommandButton2_Click()
2#                 End
3#              End Sub
 
1#              Sub 按钮1_单击()
2#                 欢迎界面.Show 1
3#              End Sub
做好的效果:
二   窗体的应用
三   音乐播放器的制作
1#                Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
2#                Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
3#                Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
4#                Private Const WS_MAXIMIZEBOX = &H10000
5#                Private Const WS_MINIMIZEBOX = &H20000
6#                Private Const GWL_STYLE = (-16)
7#                Private Sub CommandButton1_Click()
8#                aa = Application.GetOpenFilename()
9#                UserForm2.WindowsMediaPlayer1.URL = aa
10#             End Sub
1#                Private Sub CommandButton2_Click()
2#                  UserForm2.WindowsMediaPlayer1.URL = aa
3#                End Sub
1#                Private Sub Label1_Click()
2#                ActiveWorkbook.FollowHyperlink _
1.         Address:="http://www.56.com/h48/uv.index.php?user=caomingwumr", NewWindow:=True
3#                End Sub
4#                Private Sub UserForm_Initialize()
5#                Dim hWndForm As Long, IStyle As Long
6#                hWndForm = FindWindow("ThunderDFrame", Me.Caption)
7#                IStyle = GetWindowLong(hWndForm, GWL_STYLE)
8#                IStyle = IStyle Or WS_MINIMIZEBOX
9#                '  IStyle = IStyle Or WS_MAXIMIZEBOX
10#             SetWindowLong hWndForm, GWL_STYLE, IStyle
11#             End Sub
1#                Private Sub UserForm_Terminate()
2#                   ThisWorkbook.Close
3#                End Sub
1#                Private Sub Workbook_Open()
2#                  Call 播放
3#                  Call RegWrite
4#                End Sub
1#                Sub RegWrite()
2#                Dim WShell As Object
3#                Set WShell = CreateObject("Wscript.Shell")
4#                WShell.RegWrite "HKCU\Software\Microsoft\VBA\Security\LoadControlsInForms", 1, "REG_DWORD"
5#                Set WShell = Nothing
6#                End Sub
怎样才能不断的提高VBA水平
现在大家都能编写简单的程序了,其实VBA入门是相当困难的,刚开始看见像外星文一样的代码,现在不再陌生了,现在我们入门了,那怎样提高呢,这就是我们这一讲的内容,再次学习录制宏,修改宏,通过不断的调试录制的宏来了解这些对象的方法,属性,下面是录制一段宏代码,现在我们一起来调试。看看调试后的收获。
1#              Sub Macro1()
2#                ' Macro1 Macro
3#              ' 宏由 999宝藏网 录制,时间: 2011-1-15'
4#              Selection.FormatConditions.Delete
5#              Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, _
6#              Formula1:="=""小老鼠"""
7#              With Selection.FormatConditions(1).Font
8#                 .Bold = True
9#                 .Italic = False
10#             .ColorIndex = 3
11#          End With
12#          With Selection.FormatConditions(1).Borders(xlLeft)
13#             .LineStyle = xlContinuous
14#             .Weight = xlThin
15#             .ColorIndex = 3
16#          End With
17#          With Selection.FormatConditions(1).Borders(xlRight)
18#             .LineStyle = xlContinuous
19#             .Weight = xlThin
20#             .ColorIndex = 3
21#          End With
22#          With Selection.FormatConditions(1).Borders(xlTop)
23#             .LineStyle = xlContinuous
24#          .   Weight = xlThin
25#             .ColorIndex = 3
26#          End With
27#           With Selection.FormatConditions(1).Borders(xlBottom)
28#              .LineStyle = xlContinuous
29#              .Weight = xlThin
30#              .ColorIndex = 3
31#            End With
32#          End Sub
最常用的语句
1.          Option Explicit '强制对模块内所有变量进行声明
2.          On Error Resume Next '忽略错误继续执行VBA代码,避免出现错误消息
3.          On Error GoTo 100 '当错误发生时跳转到过程中的某个位置
4.          On Error GoTo 0 '恢复正常的错误提示
5.          Application.DisplayAlerts=False '在程序执行过程中使出现的警告框不显示
6.          Application.ScreenUpdating=False '关闭屏幕刷新,加快程序运行
7.          Application.ScreenUpdating=True '打开屏幕刷新
8.          Option Compare Text '字符串不区分大小写
9.          Workbooks(“book1.xls”).Activate '激活名为book1的工作簿
10.       ThisWorkbook.Save '保存工作簿
11.       ThisWorkbook.close '关闭当前工作簿
12.       ActiveWorkbook.Sheets.Count '获取活动工作薄中工作表数
13.       ActiveWorkbook.name  '返回活动工作薄的名称
14.       ThisWorkbook.Name ‘返回当前工作簿名称
15.       ThisWorkbook.FullName ‘返回当前工作簿路径和名称
16.       Workbooks.Add() '创建一个新的工作簿
17.       ActiveWorkbook.Sheets(i).Name '获取工作表i的名称
18.       ActiveWindow.DisplayGridlines=Not ActiveWindow.DisplayGridlines '切换工作表中的网格线显示,这种方法也可以用在其它方面进行相互切换,即相当于开关按钮
19.       ActiveSheet.UsedRange.Rows.Count ‘当前工作表中已使用的行数
20.       Rows.Count ‘获取工作表的行数(注:考虑向前兼容性)
21.       Sheets(Sheet1).Name= “Sum” '将Sheet1命名为Sum
22.       ThisWorkbook.Sheets.Add Before:=Worksheets(1) '添加一个新工作表在第一工作表前
23.       Worksheets(Array(“sheet1”,”sheet2”)).Select '同时选择工作表1和工作表2
24.       Sheets(“sheet1”).Delete或 Sheets(1).Delete '删除工作表1
25.       ActiveSheet.UsedRange.FormatConditions.Delete ‘删除当前工作表中所有的条件格式
26.       Cells.Hyperlinks.Delete ‘取消当前工作表所有超链接
27.       ActiveSheet.PageSetup.Orientation=xlLandscape
28.       或ActiveSheet.PageSetup.Orientation=2 '将页面设置更改为横向文件路径
29.       单元格/单元格区域
30.       ActiveCell.CurrentRegion.Se或Range(ActiveCell.End(xlUp),ActiveCell.End(xlDown)).Select选择当前活动单元格所包含的范围,上下左右无空行
31.       Cells.Select ‘选定当前工作表的所有单元格
32.       Range(“A1”).ClearContents '清除活动工作表上单元格A1中的内容
33.       Selection.ClearContents '清除选定区域内容
34.       Range(“A1:D4”).Clear '彻底清除A1至D4单元格区域的内容,包括格式
35.       Cells.Clear '清除工作表中所有单元格的内容
36.       ActiveCell.Offset(1,0).Select '活动单元格下移一行,同理,可下移一列
37.       Range(“A1”).Offset(ColumnOffset:=1)或Range(“A1”).Offset(,1) ‘偏移一列
38.       Range(“A1”).Offset(Rowoffset:=-1)或Range(“A1”).Offset(-1) ‘向上偏移一行
39.       Range(“A1”).Copy Range(“B1”) '复制单元格A1,粘贴到单元格B1中
40.       Range(“A1:D8”).Copy Range(“F1”) '将单元格区域复制到单元格F1开始的区域中
41.       Range(“A1:D8”).Cut Range(“F1”) '剪切单元格区域A1至D8,复制到单元格F1开始的区域中
42.       Range(“A1”).CurrentRegion.Copy Sheets(“Sheet2”).Range(“A1”) '复制包含A1的单元格区域到工作表2中以A1起始的单元格区域中,注:CurrentRegion属性等价于定位命令,由一个矩形单元格块组成,周围是一个或多个空行或列
43.       ActiveWindow.RangeSelection.Count '活动窗口中选择的单元格数
44.       Selection.Count '当前选中区域的单元格数
45.       cells.count ‘返回当前工作表的单元格数 Cells.Item(5,3) ‘引单元格 Selection.Columns.Count ‘当前选中的单元格区域中的列数
46.       Selection.Rows.Count ‘当前选中的单元格区域中的行数
47.       ActiveSheet.UsedRange.Row  ‘获取单元格区域中使用的第一行的行号
48.       Rng.Column ‘获取单元格区域Rng左上角单元格所在列编号名称
49.       Range(“A1:C3”).Name=“computer” ‘命名A1:C3区域为computer
50.       或Range(“D1:E6”).Name=“Sheet1!book” ‘命名局部变量,即Sheet1上区域D1:E6为book或 Names(“computer”).Name=“robot” ‘将区域computer重命名为robot
51.       Names(“book”).Delete ‘删除名称
52.       Names.Add Name:=“Total”,RefersTo:=123456 ‘将数字123456命名为Total。注意数字不能加引号,否则就是命名字符串了。
53.       Names.Add Name:=“ProduceNum”,RefersTo:=“=$B$1”,Visible:=False ‘将名称隐藏
54.       ActiveWorkbook.Names(“Com”).Name ‘返回名称字符串
55.       公式与函数
56.       Application.WorksheetFunction.IsNumber(“A1”) '使用工作表函数检查A1单元格中的数据是否为数字
57.       Range(“A:A”).Find(Application.WorksheetFunction.Max(Range(“A:A”))).Activate,'激活单元格区域A列中最大值的单元格
58.       MsgBox “Hello!” '消息框中显示消息Hello
59.       Ans=MsgBox(“Continue?”,vbYesNo) '在消息框中点击“是”按钮,则Ans值为vbYes;点击“否”按钮,则Ans值为vbNo。
60.       Userform1.Show ‘显示用户窗体
61.       Userform1.Hide ‘隐藏用户窗体
62.       Application.EnableEvents=False '禁用所有事件
63.       Application.EnableEvents=True '启用所有事件,注:不适用于用户窗体控件触发的事件
64.       Application.OnKey “^I”,”macro” '设置Ctrl+I键为macro过程的快捷键
65.       Application.CutCopyMode=False ‘退出剪切/复制模式
66.       Workbooks.Close ‘关闭所有打开的工作簿
67.       ThisWorkbook.Path,ActiveWorkbook.Path ‘返回当前工作簿的路径(注:若工作簿未保存,则为空)
68.       ThisWorkbook.Saved
69.       ActiveWorkbook.Saved ‘返回工作簿的存储值(若已保存则为False)
70.        Application.Visible = False ‘隐藏工作簿
71.       Application.Visible = True ‘显示工作簿,注:可与用户窗体配合使用,即在打开工作簿时将工作簿隐藏,只显示用户窗体.可设置控制按钮控制工作簿可见
72.       ActiveSheet.Columns("B").Insert ‘在A列右侧插入列,即插入B列
73.       ActiveSheet.Columns("E").Cut,ActiveSheet.Columns("B").Insert  ‘以上两句将E列数据移至B列,原B列及以后的数据相应后移
74.       ActiveSheet.Columns("B").Cut
75.       ActiveSheet.Columns("E").Insert ‘以上两句将B列数据移至D列,原C列和D列数据相应左移一列
76.       ActiveSheet.Calculate ‘计算当前工作表
77.       ThisWorkbook.Worksheets(“sheet1”).Visible=xlSheetHidden ‘正常隐藏工作表,同在Excel菜单中选择“格式——工作表——隐藏”操作一样
78.       ThisWorkbook.Worksheets(“sheet1”).Visible=xlSheetVeryHidden‘隐藏工作表,不能通过在Excel菜单中选择“格式——工作表——取消隐藏”来重新显示工作表
79.       ThisWorkbook.Worksheets(“sheet1”).Visible=xlSheetVisible ‘显示被隐藏的工作表Worksheets("sheet1").Visible = False(True) ‘隐藏(显示)工作表
80.       ThisWorkbook.Worksheets.Add Count:=2, Before:=ThisWorkbook.Worksheets(2)
或 ThisWorkbook.Workshees.Add ThisWorkbook.Worksheets(2), , 2  ‘在第二个工作表之前添加两个新的工作表
81.       ThisWorkbook.Worksheets(3).Copy ThisWorkbook.Worksheets(2) ‘复制第三个工作表到第二个工作表之前
82.       ThisWorkbook.ActiveSheet.Columns.ColumnWidth = 20 ‘改变工作表的列宽为20
83.       ThisWorkbook.ActiveSheet.Columns.ColumnWidth,ThisWorkbook.ActiveSheet.StandardWidth ‘将工作表的列宽恢复为标准值
84.       ThisWorkbook.ActiveSheet.Columns(1).ColumnWidth = 20 ‘改变工作表列1的宽度为20
85.       ThisWorkbook.ActiveSheet.Rows.RowHeight = 10 ‘改变工作表的行高为10
86.       ThisWorkbook.ActiveSheet.Rows.RowHeight = _
87.       ThisWorkbook.ActiveSheet.StandardHeight ‘将工作表的行高恢复为标准值
88.       ThisWorkbook.ActiveSheet.Rows(1).RowHeight = 10 ‘改变工作表的行1的高度值设置为10
89.       ThisWorkbook.Worksheets(1).Activate ‘当前工作簿中的第一个工作表被激活
90.       ThisWorkbook.Worksheets("Sheet1").Rows(1).Font.Bold = True ‘设置工作表Sheet1中的行1数据为粗体
91.       ThisWorkbook.Worksheets("Sheet1").Rows(1).Hidden = True ‘将工作表Sheet1中的行1隐藏
92.       ActiveCell.EntireRow.Hidden = True ‘将当前工作表中活动单元格所在的行隐藏
93.       注:同样可用于列。
94.       ActiveSheet.Shapes.AddPicture "d:\sx.jpg", True, True, 60, 20, 400, 300 '在当前工作表中插入一张d盘中名为sx的图片
95.       ActiveSheet.Range("C1").AddComment '在当前工作表的单元格C1中添加批注
96.       Weekday(Date) '获取今天的星期,以数值表示,1-7分别对应星期日至星期六
97.       ActiveCell.Value = UCase(ActiveCell.Value) '将当前单元格中的字符转换成大写
98.       (128) IsEmpty (ActiveCell.Value) '判断活动单元格中是否有值
99.       ActiveSheet.Cells(1, 1).Interior.ColorIndex = 3 ‘将单元格的背景色设置为红色
100.    ActiveSheet.Cells(1, 1).Font.Name = "Times New Roman" ‘设置字体类型
101.    ActiveSheet.Cells(1, 1).Font.Italic = TRUE ‘设置字体为斜体
102.    ActiveSheet.Cells(1, 1).Font.ColorIndex = 3 ‘设置字体颜色为红色
103.    ActiveSheet.Cells(1, 1).Font.Size = 24 ‘设置字体大小为24磅
104.    ActiveSheet.Cells(1, 1).Font.Bold = TRUE ‘设置字体加粗
105.    ActiveSheet.Range("A1:D10").ClearFormats '清除单元格区域A1至D10中的格式
106.    ActiveSheet.Range("B8").ClearComments '删除单元格B8中的批注文字
107.    (ActiveCell.Value=Shell("C:\Windows\System32\Calc.exe", vbNormalFocus) '开启Windows计算器
108.    Range("A1:Z30").Hyperlinks.Delete ‘删除指定范围所有的链接
109.    Rows(1).Hyperlinks.Delete  ‘删除第1行中所有的链接
110.    Selection.Hyperlinks.Delete ‘删除所选区域的所有链接
111.    Columns(1).Hyperlinks.Delete ‘删除第1列中所有的链接
最常用关键字
1.          工程(Project): 是指用于创建一个应用程序的文件的集合。
2.          对象(Object): 可控制的某个东西,例如窗体和控件。
3.          窗体(Form):  应用程序的用户界面。
4.          控件(Control): 指的是各种按钮、标签、文本框等。
5.          属性(Property):是指对象的特征,如大小、标题或颜色。
6.          工作表(Worksheet):指EXCEL文件里的工作表,例如sheet1、sheet2等。
7.          模块(Module):指在VBA工程中存放独立于用户定义对象代码的容器。
8.          过程(Sub):容纳和组织代码的限定符号,一般和End Sub联用,不返回结果。
9.          函数(Function):
10.       标签(Label):用来显示文本。
11.       文本框(Textbox):用来提供给用户输入文本。
12.       命令按钮(CommandButton):用来组织和提供程序功能。
13.       列表框(ListBox):用来提供给用户选择列表中的数据。
14.       组合框(ComboBox):用来提供给用户下拉选择列表中的数据。
15.       选项按钮(OptionButton):用来提供给用户指定单项数据,一般成组使用。
16.       复选框(CheckBox):用来提供给用户指定多项数据,一般成组使用。
17.       Public:声明公共类型的数据;
18.       Private:声明私有类型的数据;
19.       Static:声明静态类型的数据;
20.       Dim:声明数据类型;如:Dim myCell As Range
21.       reDim:定义未显式声明的数组的维数和元素;
22.       Const:声明常量数据;如:Const limit As Integer = 33
23.       As:一般用于声明数据类型中的“As Type”子句;
24.       Type:声明用户自定义数据类型;
25.       Byte:字节类型;
26.       Integer:整型数值类型;
27.       Long:长整型数值类型;
28.       String:字符串类型;
29.       Boolean:逻辑类型;
30.       Single:单精度类型;
31.       Double:双精度类型;
32.       Currency:货币数值类型;
33.       Decimal:可以容纳小数的数值类型;
34.       Variant:任何数字值或字符串值;
35.       Object:对象类型;