文章目录:
- 1、excel中的VBA代码解释
- 2、关于vba代码
- 3、VBA代码小问题
- 4、VBA常用技巧代码解析
- 5、excel vba常用代码
excel中的VBA代码解释
一,Range("b2:f5").Interior.ColorIndex = xlNone
Range是区域对象,Range("b2:f5")就是指左上角为“B2”单元格,右下角为“F5”单元格这样一个连续的区域,应该是4行5列的一个区域。
Interior.ColorIndex 是指填充颜色(这里是采用ColorIndex严格说是颜色常数)
xlNone 表示清除原来的填充色。
所以这行代码就是清除区域Range("b2:f5")里的填充色。
二,Cells(x, y).Interior.ColorIndex = 3
Cells是单元格对象,Cells(x, y)就是指第x行y列对应的单元格
所以该行作用是,设置Cells(x, y)单元格的填充颜色常数为3。(具体3对应什么颜色我也背不出来)
三,DoEvents,这个都使用在反复执行用户循环的代码里。我们有体会,当执行次数很多的循环时,计算机的执行权完全被该循环控制,计算机无法执行其他操作,为此执行该语句,是让计算机可以执行其他操作。
四,If a = 1 Then Exit Sub
当 a = 1 退出过程,即结束运行该过程。
五,GoTo 10
无条件转移语句,就是转移到行号为10的那个语句。
你的这个过程如下:
Sub 随机()
Dim x As Integer
Dim y As Integer
a = 0
Randomize '初始化
10:
x = Rnd() * (5 - 2) + 2
y = Rnd() * (6 - 2) + 2
Range("b2:f5").Interior.ColorIndex = xlNone
Cells(x, y).Interior.ColorIndex = 3
DoEvents
If a = 1 Then Exit Sub
GoTo 10
End Sub
而下面是另一个过程,上面没有语句调用过它,所以无关;
Sub 结束()
a = 1
End Sub
分析你上面的过程,似乎进入死循环,因为没有使得 a = 1 的操作?
10:
。。。。。。
。。。。。。
Goto 10
从上到下,执行到Goto 10,又回到10:那一行,反复无限循环。
关于vba代码
'VBE对象是根对象,表示在VBA编辑器中存在的所有对象的最上层对象
'一 VBAproject对象: VBE编辑器中的工程
'1 VBComponents对象:表示工程中所有的部件集合,包括Excel对象、窗体、模块、类模块。
'1) CodeModule 对象:表示部件中相关的代码
'操作VBE需要做的工作
'1 设置信任
'excel2003中,工具--宏--安全性--可靠发行商,选中“信任对于...'
'excel2007和excel2010,开发工具--安全性--宏设置--选中'对...的信任'
'2 引用
Option Explicit
'1、返回模块的行数
Sub 返回模块A中的总行数()
MsgBox ThisWorkbook.VBProject.VBComponents('A').CodeModule.CountOfLines
End Sub
Sub 返回过程test中的总行数()
MsgBox ThisWorkbook.VBProject.VBComponents('A').CodeModule.ProcCountLines('test', vbext_pk_Proc)
End Sub
Sub 返回过程fe中开始行数()
MsgBox ThisWorkbook.VBProject.VBComponents('A').CodeModule.ProcBodyLine('fe', vbext_pk_Proc)
End Sub
'vbext_pk_Get 指定一个返回属性值的过程
'vbext_pk_Let 指定一个赋值给属性的过程
'vbext_pk_Set 指定一个给对象设置引用的过程
'vbext_pk_Proc 指定所有过程除了Property 过程
'2 返回模块的内容
Sub 返回过程fe中的所有代码()
Dim 开始行数, 总行数
With ThisWorkbook.VBProject.VBComponents('A').CodeModule
开始行数 = .ProcBodyLine('fe', vbext_pk_Proc)
总行数 = .ProcCountLines('fe', vbext_pk_Proc)
MsgBox .Lines(开始行数, 总行数)
End With
End Sub
Sub 返回第7行所在的过程名()
MsgBox ThisWorkbook.VBProject.VBComponents('A').CodeModule.ProcOfLine(7, vbext_pk_Proc)
End Sub
'判断模块和过程是否存在
Sub 判断A模块是否存在()
On Error Resume Next
If ThisWorkbook.VBProject.VBComponents('c') Is Nothing Then
MsgBox 'B模块没有存在'
Else
MsgBox 'B模块存在'
End If
End Sub
Sub 判断是否存在b过程()
'On Error Resume Next
Dim 开始行数
开始行数 = ThisWorkbook.VBProject.VBComponents('A').CodeModule.ProcBodyLine('B', vbext_pk_Proc)
If Err.Number = 35 Then
MsgBox '不存在B过程'
Else
MsgBox '存在B过程'
End If
End Sub
VBA代码小问题
Private Sub CommandButton1_Click()
Dim I As Long, J As Long
Dim Ar, Br
Dim S As String
If OptionButton1.Value = True Then
For I = 3 To Sheets.Count
Sheets(I).PrintOut
Next
Else
S = TextBox1.Text
S = Replace(S, ",", ",")
If InStr(S, ",") = 0 And InStr(S, "-") = 0 Then '修改的地方
Sheets(Val(S) + 2).PrintOut
Else
Ar = Split(S, ",")
For I = 0 To UBound(Ar)
If InStr(Ar(I), "-") = 0 Then
Sheets(Val(Ar(I)) + 2).PrintOut
Else
Br = Split(Ar(I), "-")
For J = Br(0) To Br(1)
Sheets(J + 2).PrintOut
Next
End If
Next
End If
End If
End
End Sub
VBA常用技巧代码解析
VBA概述:VBA是Visual Basic For Application的缩写,是VB在office中的运用。是基于Visual Basic For Windows发展而来的,VB For Windows是Microsoft于1992年推出的开发Windows应用程序的程序设计语言,由于基语法简单,易学易用,所以深受用户的欢迎。而VBA和VB For Windows大体相似。
在Office2000之前,VBA在Word,Excel,Access等Office系统软件中的运用有些有同,但是到Office2000就统一起来了。
Excel是第一个包含有VBA的应用程序,自Office2000以后,Eexel,Word,PowerPoint,Access中已经有了统一标准的宏语言VBA,其中Excel和Access的VBA最为成熟。
在Excel中VBA程序即可以存放有.xls中,也可以单独以文本形式存放。对VBA的学习,用户首先必须VB有一定的了解(不过不必很专业,毕竟经常用Excel的用户一般是办公人员,不可能是专业编程人员),然后结合宏记录器学习。因为,宏记录器可以记录宏,用户可以非常清楚了然VBA的很多知识。另外,如果不是功能很强大的VBA程序,那么用宏记录器就足够了。打开密码记录器的方法,通过“工具->宏->录制新宏”。另外,用户可能用“工具->宏->宏...”来管理宏。用“工具->宏->VB 编辑器”或Alt+F11可以打开VB编辑器,在VB编程器,可以很方便地整个VB工程进行管理,可以方便地编写VBA代码,另外,用户可以再点击Alt+F11切换到Excel窗口。
VBA的使用过程:
1、创建一个Excel文件。
2、创建一个控件,然后双击控件或是右击该控件,点击“查看代码”,就可以对该控件的某个事件,如click,keydown等。
进行编写执行代码了。创建控件的方法是,点击“视图-工具栏-控件工具箱”,打开“控件工具箱”栏,然后就可以直接拖动某个控件到Excel单元格中去。在Excel中窗口,添加的控件一般是处于执行状态的,如果要对这个控件进行编辑,除了第一次建立的时候可以对它进行属性编辑外,打开“控件工具箱”,也可以使控件处于编辑状态,如果还不行,可以再添加一个控件,然后已有的控件绝对会处于编辑状态。当然,对控件修改完毕后,别忘了删除刚才新添加的没有用的控件。在编辑状态中,你可以右击该控件,点击“属性”,那么就可以打开属性窗口,在这个窗口里,你可以很方便的对这个控件的名字,标题,大小等属性进行编辑。
3、手动或用宏记录器对该控件的某个事件进行编码。宏记录器简单易用,不过强大的功能还是必须手动编写VBA。
VBA对象介绍:
编写VBA代码的最关键在于灵活运用VBA对象,对这些VBA对象的属性或方法进行操作。另外,你也可以创建自定义函数,来对某些操作进行封装。既然是VBA,编码风格当然和VB相同,如果会VB,那么只要对VBA的对象比较了解,就可以编写功能强大的VBA程序;同样,如果不会VB,那么,只需要了解VBA的对象就够了,因为它比较简单易学。
以下分别讨论VBA各对象对其属性与方法:
在一些可以包含其他对象的窗口对象中,有几个特殊的属性,其属性值是当前活动对象,对它们,可以直接引用。
表1 一些特殊的属性
对象名 含义
ActiveWorkbook 当前工作簿,即如果你打开了几个Excel文件,那么你当然正在编辑的Excel文件即ActiveWorkbook
ActiveSheet 当前工作簿中的当前工作表,即当前编辑的Excel文件中正在编辑的工作表
ActiveCell 当前工作表中活动单元格
ActiveChart 当前工作簿中的活动图表
Selection 当前被选定的对象
下面详谈各对象及它们的属性和方法
一、Application对象
此对象指Excel应用程序的工作环境。
<一>属性
1.Caption属性
含义:Excel应用程序标题栏显示的文本。
举例:Application.caption=“船员管理系统”,如赋值Empty,则恢复Excel默认的标题栏。
2.Cursor属性
含义:Excel中鼠标的形状。
表2 Cursor属性
属性值 鼠标形状
xlDefault 缺少型值,鼠标呈缺少形状
xlWait 等待型值,鼠标呈不断翻转的沙漏形状
xlNorthwestArrow 箭头型值,鼠标呈标准箭头形状
xlIBeam 文本型值,鼠标呈“I”字形以等待用户输入文本
操作:Application.Cursor=xlWait等。
3、DisplayAlerts属性
含义:用以确定是否显示系统的应用提示和警告信息,如果不想显示,则把些属性设为false,反之亦然。
4、DisplayFormulaBar属性
含义:用以确定是否显示公式编辑栏
5、DisplayScrollBars属性
含义:用以确定是否显示Excel的滚动条
6、DisplayStatusBar属性
含义:用以确定是否显示Excel的状态栏
7、EnableCancelkey属性
含义:用以确定是否允许用户中断正在执行着的VBA程序。缺省情况下,在VBA程序执行过程中,用户按下Ctrl+Break能够中断VBA程序的执行。此时此属性即值为xlInterrupt。若要禁止中断VBA程序,由赋值为xlDisabled;若需要VBA执行过程中遇到错误进中止,由赋值为xlErrorHandler
8、ScreenUpdating属性
含义:用以确定是否显示VBA程序的中间运算结果。
9、StatusBar属性
含义:设置状态栏的文本
10、ActiveWorkbook属性
含义:如表1介绍。
11、ActiveSheet
含义:如表1介绍。
12、ActiveCell属性
含义:如表1介绍。
13、ThisWorkBook属性
含义:用以返回正在执行着VBA程序所在的工作簿对象。这不是当前工作簿。例如有多个工作簿打开时,ActiveWorkbook属性返回当前工作簿对象,ThisWorkbook返回正在运行着VBA程序所在工作簿对象。
14、PathSeparator属性
含义:返回文件文件路径分隔符“\”,该属性是一个只读属性。
举例:Dim strPath as String
strPath=Application.ThisWorkbook.PathApplication.PathSeperator
Workbooks.Open strPath"myExcel.xls"
15、UserName属性
含义:设置当前用户名称。缺省用户是由Excel选项对话框的“常规”选项卡中“用户姓名”决定的。用户可以从“工具”菜单中选择“选项”命令来打开选项并在“常规”选项卡的“用户姓名”文本框中重新设置缺省的用户名称。
<二>方法
1、Calculate方法
含义:对Excel打开的工作簿中所有的公式进行重新计算。
2、Goto方法
含义:选择工作簿中的一个Range对象或一个VBA过程,格式如下:
Application.Goto Reference,Scroll
Reference参数表示Goto方法的目的地,Scroll参数若为True,滚动条滚动以使Range对象出现在工作簿窗口左上角,为False,当前工作簿窗口不属性变化。缺省值为Galse
举例:Application.Goto Range("C3"),True
3、InputBox方法
含义:用于打开一个输入对话框,允许用户输入数据。格式如下:
Application.InputBox(prompt,title,left,top,helpFile,helpContextID,type)
prompt参数 用于设置输入对话框的提示信息
title参数 用于设置输入对话框的标题文字
default参数 用于设置输入对话框的缺省输入值
left和top参数 用于设置输入对话框左上角的坐标值
helpFile参数 用于设置输入对话框在线帮助的名称
helpContextID参数 用于设置输入对话框在线帮助主题的上下文标识号
type参数 用于设置输入对话框输入数据的类型。缺省情况下,为文本型
举例:UserValue=Application.InputBox("请输入数据","数据输入",Type:=7)
4、Onkey方法
含义:按下某个或组合键时执行一段VBA代码。自己尝试一下就知道了,也可看一下VB编辑器的提示(即输入Applicatio.Onkey后,VB编辑器弹出的下拉提示。
二、Workbooks对象集
当前所有打开的工作簿对象的集合
一属性
1、Count属性,只读,返回Excel打开的工作簿数
二方法
1、Add方法,向工作簿对象集中一个新的工作簿,相当于“文件-新建”命令。格式如下:
Workbooks.Add Template
2、Open方法,打开一个指定的工作簿。格式看一下VBA编辑器中的提示就行,太累了,不想写得这么全。
3、Close方法,关闭一个工作簿文件
三、Workbook对象
代表一个独立的工作簿文件
一属性
1、ActiveSheet属性,返回当前工作簿中的活动工作表对象
2、Author属性,返回或设定工作簿的作者姓名,由此确定工作簿的所有者
3、Saved属性,用于瓢工作簿文件是否做过修改。
二方法
1、Activate方法,用于霜一个工作簿为当前活动工作簿,如,Workbooks("myOffice.xls").Activate
2、Close方法,用于关闭指定的工作簿
3、Save方法,用于保存指定的工作簿
4、SaveAs方法,用于另存为指定的工作簿
四、Worksheets对象集
代表当前工作簿所有的工作表(Worksheet)的集合。
一属性
1、Count属性,返回当前工作簿中的的工作表的数量
二方法
1、Add方法,向工作表对象集中添加一个新的工作表对象,格式如下:
Worksheets.Add Before,After,Count,Type
Before和After参数指哪一个工作表之前或之后插入新工作表。取值为Worksheet
如:Worksheets.Add Before:=Worksheets("Sheet2"),则相当于在Sheet2工作表之前插入了一个新的工作表
五、Worksheet对象
代表工作簿一个独立的工作表。
获取某个工作表,可以用Worksheets("办公费用"),也可以用Worksheets(3)之类的语句
一属性
1、Name属性,设置或返回工作表对象的名称
2、Visible属性,确定是否隐藏某个工作表
二方法
1、Calculate法,对指定的工作表中的所有公式进行重新计算
2、Copy方法,用于复制指定的工作表,并放置在指定的位置,实际是一个复制与粘贴并重的函数,
格式:Worksheet-Object.Copy Before,After
如Worksheet("Sheet2").Copy After:=Worksheets("办公费用"),相当于把Sheet2工作表复制,并把它放置在名为“办公费用”的工作表之后
3、Move方法,移动指定的工作表并放置在指定的位置,用户同Copy方法,区别只天于复制与剪切之不同
4、Delete方法,无参数删除指定的工作表,如Worksheet("Sheet2").Delete
5、Cell方法,获取指定工作表指定行列的某个单元格
格式:Worksheet-Object.Cells(Row,Col),Row,Col为整型,行列值都从1开始
如Worksheet("Sheet2").Cell(1,1),相当于获取Sheet2工作表的第一行第一列的单元格
五、Range对象
代表一个半桥区域,可以由多个半桥组成,也可是由一个单元格组成。
引用单元格可用以下两种方法:
一是使用单元格引用,如Range("A1"),Range("A1:C3")
二是使用单元格区域名称,如Range("myRange")。
一属性
1、FormulaR1C1属性,为指定的单元格或单元格区域建立和存储公式,
如Range("C5").FormulaR1C1="=SUM(R[-4]C:R[-1]C)"
2、Value属性,为指定的单元格或单元格区域赋值,如为多个单元格,则都赋为同样的值
3、Cell属性,以指定的单元格为苦战来描述被引用的单元格,把指定的单元格视为第1行第1列
格式:Range-Object.Cells(Row,Col)
4、Offset,以指定的单元格为苦战来描述被引用的单元格,把指定的单元格视为第0行第0列
格式:Range-Object.Cells(Row,Col)
5、Name属性,返回或设定指定的单元格或单元格区域的名称,然后在VBA中,可以直接用名称为引用它
6、Count属性,返回指定的单元格区域中包含的单元格的数目,只读
7、CurrentRegion属性,返回以某个单元格为基点的存储有数据的一个连结的单元格区域
二方法
1、Select方法方法,用于选择指定的单元格区域,执行后,该单元格区域左上角的第一个单元格成为活动单元格
如Range("A1:C3").Select,Range("A1:C3,D5:E6,A8:E8).Select
2、Activate方法,用于选择指定的单元格并指定其成为活动单元格,当然只有该单元格区域左上角的第一个单元格成为活动单元格。
3、AutoFit方法,调整选定的单元格区域所在行和列的行高与列宽,使其行高与列宽自动设定的最佳的高度与宽度。
如:Range("A4").CurrentRegion.Select
Selection.Rows.AutoFit
4、Clear方法,清除指定的单元格区域的内容,格式和批注,相当于“编辑->清除->全部”
如:Range("A4:C5").Clear
5、ClearContents方法,清除指定的单元格区域的内容,相当于“编辑->清除->内容”
6、ClearFormats方法,清除指定的单元格区域的内容,相当于“编辑->清除->格式”
7、ClearComments和ClearNotes方法,清除指定的单元格区域的内容,相当于“编辑->清除->批注”
8、Copy方法,将指定单元格区域中的数据库复制到剪贴板或指定的目的单元格区域中
9、Cut方法,将指定单元格区域中的数据库剪切到剪贴板或指定的目的单元格区域中
10、PasteSpecial方法,用于将剪贴板中复制或剪切下来的单元格区域中的数据库有选择地粘贴到指定的目的单元格区域中
格式:Range-Object.PasteSpecial Paste,Operation,ShipBlanks,Transpose
Paste参数规定了选择体积类型的数据进行粘贴,如公式,内容,批注等,具体取值可参考VB编辑器中的提示
excel vba常用代码
Visual Basic for Applications(简称VBA)是新一代标准宏语言,是基于Visual Basic for Windows 发展而来的。它与传统的宏语言不同,传统的宏语言不具有高级语言的特征,没有面向对象的程序设计概念和方法。而VBA 提供了面向对象的程序设计方法,提供了相当完整的程序设计语言。VBA 易于学习掌握,可以使用宏记录器记录用户的各种操作并将其转换为VBA 程序代码。这样用户可以容易地将日常工作转换为VBA 程序代码,使工作自动化。 [1]
数据类型
基本数据类型
即Primary Type Data,下述列表的括号内为字节数:
Byte (1):无符号数类型,取值范围0-255
Boolean (2)
Integer(2)
Long (4)
Single (4)
Double (8)
Currency (8)
Decimal (14)
Date (8)
String
Object (4)
Variant (根据分配确定) [2]
自定义的数据类型
相当于C语言的struct,例如: [2]
Type 自定义类型名 元素名 As 类型 … [元素名 As 类型] End Type
数组
Option Base 0 :数组索引值从0开始 [2]
Option Base 1 :数组索引值从1开始
Dim MyArray(10) :声明一个数组变量,10是最大的可用的数组索引值
MyArray(5) = 101 :给数组的元素赋值
Dim Data(10,5) :声明一个二维数组变量
Data(1,1) = "A001" :给数组元素赋值
Dim cArr(-11 To 20, 1 To 3) As String :声明一个数组,定义数组索引值的上下界
Dim dArr() As String :声明动态数组
ReDim dArr(0 To 5, 1 To 2) :改变动态数组的尺寸默认把原数据清除。如果保留原来的数据,必须加上参数
Preserve:使用Preserve参数时只能改变最后一位的大小
If UBound(vTemp) = -1 Then:判断数组变量vTemp是否为空数组
End If Erase MyArrar, Data Erase语句清除数组元素,释放变量占用的空间 [2]
常量
编辑
系统定义常量
系统定义常量有3个:True、False和Null。 [4]
固有常量
固有常量是编程时引用的对象库定义的常量。所有固有常量都可以在宏或VBA代码中使用。通常,固有常量通过前两个字母来指明定义该常量。来自VB库的常量则以“vb”开头。来自Access的常量以“ac”开头。可以使用对象浏览器来查看所有对象库中的固有常量列表。 [4]
在VBA中,常量的数据类型有整型、长整型、单精度型、双精度型、字节型、货币型、字符型、日期型和逻辑型。一个整型数据就是一个整型常量,一个长整型数据就是一个长整型常量。例如,12%、-1%是整型常量,32768、10000000是长整型常量,-2.5 1、3.14是单精度实型常量,3.1415926#是双精度实型常量,China、Shanghai是字符型常量,#07/13/2001 11:45PM#是日期常量,由符号 “ # ” 将字符括起来。 [4]
符号常量
可以自行定义的常量即符号常量,必须先定义,后使用。可见,需要声明的常量都是符号常量。 [4]
基本语法格式:
1 [ Publicr/ Private] Const 常量名[As 类型]=表达式
如:Global Const 符号常量名称 = 常量值 [4]
语句功能:
定义一个符号常量,并将指定表达式的值赋给符号常量。 [4]
语句说明如下: [4]
1)“常量名”指定符号常量的名字。符号常量名可以由字母、数字和下画线组成,但只能以字母开头,不能含有空格。 [4]
2)“表达式”指定符号常量的值。该表达式通常由数值型、字符型、逻辑型或日期型数据以及各种运算符组成,但在表达式中不能出现变量和函数。 [4]
3) public用来表示这个常量的作用范围是整个数据库的所有模块。 [4]
4) private则表示这个常量只在使用该声明常量语句的模块中起作用。 [4]
说明:
1)除用户定义的符号常量外,VBA还提供了许多符号常量,我们可以直接使用。 [4]
2)对数码比较长,并且在程序中多次使用的常量,通常使用符号常量代替。运行程序时,系统自动把程序中的所有符号常量换为赋给它的值。 [4]
变量
编辑
与常量一样,变量也是一块内存空间,用于保存程序运行过程中可能变化的数据。变量的名称是用户定义的一个标识符。 [5]
在代码中需要使用该变量时,只需引用相应的标识符即可,而不用管变量当前的值具体是什么。 [5]
声明
与用户自定义的常量相似,变量在使用之前都需要声明,在VBA中声明变量的语法格式有以下几种: [5]
关键字变量名 AS 数据类型
关键字变量1,变量2 ... 变量n AS 数据类型
关键字变量1 AS 数据类型,变量2 As 数据类型, ... ,变量n AS数据类型
在第二种语法格式中, “变量n”的数据类型为AS关键字后定义的数据类型,而“变量1”、“变量2”、…的数据类型为变体型。 [5]
在VBA中,可用Dim、Private、Public和Static这4个关键字来声明变量,使用不同关键字声明的变量其含义也有所不同。 [5]
◆ 利用Dim关键字声明变量:Dim关键字主要用来在内存中分配一块空间,并为该空间命名,是VBA中声明变量最常用的关键字。使用Dim关键字声明的变量只能在当前过程或模块中使用。 [5]
◆ 利用Private关键字声明变量:Private关键字用于在类模块中声明一个私有变量,它只能在当前的类模块中使用。当定义变量的位置同处于类模块中时,其使用效果与使用Dim关键字定义的变量相同。 [5]
◆ 利用Public关键字声明变量:利用Public关键字声明的变量可以在程序的任何地方调用,而与声明变量的位置无关。 [5]
◆ 利用Static关键字声明变量:Static关键字用于声明静态变量,即变量的值在整个代码运行期间都能被保留。 [5]
赋值
变量在使用时还需要对其进行赋值。在VBA中对变量进行赋值可通过 “ = ” 符号或 “ Set ” 关键字进行。通过 “ = ” 符号对变量赋值的语法格式有以下几种。 [5]
变量名=数据
变量1=变量2 运算符 数据
变量1=变量2 运算符 变量3 … 运算符 变量n
如果在定义变量时指定了变量的数据类型,则为变量所赋的值也必须是该数据类型的值。如果变量定义为Integer类型,而在赋值时却给了变量一个String类型的数据,则在编译运行的过程中将弹出错误弹框。 [5]
运算符
编辑
运算符是在程序中执行计算功能的某些特殊符号,它是程序代码的重要组成部分。在程序代码中,运算符不能单独使用,必须与其操作数共同组成表达式后才具有运算意义。VBA中的运算符包含算术运算符、连接运算符、比较运算符和逻辑运算符等。 [4]
算术运算符
算术运算符主要用于执行四则运算,仅用算术运算符连接起来的表达式称为算术表达式。算术运算符及其作用与示例如表所示。 [5]
例子
名称
结果
-$a
取反
$a 的负值。
$a + $b
加法
$a 和 $b 的和。
$a - $b
减法
$a 和 $b 的差。
$a * $b
乘法
$a 和 $b 的积。
$a / $b
除法
$a 除以 $b 的商,允许小数。
$a \ $b 除法 $a 除以 $b 的商,结果取整。
$a Mod $b
取余
$a 除以 $b 的余数
注意:
在执行算术运算时,运算符两侧操作的数据类型必须相同,否则会出现“类型不匹配”的错误提示。当“+”运算符左右两侧都是字符串类型的操作数时,执行的是连接运算,如表达式“"Pass+"word"的计算结果为字符串“ PassWord ”。 [5]
连接运算符
连接运算符的作用是将运算符两侧的操作数连接成一个数,其操作数的数据类型通常都为String类型。VBA中的连接运算符有“”和“+”两种,由于使用“+”执行连接运算时,容易与加法运算混淆,所以通常都采用“”进行连接运算。 [5]
比较运算符
比较运算符可以对运算符两侧的操作数执行比较运算,其返回结果为Boolean类型的True或False。比较运算符的操作数通常为具体的数值,当操作数为字符串或其他符号时,是根据该符号的ASCII码进行比较的。VBA中的比较运算符及其作用与示例如表所示。 [5]
例子
名称
结果
$a = $b
等于
TRUE,如果 $a 等于 $b。
$a $b
不等
TRUE,如果 $a 不等于 $b。
$a $b
小于
TRUE,如果 $a 严格小于 $b。
$a $b
大于
TRUE,如果 $a 严格大于 $b。
$a = $b
小于等于
TRUE,如果 $a 小于或者等于 $b。
$a = $b
大于等于
TRUE,如果 $a 大于或者等于 $b。
逻辑运算符
逻辑运算符用于对运算符两侧的操作数执行逻辑运算,参与逻辑运算的操作数本身可以是逻辑表达式(表达式的最终结果为True或 False),也可以是算术表达式(表达式的最终返回值为0或非0)。 [5]
在逻辑运算中,数值0与逻辑值 False相同,表示逻辑假;非0数值与True相同,表示逻辑真。逻辑运算符及其含义与示例如表所示。 [5]
例子
名称
结果
$a and $b
And(逻辑与)
TRUE,如果 $a 与 $b 都为TRUE。
$a or $b
Or(逻辑或)
TRUE,如果 $a 或 $b 任一为TRUE。
$a xor $b
Xor(逻辑异或)
TRUE,如果 $a 或 $b 同位相异。
Not(12)
Not(逻辑非)
TRUE。
(12) Eqv (12)
两个操作数同为假,返回False;两个操作数同为真,返回True;两个操作数一真一假,返回False
TRUE。
21 Imp 35
运算符左右同为真,返回True;左右同为假,返回True;左真右假,回返 False;左假右真,返回True
TRUE。
语法结构
编辑
if 语句
1 if 条件1 then 语句1elseif 条件2 then 语句2elseif ... ...else 语句nend if
Select Case 语句
1 Select Case 表达式 Case 表达式列表1 语句1 Case 表达式列表2 语句2 ... Case 表达式列表n 语句nEnd Select
其中的表达式列表可以为: [5]
表达式 例: "A"
用逗号分隔的一组枚举表达式例:2,4,6,8
表达式1 To 表达式2 例:60 To 100
Is 关系运算符表达式 例:Is 60
Do...Loop 语句
1 Do While或Until 条件 语句块1 Exit Do 语句块2Loop
For...Next语句
1 Do 语句块1 Exit Do 语句块2Loop While或Until 条件
For Each … Next语句
1 For 循环控制变量=初值To 终值Step 步长 语句块 ‘Exit For语句可以跳出循环体Next
跳出本次循环的continue语句
1 For 循环控制变量=初值 To 终值 Step 步长 Do '用于模拟continue 语句块 If 条件 Then Exit Do '用于模拟continue 语句块 Loop While False '用于模拟continue Next
With语句
1 With 对象引用 语句块End With
On Error语句
1 On Error Goto 出错处理语句的label '跳转到出错处理语句
或
1 On Error Resume Next '遇到错误,不管错误,继续往下执行
具有控制作用的函数
If(条件式,表达式1,表达式2) [5]
Switch(条件式1,表达式1,[条件式2,表达式2[,...,条件式n,表达式n]])
Choose(索引式,选项1[,选项2,...[,选项n]]) '这是基于1的索引
其他语句
编辑
注释语句
使用REM或者单引号开始的行。 [6]
语句的连写与续行
如果一行包括多条语句,用冒号分割各个语句。跨多行的语句,在行末用“空格加下划线”表示续行 [6] 。
过程与函数
编辑
12 Sub 过程名(参数表) 语句块 Exit Sub 语句块End Sub
1 Function 函数名(参数表) As Type 语句块 函数名=表达式 Exit FunctionEnd Function
可以是Private、Public、Friend、Static等修饰。 [6]
调用函数/过程时,可以加括号或者不加括号。如果调用表达式作为一行的一部分,那么必须用参数,例如函数调用的返回值赋给变量。 调用过程时, 可以使用/不使用call关键字。使用call语句调用过程,如果无参数,则不加括号;如果有参数,必须加括号。如果调用时用括号包住单个参数,则该参数强行按值传递。需要特别注意,不用call不加括号的调用,形参与实参是传值(passed by value)而不是传引用(passed by reference),这会导致一些对象的方法调用失败。例如: [6]
1 Dim cn As ADODB.Connection Set cn = CurrentProject.Connection Dim rs As New ADODB.Recordset rs.Open "SELECT * FROM myTable" , cn Dim ExcelApp As New Excel.Application Dim ExcelWst As Worksheet Set ExcelWst = ExcelApp.Workbooks.Add.Worksheets(1) ExcelWst.Range("A2").CopyFromRecordset(rs) '失败,无法执行该行 ExcelWst.Range("A2").CopyFromRecordset rs '可成功执行该行
常用内置函数
编辑
VBA的常用内置函数: [5]
MsgBox
InputBox
舍入函数:Fix 向0取整,Int向下取整, Round四舍五入
Rnd: 返回0-1内的单精度随机数
字符串函数: [5]
Filter:对字符串的一维数组的过滤
InStr([Start, ]Str1,Str2[, Compare])与InStrRev: 查找子串
Len:字符串长度
Join:连接一维数组中的所有子字符串
Left,Right,Mid: 截取子字符串
Space(数值) :生成空格字符串
Ucase,Lcase:大小写转换函数
Ltrim, Rtrim,Trim :删除首尾空格
Replace
Split:分割一个字符串成为一维数组
StrComp:字符串比较
StrConv:字符串转换
String(number, character):制定字符重复若干次
StrReverse
日期/时间有关函数: [5]
Year, Month, Day, WeekDay,Hour,Minute,Second: 截取日期时间分量
DateAdd: 日期/时间增量函数
DateDiff(间隔类型,日期1,日期2[,W1][,W2])日期/时间的距离函数
DatePart(分割类型,日期[,w1][,w2])时间分割函数
DateSerial(表达式1,表达式2,表达式3) 合成日期;DateValue(“字符串表达式”)返回日期;
Date,Time,Now,Timer: 返回日期时间
DateValue
TimeSerial:由时间序列得到时间对象
TimeValue:由时间字符串得到时间对象
Weekday:获得日期的周几
WeekdayName
转换函数:CBool、CByte、CCur、 CDate、 CDbl、CDec、CInt、 CLng、CLngLng、CLngPtr、 [5] CSng、CStr、CVar、CVErr、Asc(字符串表达式)返回第一个字符的Ascii编码值、Chr(ASCII码)返回字符、Hex、Oct、Str(数值表达式)返回字符串、Val(string)、Format、FormatCurrency、FormatDateTime、FormatNumber、FormatPercent、MonthName。
Nz(表达式或字段属性值[,规定值])如果是空,则返回0或者""或者函数的第二个参数值 [5]
验证函数:isNumeric、isDate、isNull、isEmpty、IsArray、IsError、IsMissing、IsObject [5]
数学函数:Abs、Sqr、Tan、Atn(即atan)、Sin、Cos、Exp(e为基的指数)、Log自然对数 [5]
Array:构造一个Array对象 [5]
CallByName: get or set a property, or invoke a method at run time using a string name. [5]
控制流:Choose:类似于C语言的select语句、If相当于IF-ELSE语句、Switch [5]
Command:获取命令行参数 [5]
CreateObject:创建ActiveX对象
CurDir:返回指定驱动器的当前工作路径 [5]
由基本数学函数导出的函数:Sec、Cosec、Cotangent、Cotan、Arcsin、Arccos、Arcsec、Arccosec、Arccotan、HSin、HCos、HTan、HSec、HCosec、HCotan、HArcsin、HArccos、HArctan、HArcsec、HArccosec、HArccotan、LogN
DoEvents:暂时把CPU控制权交回给系统 [5]
Environ:返回环境变量的值 [5]
文件操作: [5]
Dir:返回满足条件的所有文件、目录的名字
EOF
FileAttr
FileDateTime
FileLen
FreeFile Function
GetAttr:返回文件、目录的属性值
Input:读取文件
Loc:文件指针位置
LOF:文件打开时的指针位置
Seek:文件指针定位
Spc:使用Print做position output
Tab:用于Print函数
Error:错误号对应的错误消息 [5]
Windows Registry中的数据:GetAllSettings、SaveSetting、DeleteSetting、GetSetting [5]
GetObject:ActiveX组建的引用 [5]
IMEStatus:返回当前Input Method Editor (IME) [5]
Macintosh平台:MacID、MacScript [5]
金融函数: [5]
DDB:使用double-declining balance计算贬值
FV:计算固定利率的年金
IPmt:计算利率
IRR:计算利率
MIRR:计算利率
NPer:计算周期数
NPV:计算net present value
Pmt:计算支付数
PPmt:计算本金支付数
PV:计算present value
Rate:利息率
SLN:straight-line depreciation
SYD:计算sum-of-years' digits depreciation
Partition:返回字符串,表示一个数值名字落在各个range内。常用于SQL select语句 [5]
QBColor:颜色值 [5]
RGB:颜色值 [5]
TypeName:得到变量的类型名 [5]
VarType:得到变量的类型数 [5]
舍五入Rnd: 返回0-1内的单精度随机数字符串函数: [5]Filter:对字符串的一维数组的过滤InStr([Start, ]Str1,Str2[, Compare])与I
thEnd SubSub 返回第7行所在的过程名()MsgBox ThisWorkbook.VBProject.VBComponents('A').CodeMo
ntents方法,清除指定的单元格区域的内容,相当于“编辑->清除->内容” 6、ClearFormats方法,清除指定的单元格区域的内容,相当于“编辑->清除->格式” 7、ClearComments和ClearNotes方法,清除指定的单元格区域的内容,相当于“编辑->清除
hisWorkbook.VBProject.VBComponents('c') Is Nothing ThenMsgBox 'B模块没有存在'ElseMsgBox 'B模块存在'End IfEnd SubSub 判断是否存在b过程()'On Er
r = 35 ThenMsgBox '不存在B过程'ElseMsgBox '存在B过程'End IfEnd SubVBA代码小问题Private Sub CommandButton1_Click() Dim I As Long, J As Long