- VBA Tutorial
- VBA - Home
- VBA - Overview
- VBA - Excel Macros
- VBA - Excel Terms
- VBA - Macro Comments
- VBA - Message Box
- VBA - Input Box
- VBA - Variables
- VBA - Constants
- VBA - Operators
- VBA - Decisions
- VBA - Loops
- VBA - Strings
- VBA - Date and Time
- VBA - Arrays
- VBA - Functions
- VBA - Sub Procedure
- VBA - Events
- VBA - Error Handling
- VBA - Excel Objects
- VBA - Text Files
- VBA - Programming Charts
- VBA - Userforms
- VBA Useful Resources
- VBA - Quick Guide
- VBA - Useful Resources
- VBA - Discussion
VBA - 快速指南
VBA - 概述
VBA 代表Visual Basic for A applications,是一种来自 Microsoft 的事件驱动编程语言,目前主要用于 Microsoft Office 应用程序,例如 MSExcel、MS-Word 和 MS-Access 。
它帮助技术人员构建定制的应用程序和解决方案,以增强这些应用程序的功能。此功能的优点是您不需要在我们的 PC 上安装 Visual Basic,但是安装 Office 将隐式帮助实现该目的。
您可以在所有 Office 版本(从 MS-Office 97 到 MS-Office 2013)以及任何可用的最新版本中使用 VBA。在VBA中,Excel VBA最为流行。使用 VBA 的优点是您可以使用线性编程在 MS Excel 中构建非常强大的工具。
VBA的应用
您可能想知道为什么要在 Excel 中使用 VBA,因为 MS-Excel 本身提供了大量内置函数。MS-Excel 仅提供基本的内置函数,可能不足以执行复杂的计算。在这种情况下,VBA 就成为最明显的解决方案。
例如,使用 Excel 的内置公式很难计算每月还款额。相反,为此类计算编写 VBA 程序是很容易的。
访问 VBA 编辑器
在 Excel 窗口中,按“ALT+F11”。将打开一个 VBA 窗口,如以下屏幕截图所示。
VBA - Excel 宏
在本章中,您将学习如何逐步编写一个简单的宏。
步骤 1 - 首先,在 Excel 20XX 中启用“开发人员”菜单。要执行相同的操作,请单击文件 → 选项。
步骤 2 - 单击“自定义功能区”选项卡并选中“开发人员”。单击“确定”。
步骤 3 - “开发人员”功能区出现在菜单栏中。
步骤 4 - 单击“Visual Basic”按钮打开 VBA 编辑器。
步骤 5 - 通过添加按钮开始编写脚本。单击插入 → 选择按钮。
步骤 6 - 右键单击并选择“属性”。
步骤 7 - 编辑名称和标题,如以下屏幕截图所示。
步骤 8 - 现在双击按钮,将显示子过程大纲,如以下屏幕截图所示。
步骤 9 - 只需添加一条消息即可开始编码。
Private Sub say_helloworld_Click() MsgBox "Hi" End Sub
步骤 10 - 单击按钮执行子过程。子过程的输出如下图所示。确保您已打开设计模式。如果未打开,只需单击它即可将其打开。
注意- 在后面的章节中,我们将演示如何使用一个简单的按钮,如步骤 1 到 10 中所述。因此,彻底理解本章非常重要。
VBA - Excel 术语
在本章中,您将熟悉常用的 Excel VBA 术语。这些术语将在进一步的模块中使用,因此理解其中每一个术语都很重要。
模块
模块是编写代码的区域。这是一本新的工作簿,因此没有任何模块。
要插入模块,请导航至插入 → 模块。一旦插入模块,就会创建“module1”。
在模块中,我们可以编写VBA代码,并且代码是在过程中编写的。过程/子过程是一系列指示要执行的操作的 VBA 语句。
程序
过程是一组作为整体执行的语句,它指示 Excel 如何执行特定任务。执行的任务可以是非常简单或非常复杂的任务。然而,将复杂的过程分解为较小的过程是一个很好的做法。
过程的两种主要类型是子过程和函数。
功能
函数是一组可重用代码,可以在程序中的任何位置调用。这消除了一遍又一遍地编写相同代码的需要。这有助于程序员将大程序划分为许多小的且可管理的函数。
除了内置函数之外,VBA 还允许编写用户定义的函数,并且在Function和End Function之间编写语句。
子程序
子过程的工作方式与函数类似。虽然子过程不返回值,但函数可能返回值,也可能不返回值。子过程无需 call 关键字即可调用。Sub 过程始终包含在Sub和End Sub语句内。
VBA - 宏注释
注释用于记录程序逻辑和用户信息,其他程序员将来可以使用这些信息无缝地处理相同的代码。
它包括诸如开发者、修改者之类的信息,并且还可以包括合并的逻辑。执行时解释器会忽略注释。
VBA 中的注释由两种方法表示。
任何以单引号 (') 开头的语句都被视为注释。下面是一个例子。
' This Script is invoked after successful login ' Written by : TutorialsPoint ' Return Value : True / False
以关键字“REM”开头的任何语句。下面是一个例子。
REM This Script is written to Validate the Entered Input REM Modified by : Tutorials point/user2
VBA - 消息框
MsgBox函数显示一个消息框并等待用户单击按钮,然后根据用户单击的按钮执行操作。
句法
MsgBox(prompt[,buttons][,title][,helpfile,context])
参数说明
提示- 必需的参数。在对话框中显示为消息的字符串。提示的最大长度约为 1024 个字符。如果消息超出一行,则可以在每行之间使用回车符 (Chr(13)) 或换行符 (Chr(10)) 分隔行。
按钮- 可选参数。一个数字表达式,指定要显示的按钮类型、要使用的图标样式、默认按钮的标识以及消息框的形式。如果留空,则按钮的默认值为 0。
标题- 可选参数。显示在对话框标题栏中的字符串表达式。如果标题留空,则应用程序名称将放置在标题栏中。
帮助文件- 可选参数。一个字符串表达式,标识用于为对话框提供上下文相关帮助的帮助文件。
上下文- 可选参数。一个数字表达式,用于标识帮助作者分配给相应帮助主题的帮助上下文编号。如果提供了上下文,则还必须提供帮助文件。
Buttons参数可以采用以下任何值 -
0 vbOKOnly - 仅显示“确定”按钮。
1 vbOKCancel - 显示“确定”和“取消”按钮。
2 vbAbortRetryIgnore - 显示中止、重试和忽略按钮。
3 vbYesNoCancel - 显示“是”、“否”和“取消”按钮。
4 vbYesNo - 显示是和否按钮。
5 vbRetryCancel - 显示重试和取消按钮。
16 vbCritical - 显示严重消息图标。
32 vbQuestion - 显示警告查询图标。
48 vbExclamation - 显示警告消息图标。
64 vbInformation - 显示信息消息图标。
0 vbDefaultButton1 - 第一个按钮是默认按钮。
256 vbDefaultButton2 - 第二个按钮是默认按钮。
512 vbDefaultButton3 - 第三个按钮是默认按钮。
768 vbDefaultButton4 - 第四个按钮是默认的。
0 vbApplicationModal 应用程序模式 - 在用户响应消息框之前,当前应用程序将无法工作。
4096 vbSystemModal 系统模态 - 在用户响应消息框之前,所有应用程序都无法工作。
上述值在逻辑上分为四组:第一组(0 到 5)表示要在消息框中显示的按钮。第二组(16,32,48,64)描述要显示的图标的样式,第三组(0,256,512,768)表示哪个按钮必须是默认的,第四组(0,4096) ) 确定消息框的形态。
返回值
MsgBox 函数可以返回以下值之一,这些值可用于标识用户在消息框中单击的按钮。
- 1 - vbOK - 单击“确定”
- 2 - vbCancel - 单击取消
- 3 - vbAbort - 单击中止
- 4 - vbRetry - 单击重试
- 5 - vbIgnore - 单击忽略
- 6 - vbYes - 单击“是”
- 7 - vbNo - 没有被点击
例子
Function MessageBox_Demo() 'Message Box with just prompt message MsgBox("Welcome") 'Message Box with title, yes no and cancel Butttons int a = MsgBox("Do you like blue color?",3,"Choose options") ' Assume that you press No Button msgbox ("The Value of a is " & a) End Function
输出
步骤 1 - 可以通过单击 VBA 窗口上的“运行”按钮或从 Excel 工作表调用该函数来执行上述函数,如下面的屏幕截图所示。
步骤 2 - 显示一个简单消息框,其中包含消息“欢迎”和“确定”按钮
步骤 3 - 单击“确定”后,将显示另一个对话框,其中包含一条消息以及“是、否和取消”按钮。
步骤 4 - 单击“否”按钮后,该按钮 (7) 的值将存储为整数,并以消息框的形式向用户显示,如以下屏幕截图所示。使用这个值,可以了解用户点击了哪个按钮。
VBA-输入框
InputBox函数提示用户输入值。输入值后,如果用户单击“确定”按钮或按键盘上的 ENTER 键,InputBox 函数将返回文本框中的文本。如果用户单击“取消”按钮,该函数将返回一个空字符串(“”)。
句法
InputBox(prompt[,title][,default][,xpos][,ypos][,helpfile,context])
参数说明
提示- 必需的参数。在对话框中显示为消息的字符串。提示的最大长度约为 1024 个字符。如果消息超出一行,则可以在每行之间使用回车符 (Chr(13)) 或换行符 (Chr(10)) 分隔行。
标题- 可选参数。显示在对话框标题栏中的字符串表达式。如果标题留空,则应用程序名称将放置在标题栏中。
默认值- 可选参数。用户希望显示的文本框中的默认文本。
XPos - 可选参数。X轴的位置代表提示距离屏幕左侧的水平距离。如果留空,则输入框水平居中。
YPos - 可选参数。Y轴的位置表示提示距离屏幕左侧的垂直距离。如果留空,则输入框垂直居中。
帮助文件- 可选参数。一个字符串表达式,标识用于为对话框提供上下文相关帮助的帮助文件。
context - 可选参数。一个数字表达式,用于标识帮助作者分配给相应帮助主题的帮助上下文编号。如果提供了上下文,则还必须提供帮助文件。
例子
让我们通过在运行时借助两个输入框(一个用于长度,一个用于宽度)从用户获取值来计算矩形的面积。
Function findArea() Dim Length As Double Dim Width As Double Length = InputBox("Enter Length ", "Enter a Number") Width = InputBox("Enter Width", "Enter a Number") findArea = Length * Width End Function
输出
步骤 1 - 要执行相同的操作,请使用函数名称进行调用,然后按 Enter 键,如以下屏幕截图所示。
步骤 2 - 执行后,将显示第一个输入框(长度)。在输入框中输入一个值。
步骤 3 - 输入第一个值后,显示第二个输入框(宽度)。
步骤 4 - 输入第二个数字后,单击“确定”按钮。该区域显示如下图所示。
VBA - 变量
变量是一个命名的内存位置,用于保存在脚本执行期间可以更改的值。以下是命名变量的基本规则。
您必须使用字母作为第一个字符。
名称中不能使用空格、句点 (.)、感叹号 (!) 或字符 @、&、$、#。
名称长度不能超过 255 个字符。
不能使用 Visual Basic 保留关键字作为变量名。
句法
在VBA中,您需要在使用变量之前声明它们。
Dim <<variable_name>> As <<variable_type>>
数据类型
VBA数据类型有很多,可分为两大类,即数值数据类型和非数值数据类型。
数字数据类型
下表显示了数值数据类型和允许的值范围。
类型 | 值范围 |
---|---|
字节 | 0 至 255 |
整数 | -32,768 至 32,767 |
长的 | -2,147,483,648 至 2,147,483,648 |
单身的 |
-3.402823E+38 至 -1.401298E-45(负值) 1.401298E-45 到 3.402823E+38(正值)。 |
双倍的 |
-1.79769313486232e+308 至 -4.94065645841247E-324(负值) 正值从 4.94065645841247E-324 到 1.79769313486232e+308。 |
货币 | -922,337,203,685,477.5808 至 922,337,203,685,477.5807 |
十进制 |
如果不使用小数,则为 +/- 79,228,162,514,264,337,593,543,950,335 +/- 7.9228162514264337593543950335(28 位小数)。 |
非数字数据类型
下表显示非数字数据类型和允许的值范围。
类型 | 值范围 |
---|---|
字符串(固定长度) | 1 到 65,400 个字符 |
字符串(可变长度) | 0 到 20 亿个字符 |
日期 | 100年1月1日至9999年12月31日 |
布尔值 | 对或错 |
目的 | 任何嵌入对象 |
变体(数字) | 任何大于 double 的值 |
变体(文本) | 与变长字符串相同 |
例子
让我们创建一个按钮并将其命名为“Variables_demo”来演示变量的使用。
Private Sub say_helloworld_Click() Dim password As String password = "Admin#1" Dim num As Integer num = 1234 Dim BirthDay As Date BirthDay = DateValue("30 / 10 / 2020") MsgBox "Passowrd is " & password & Chr(10) & "Value of num is " & num & Chr(10) & "Value of Birthday is " & BirthDay End Sub
输出
执行脚本后,输出将如以下屏幕截图所示。
VBA - 常量
常量是一个命名的内存位置,用于保存在脚本执行期间无法更改的值。如果用户尝试更改常量值,则脚本执行会出现错误。常量的声明方式与变量的声明方式相同。
以下是常量的命名规则。
您必须使用字母作为第一个字符。
名称中不能使用空格、句点 (.)、感叹号 (!) 或字符 @、&、$、#。
名称长度不能超过 255 个字符。
不能使用 Visual Basic 保留关键字作为变量名。
句法
在VBA中,我们需要给声明的常量赋值。如果我们尝试更改常量的值,则会引发错误。
Const <<constant_name>> As <<constant_type>> = <<constant_value>>
例子
让我们创建一个按钮“Constant_demo”来演示如何使用常量。
Private Sub Constant_demo_Click() Const MyInteger As Integer = 42 Const myDate As Date = #2/2/2020# Const myDay As String = "Sunday" MsgBox "Integer is " & MyInteger & Chr(10) & "myDate is " & myDate & Chr(10) & "myDay is " & myDay End Sub
输出
执行脚本后,将显示输出,如以下屏幕截图所示。
VBA - 运算符
可以使用简单的表达式来定义运算符- 4 + 5 等于 9。这里,4 和 5 称为操作数,+ 称为运算符。VBA 支持以下类型的运算符 -
- 算术运算符
- 比较运算符
- 逻辑(或关系)运算符
- 串联运算符
算术运算符
VBA 支持以下算术运算符。
假设变量 A 为 5,变量 B 为 10,则 -
操作员 | 描述 | 例子 |
---|---|---|
+ | 将两个操作数相加 | A + B 将得到 15 |
- | 从第一个操作数中减去第二个操作数 | A - B 将给出 -5 |
* | 将两个操作数相乘 | A * B 将给出 50 |
/ | 分子除以分母 | B/A 将给出 2 |
% | 模运算符和整数除法后的余数 | B % A 将给出 0 |
^ | 求幂运算符 | B ^ A 将给出 100000 |
比较运算符
VBA 支持以下比较运算符。
假设变量 A 为 10,变量 B 为 20,则 -
操作员 | 描述 | 例子 |
---|---|---|
= | 检查两个操作数的值是否相等。如果是,则条件为真。 | (A = B) 为假。 |
<> | 检查两个操作数的值是否相等。如果值不相等,则条件为真。 | (A <> B) 为真。 |
> | 检查左操作数的值是否大于右操作数的值。如果是,则条件为真。 | (A > B) 为假。 |
< | 检查左操作数的值是否小于右操作数的值。如果是,则条件为真。 | (A < B) 为真。 |
>= | 检查左操作数的值是否大于或等于右操作数的值。如果是,则条件为真。 | (A >= B) 为假。 |
<= | 检查左操作数的值是否小于或等于右操作数的值。如果是,则条件为真。 | (A <= B) 为真。 |
逻辑运算符
VBA 支持以下逻辑运算符。
假设变量 A 为 10,变量 B 为 0,则 -
操作员 | 描述 | 例子 |
---|---|---|
和 | 称为逻辑与运算符。如果两个条件都为 True,则表达式为 true。 | a<>0 AND b<>0 为 False。 |
或者 | 称为逻辑或运算符。如果两个条件中的任何一个为 True,则该条件为 true。 | a<>0 或 b<>0 为真。 |
不是 | 称为逻辑非运算符。用于反转其操作数的逻辑状态。如果条件为 true,则逻辑 NOT 运算符将使 false。 | NOT(a<>0 OR b<>0) 为假。 |
异或 | 称为逻辑排除。它是 NOT 和 OR 运算符的组合。如果其中一个且只有一个表达式的计算结果为 True,则结果为 True。 | (a<>0 XOR b<>0) 为真。 |
串联运算符
VBA 支持以下串联运算符。
假设变量 A 为 5,变量 B 为 10,则 -
操作员 | 描述 | 例子 |
---|---|---|
+ | 添加两个值作为变量。值是数字 | A + B 将得到 15 |
& | 连接两个值 | A & B 将给出 510 |
假设变量 A =“Microsoft”且变量 B =“VBScript”,则 -
操作员 | 描述 | 例子 |
---|---|---|
+ | 连接两个值 | A + B 将给出 MicrosoftVBScript |
& | 连接两个值 | A & B 将提供 MicrosoftVBScript |
注意- 连接运算符可用于数字和字符串。如果变量保存数字值或字符串值,输出取决于上下文。
VBA - 决策
决策允许程序员控制脚本或其部分之一的执行流程。执行由一个或多个条件语句控制。
以下是大多数编程语言中常见的典型决策结构的一般形式。
VBA 提供以下类型的决策语句。单击以下链接查看其详细信息。
先生。 | 声明及说明 |
---|---|
1 |
if 语句
if语句由一个布尔表达式后跟一个或多个语句组成。 |
2 |
if..else 语句
if else语句由一个布尔表达式后跟一个或多个语句组成。如果条件为 True,则执行If语句下的语句。如果条件为假,则执行脚本的Else部分。 |
3 |
if...elseif..else 语句
if语句后跟一个或多个ElseIf语句,该语句由布尔表达式组成,后跟一个可选的else 语句,当所有条件都变为 false 时执行。 |
4 |
嵌套 if 语句
另一个if或elseif语句内的if或elseif语句。 |
5 |
switch语句
switch语句允许测试变量是否与值列表相等。 |
VBA - 循环
可能存在这样的情况:您需要多次执行一段代码。一般来说,语句是按顺序执行的:首先执行函数中的第一个语句,然后执行第二个语句,依此类推。
编程语言提供了各种控制结构,允许更复杂的执行路径。
循环语句允许我们多次执行一条语句或一组语句。以下是 VBA 中循环语句的一般形式。
VBA 提供以下类型的循环来处理循环要求。单击以下链接查看其详细信息。
先生。 | 循环类型和描述 |
---|---|
1 |
for循环
多次执行一系列语句并缩写管理循环变量的代码。 |
2 |
for ..每个循环
如果组中至少有一个元素,则执行此操作,并针对组中的每个元素重复此操作。 |
3 |
while..wend 循环
这会在执行循环体之前测试条件。 |
4 |
do..while 循环
只要条件为 True,do..While 语句就会被执行。(即)应重复循环,直到条件为 False。 |
5 |
do..until 循环
只要条件为 False,do..Until 语句就会被执行。(即)应重复循环,直到条件为 True。 |
循环控制语句
循环控制语句改变其正常顺序的执行。当执行离开作用域时,循环中的所有剩余语句都不会执行。
VBA 支持以下控制语句。单击以下链接查看其详细信息。
VBA - 字符串
字符串是字符序列,可以由字母、数字、特殊字符或全部组成。如果变量用双引号“”括起来,则称该变量是字符串。
句法
variablename = "string"
例子
str1 = "string" ' Only Alphabets str2 = "132.45" ' Only Numbers str3 = "!@#$;*" ' Only Special Characters Str4 = "Asc23@#" ' Has all the above
字符串函数
有预定义的 VBA 字符串函数,可以帮助开发人员非常有效地处理字符串。以下是 VBA 支持的字符串方法。请点击每一种方法来详细了解。
先生。 | 函数名称和描述 |
---|---|
1 |
内斯特
返回指定子字符串的第一次出现。搜索从左到右进行。 |
2 |
指令修订版
返回指定子字符串的第一次出现。搜索从右到左进行。 |
3 |
案例
返回指定字符串的小写字母。 |
4 |
乌卡塞
返回指定字符串的大写形式。 |
5 | 左边
返回从字符串左侧算起的特定数量的字符。 |
6 | 正确的
返回字符串右侧的特定数量的字符。 |
7 |
中
根据指定的参数从字符串中返回特定数量的字符。 |
8 |
修剪
返回删除指定字符串左侧空格后的字符串。 |
9 |
修剪
返回删除指定字符串右侧空格后的字符串。 |
10 |
修剪
删除前导空格和尾随空格后返回字符串值。 |
11 |
伦
返回给定字符串的长度。 |
12 |
代替
将一个字符串替换为另一个字符串后返回一个字符串。 |
13 |
空间
用指定数量的空格填充字符串。 |
14 |
StrComp
比较两个指定的字符串后返回一个整数值。 |
15 |
细绳
返回具有指定字符指定次数的字符串。 |
16 |
反转
返回给定字符串的字符顺序颠倒后的字符串。 |
VBA - 日期时间函数
VBScript 日期和时间函数可帮助开发人员将日期和时间从一种格式转换为另一种格式,或以适合特定条件的格式表达日期或时间值。
日期函数
先生。 | 功能说明 |
---|---|
1 |
日期
一个函数,返回当前系统日期。 |
2 |
日期
一个函数,它将给定的输入转换为日期。 |
3 |
日期添加
一个函数,返回已添加指定时间间隔的日期。 |
4 |
日期差异
一个函数,返回两个时间段之间的差异。 |
5 |
日期部分
一个函数,返回给定输入日期值的指定部分。 |
6 |
日期序列号
一个函数,返回给定年、月和日的有效日期。 |
7 |
格式化日期时间
一个函数,根据提供的参数格式化日期。 |
8 |
是日期
一个函数,无论提供的参数是否为日期,它都会返回布尔值。 |
9 |
天
一个函数,返回 1 到 31 之间的整数,表示指定日期的天数。 |
10 |
月
一个函数,返回 1 到 12 之间的整数,表示指定日期的月份。 |
11 |
年
一个函数,返回一个表示指定日期年份的整数。 |
12 |
月份名称
一个函数,返回指定日期的特定月份名称。 |
13 |
工作日
一个函数,返回一个整数(1 到 7),表示指定日期是星期几。 |
14 |
星期名称
一个函数,返回指定日期的工作日名称。 |
时间函数
先生。 | 功能说明 |
---|---|
1 |
现在
一个函数,返回当前系统日期和时间。 |
2 |
小时
一个函数,返回 0 到 23 之间的整数,表示给定时间的小时部分。 |
3 |
分钟
一个函数,返回 0 到 59 之间的整数,表示给定时间的分钟部分。 |
4 | 第二
一个函数,返回 0 到 59 之间的整数,表示给定时间的秒部分。 |
5 | 时间
一个函数,返回当前系统时间。 |
6 |
定时器
一个函数,返回自 12:00 AM 以来的秒数和毫秒数。 |
7 |
时间序列
一个函数,返回特定输入的小时、分钟和秒的时间。 |
8 |
时间价值
一个函数,它将输入字符串转换为时间格式。 |
VBA - 数组
我们很清楚,变量是存储值的容器。有时,开发人员可以一次在一个变量中保存多个值。当一系列值存储在单个变量中时,它被称为数组变量。
数组声明
数组的声明方式与变量的声明方式相同,只是数组变量的声明使用括号。在以下示例中,括号中提到了数组的大小。
'Method 1 : Using Dim Dim arr1() 'Without Size 'Method 2 : Mentioning the Size Dim arr2(5) 'Declared with size of 5 'Method 3 : using 'Array' Parameter Dim arr3 arr3 = Array("apple","Orange","Grapes")
虽然数组大小显示为 5,但由于数组索引从 0 开始,它可以容纳 6 个值。
数组索引不能为负数。
VBScript 数组可以在数组中存储任何类型的变量。因此,数组可以在单个数组变量中存储整数、字符串或字符。
为数组赋值
通过针对要分配的每个值指定数组索引值,将值分配给数组。它可以是一个字符串。
例子
添加一个按钮并添加以下功能。
Private Sub Constant_demo_Click() Dim arr(5) arr(0) = "1" 'Number as String arr(1) = "VBScript" 'String arr(2) = 100 'Number arr(3) = 2.45 'Decimal Number arr(4) = #10/07/2013# 'Date arr(5) = #12.45 PM# 'Time msgbox("Value stored in Array index 0 : " & arr(0)) msgbox("Value stored in Array index 1 : " & arr(1)) msgbox("Value stored in Array index 2 : " & arr(2)) msgbox("Value stored in Array index 3 : " & arr(3)) msgbox("Value stored in Array index 4 : " & arr(4)) msgbox("Value stored in Array index 5 : " & arr(5)) End Sub
当您执行上述函数时,它会产生以下输出。
Value stored in Array index 0 : 1 Value stored in Array index 1 : VBScript Value stored in Array index 2 : 100 Value stored in Array index 3 : 2.45 Value stored in Array index 4 : 7/10/2013 Value stored in Array index 5 : 12:45:00 PM
多维数组
数组不仅限于一维,而且最多可以有 60 维。二维数组是最常用的数组。
例子
在以下示例中,声明了一个具有 3 行和 4 列的多维数组。
Private Sub Constant_demo_Click() Dim arr(2,3) as Variant ' Which has 3 rows and 4 columns arr(0,0) = "Apple" arr(0,1) = "Orange" arr(0,2) = "Grapes" arr(0,3) = "pineapple" arr(1,0) = "cucumber" arr(1,1) = "beans" arr(1,2) = "carrot" arr(1,3) = "tomato" arr(2,0) = "potato" arr(2,1) = "sandwitch" arr(2,2) = "coffee" arr(2,3) = "nuts" msgbox("Value in Array index 0,1 : " & arr(0,1)) msgbox("Value in Array index 2,2 : " & arr(2,2)) End Sub
当您执行上述函数时,它会产生以下输出。
Value stored in Array index : 0 , 1 : Orange Value stored in Array index : 2 , 2 : coffee
重新调暗声明
ReDim 语句用于声明动态数组变量并分配或重新分配存储空间。
句法
ReDim [Preserve] varname(subscripts) [, varname(subscripts)]
参数说明
Preserve - 一个可选参数,用于在更改最后一个维度的大小时保留现有数组中的数据。
Varname - 必需参数,表示变量的名称,应遵循标准变量命名约定。
下标- 必需参数,指示数组的大小。
例子
在以下示例中,重新定义了一个数组,然后在更改数组的现有大小时保留了值。
注意- 将数组大小调整为小于原来大小时,被消除元素中的数据将丢失。
Private Sub Constant_demo_Click() Dim a() as variant i = 0 redim a(5) a(0) = "XYZ" a(1) = 41.25 a(2) = 22 REDIM PRESERVE a(7) For i = 3 to 7 a(i) = i Next 'to Fetch the output For i = 0 to ubound(a) Msgbox a(i) Next End Sub
当您执行上述函数时,它会产生以下输出。
XYZ 41.25 22 3 4 5 6 7
数组方法
VBScript 中有各种内置函数可以帮助开发人员有效地处理数组。下面列出了与数组结合使用的所有方法。请点击方法名称来详细了解。
先生。 | 功能说明 |
---|---|
1 |
LB界
一个函数,返回与给定数组的最小下标相对应的整数。 |
2 |
优邦德
一个函数,返回与给定数组的最大下标相对应的整数。 |
3 |
分裂
一个函数,返回包含指定数量的值的数组。根据分隔符分割。 |
4 |
加入
一个函数,返回一个字符串,该字符串包含数组中指定数量的子字符串。这是与分割方法完全相反的功能。 |
5 |
筛选
一个函数,返回一个从零开始的数组,其中包含基于特定过滤条件的字符串数组的子集。 |
6 |
是数组
一个函数,返回一个布尔值,指示输入变量是否是数组。 |
7 |
擦除
一个函数,它恢复为数组变量分配的内存。 |
VBA - 用户定义函数
函数是一组可重用代码,可以在程序中的任何位置调用。这消除了一遍又一遍地编写相同代码的需要。这使得程序员能够将大程序划分为许多小的且可管理的函数。
除了内置函数之外,VBA 还允许编写用户定义的函数。在本章中,您将学习如何在 VBA 中编写自己的函数。
功能定义
VBA 函数可以有一个可选的 return 语句。如果您想从函数返回值,则这是必需的。
例如,您可以在函数中传递两个数字,然后您可以期望函数在调用程序中返回它们的乘法。
注意- 函数可以返回用逗号分隔的多个值作为分配给函数名称本身的数组。
在使用函数之前,我们需要定义该特定函数。在 VBA 中定义函数的最常见方法是使用Function关键字,后跟唯一的函数名称,它可能包含也可能不包含参数列表以及带有End Function关键字的语句,该语句指示函数的结束。以下是基本语法。
句法
添加一个按钮并添加以下功能。
Function Functionname(parameter-list) statement 1 statement 2 statement 3 ....... statement n End Function
例子
添加以下返回面积的函数。请注意,一个或多个值可以与函数名称本身一起返回。
Function findArea(Length As Double, Optional Width As Variant) If IsMissing(Width) Then findArea = Length * Length Else findArea = Length * Width End If End Function
调用函数
要调用函数,请使用函数名称调用该函数,如以下屏幕截图所示。
如下所示的区域的输出将显示给用户。
VBA - 子过程
子过程与函数类似,但也有一些区别。
子过程不返回值,而函数可能返回值,也可能不返回值。
子过程可以在没有 call 关键字的情况下调用。
Sub 过程始终包含在 Sub 和 End Sub 语句内。
例子
Sub Area(x As Double, y As Double) MsgBox x * y End Sub
调用流程
要在脚本中的某个位置调用过程,您可以从函数中进行调用。我们将无法使用与函数相同的方式,因为子过程不会返回值。
Function findArea(Length As Double, Width As Variant) area Length, Width ' To Calculate Area 'area' sub proc is called End Function
现在您将只能调用该函数,而不能调用子过程,如以下屏幕截图所示。
计算面积并仅在消息框中显示。
结果单元格显示零,因为函数未返回面积值。简而言之,您不能从 Excel 工作表直接调用子过程。
VBA - 事件
VBA,当您手动更改单元格或单元格值范围时,可以触发事件驱动编程。更改事件可能会让事情变得更容易,但您可以很快结束充满格式的页面。有两种事件。
- 工作表事件
- 工作簿活动
工作表事件
当工作表发生更改时,会触发工作表事件。它是通过右键单击工作表选项卡并选择“查看代码”,然后粘贴代码来创建的。
用户可以选择这些工作表中的每一个,然后从下拉列表中选择“工作表”以获取所有支持的工作表事件的列表。
以下是用户可以添加的受支持的工作表事件。
Private Sub Worksheet_Activate() Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean) Private Sub Worksheet_Calculate() Private Sub Worksheet_Change(ByVal Target As Range) Private Sub Worksheet_Deactivate() Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink) Private Sub Worksheet_SelectionChange(ByVal Target As Range)
例子
比方说,我们只需要在双击之前显示一条消息。
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) MsgBox "Before Double Click" End Sub
输出
双击任何单元格后,将向用户显示消息框,如以下屏幕截图所示。
工作簿活动
当工作簿整体发生变化时,就会触发工作簿事件。我们可以通过选择“ThisWorkbook”并从下拉列表中选择“workbook”来添加工作簿事件的代码,如以下屏幕截图所示。Workbook_open 子过程立即显示给用户,如以下屏幕截图所示。
以下是用户可以添加的受支持的工作簿事件。
Private Sub Workbook_AddinUninstall() Private Sub Workbook_BeforeClose(Cancel As Boolean) Private Sub Workbook_BeforePrint(Cancel As Boolean) Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Private Sub Workbook_Deactivate() Private Sub Workbook_NewSheet(ByVal Sh As Object) Private Sub Workbook_Open() Private Sub Workbook_SheetActivate(ByVal Sh As Object) Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean) Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean) Private Sub Workbook_SheetCalculate(ByVal Sh As Object) Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) Private Sub Workbook_SheetDeactivate(ByVal Sh As Object) Private Sub Workbook_SheetFollowHyperlink(ByVal Sh As Object, ByVal Target As Hyperlink) Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) Private Sub Workbook_WindowActivate(ByVal Wn As Window) Private Sub Workbook_WindowDeactivate(ByVal Wn As Window) Private Sub Workbook_WindowResize(ByVal Wn As Window)
例子
假设,每当创建新工作表时,我们只需要向用户显示一条消息,表明新工作表已成功创建。
Private Sub Workbook_NewSheet(ByVal Sh As Object) MsgBox "New Sheet Created Successfully" End Sub
输出
创建新的 Excel 工作表后,将向用户显示一条消息,如以下屏幕截图所示。
VBA - 错误处理
编程中存在三种类型的错误:(a) 语法错误、(b) 运行时错误和 (c) 逻辑错误。
语法错误
语法错误,也称为解析错误,发生在 VBScript 的解释时。例如,以下行会导致语法错误,因为它缺少右括号。
Function ErrorHanlding_Demo() dim x,y x = "Tutorialspoint" y = Ucase(x End Function
运行时错误
运行时错误(也称为异常)在解释后的执行过程中发生。
例如,以下行会导致运行时错误,因为这里的语法是正确的,但在运行时它试图调用 fnmultiply,这是一个不存在的函数。
Function ErrorHanlding_Demo1() Dim x,y x = 10 y = 20 z = fnadd(x,y) a = fnmultiply(x,y) End Function Function fnadd(x,y) fnadd = x + y End Function
逻辑错误
逻辑错误可能是最难追踪的错误类型。这些错误不是语法或运行时错误的结果。相反,当您在驱动脚本的逻辑中犯了错误并且没有得到预期的结果时,就会发生这种情况。
您无法捕获这些错误,因为这取决于您的业务需求要在程序中放入什么类型的逻辑。
例如,将数字除以零或编写的脚本进入无限循环。
错误对象
假设如果出现运行时错误,则通过显示错误消息来停止执行。作为开发人员,如果我们想要捕获错误,那么就会使用Error Object。
例子
在以下示例中,Err.Number给出错误编号,Err.Description给出错误描述。
Err.Raise 6 ' Raise an overflow error. MsgBox "Error # " & CStr(Err.Number) & " " & Err.Description Err.Clear ' Clear the error.
错误处理
VBA 启用错误处理例程,也可用于禁用错误处理例程。如果没有 On Error 语句,发生的任何运行时错误都是致命的:显示错误消息,并且执行突然停止。
On Error { GoTo [ line | 0 | -1 ] | Resume Next }
先生。 | 关键字和描述 |
---|---|
1 |
转到行 启用从所需行参数中指定的行开始的错误处理例程。指定的行必须与 On Error 语句位于同一过程中,否则将发生编译时错误。 |
2 |
转到0 禁用当前过程中启用的错误处理程序并将其重置为 Nothing。 |
3 |
转到-1 禁用当前过程中启用的异常并将其重置为 Nothing。 |
4 |
继续下一步 指定当发生运行时错误时,控制转到紧随发生错误的语句之后的语句,并从该点继续执行。 |
例子
Public Sub OnErrorDemo() On Error GoTo ErrorHandler ' Enable error-handling routine. Dim x, y, z As Integer x = 50 y = 0 z = x / y ' Divide by ZERO Error Raises ErrorHandler: ' Error-handling routine. Select Case Err.Number ' Evaluate error number. Case 10 ' Divide by zero error MsgBox ("You attempted to divide by zero!") Case Else MsgBox "UNKNOWN ERROR - Error# " & Err.Number & " : " & Err.Description End Select Resume Next End Sub
VBA - Excel 对象
使用 VBA 编程时,用户需要处理的重要对象很少。
- 应用对象
- 工作簿对象
- 工作表对象
- 范围对象
应用对象
应用程序对象由以下部分组成 -
- 应用程序范围的设置和选项。
- 返回顶级对象的方法,例如 ActiveCell、ActiveSheet 等。
例子
'Example 1 : Set xlapp = CreateObject("Excel.Sheet") xlapp.Application.Workbooks.Open "C:\test.xls" 'Example 2 : Application.Windows("test.xls").Activate 'Example 3: Application.ActiveCell.Font.Bold = True
工作簿对象
Workbook 对象是 Workbooks 集合的成员,包含当前在 Microsoft Excel 中打开的所有 Workbook 对象。
例子
'Ex 1 : To close Workbooks Workbooks.Close 'Ex 2 : To Add an Empty Work Book Workbooks.Add 'Ex 3: To Open a Workbook Workbooks.Open FileName:="Test.xls", ReadOnly:=True 'Ex : 4 - To Activate WorkBooks Workbooks("Test.xls").Worksheets("Sheet1").Activate
工作表对象
Worksheet 对象是 Worksheets 集合的成员,包含工作簿中的所有 Worksheet 对象。
例子
'Ex 1 : To make it Invisible Worksheets(1).Visible = False 'Ex 2 : To protect an WorkSheet Worksheets("Sheet1").Protect password:=strPassword, scenarios:=True
范围对象
范围对象表示一个单元格、一行、一列或包含一个或多个连续单元格块的单元格选择。
'Ex 1 : To Put a value in the cell A5 Worksheets("Sheet1").Range("A5").Value = "5235" 'Ex 2 : To put a value in range of Cells Worksheets("Sheet1").Range("A1:A4").Value = 5
VBA - 文本文件
您还可以使用 VBA 读取 Excel 文件并将单元格内容写入文本文件。VBA 允许用户使用两种方法处理文本文件 -
- 文件系统对象
- 使用写命令
文件系统对象 (FSO)
顾名思义,FSO 帮助开发人员使用驱动器、文件夹和文件。在本节中,我们将讨论如何使用 FSO。
先生。 | 对象类型和描述 |
---|---|
1 |
驾驶 驱动器是一个对象。包含允许您收集有关连接到系统的驱动器的信息的方法和属性。 |
2 |
驱动器 驱动器是一个集合。它提供物理或逻辑连接到系统的驱动器列表。 |
3 |
文件 文件是一个对象。它包含允许开发人员创建、删除或移动文件的方法和属性。 |
4 |
文件 文件是一个集合。它提供文件夹中包含的所有文件的列表。 |
5 |
文件夹 文件夹是一个对象。它提供了允许开发人员创建、删除或移动文件夹的方法和属性。 |
6 |
文件夹 文件夹是一个集合。它提供文件夹内所有文件夹的列表。 |
7 |
文本流 TextStream 是一个对象。它使开发人员能够读取和写入文本文件。 |
驾驶
驱动器是一个对象,它提供对特定磁盘驱动器或网络共享的属性的访问。Drive对象支持以下属性-
- 可用空间
- 盘符
- 驱动器类型
- 文件系统
- 可用空间
- 准备好了
- 小路
- 根文件夹
- 序列号
- 共享名
- 总尺寸
- 卷名
例子
步骤 1 - 在继续使用 FSO 编写脚本之前,我们应该启用 Microsoft Scripting Runtime。要执行相同的操作,请导航至“工具”→“参考”,如以下屏幕截图所示。
步骤 2 - 添加“Microsoft Scripting RunTime”并单击“确定”。
步骤 3 - 添加您想要写入文本文件的数据并添加命令按钮。
步骤 4 - 现在是编写脚本的时候了。
Private Sub fn_write_to_text_Click() Dim FilePath As String Dim CellData As String Dim LastCol As Long Dim LastRow As Long Dim fso As FileSystemObject Set fso = New FileSystemObject Dim stream As TextStream LastCol = ActiveSheet.UsedRange.Columns.Count LastRow = ActiveSheet.UsedRange.Rows.Count ' Create a TextStream. Set stream = fso.OpenTextFile("D:\Try\Support.log", ForWriting, True) CellData = "" For i = 1 To LastRow For j = 1 To LastCol CellData = Trim(ActiveCell(i, j).Value) stream.WriteLine "The Value at location (" & i & "," & j & ")" & CellData Next j Next i stream.Close MsgBox ("Job Done") End Sub
输出
执行脚本时,请确保将光标放在工作表的第一个单元格中。将在“D:\Try”下创建 Support.log 文件,如以下屏幕截图所示。