暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

VBA教程

原创 yBmZlQzJ 2023-08-11
747

VBA教程

VBA代表Visual Basic应用程序,是来自微软的事件驱动编程语言,目前主要有Microsoft Office应用程序,如MS-Excel,MS-Word和MS-Access中使用。

它可以帮助技术人员构建自定义的应用程序和解决方案,以增强这些应用程序的功能。这个设计的好处是,我们不必把Visual Basic安装我们的PC上,但安装Office将隐帮助我们达到目的。

我们可以在所有Office版本(从微软Office97至微软Office2013)直接使用,可用最新版本VBA。其中Excel的VBA是最流行的一种,并且我们可以建立在MS Excel中使用VBA非常强大的工具,包括使用线性程序。

VBA的应用

为什么我们需要使用VBA在Excel中为MS-Excel本身提供了内置的功能负荷。 MS-Excel提供了唯一的基本内在功能而可能不足以执行复杂的计算。在这些情况下,VBA变成一种最明显好的解决方案。

其中一个最好的例子是非常难使用Excel内置计算贷款每月还款数,但很容易编写一个VBA这样计算。

访问VBA编辑器

在Excel窗口,按“Alt + F11”。打开VBA的窗口如下所示。

Decision making statements in VBScript

VBA Excel宏 - VBA教程

Excel VBA宏

在这一章中,让我们了解如何编写一个简单的宏。让我们一步一步来。

第1步:首先,让我们能够在Excel20XX'开发'菜单。做同样的,点击 File >> Option。

第2步:点击自定义功能区选项卡,并选中“Developer”,然后点击“OK”。

Developer in VBScript

第3步:在“Developer”带状出现在菜单栏。

Developer in VBScript

第4步:点击“Visual Basic”按钮以打开VBA编辑器。

Developer in VBScript

第5步:现在,让我们通过添加一个按钮,启动脚本。点击“Insert”>>选择“button”。

Developer in VBScript

第6步:执行右键单击并选择“properties”。

Developer in VBScript

第7步. 编辑名称和标题如下所示。

Developer in VBScript

第8步:现在,双击该按钮,如下图所示的子过程的轮廓将被显示。

Developer in VBScript

第9步:让我们先来简单地增加一个报文编码。

Private Sub say_helloworld_Click()
MsgBox "Hi"
End Sub

第10步:现在,可以点击按钮执行子过程。子过程的输出如下所示。我们将会示范进一步章节使用一个简单的按钮,从步骤#1-10已说明到。因此,彻底理解本章对以后内容的学习是很重要的。

Developer in VBScript

Excel VBA术语 - VBA教程

Excel VBA名词术语

在这一章中,让我们了解常用的Excel VBA术语。这些术语将在进一步模块学习中使用,因此理解它们是非常关键的。

模块

1.模块是其中代码被写入的区域。这是一个新的工作簿,因此不会有任何模块。

Module in VBScript

2.要插入导航模块Insert >> Module。一旦模块被插入“module1”创建。在该模块中,我们可以编写VBA代码和代码编写过程。程序/Sub过程是一系列的VBA语句指示怎么做。

Module in VBScript

过程

过程组被作为一个整体,指示Excel中如何执行特定任务执行的语句。执行的任务可以非常简单或非常复杂的,这是一个很好的做法,把程序分成较小的部分。

两种主要类型的过程分别是:Sub和Function。

Module in VBScript

函数

函数是一组可重用的代码,可以在程序的任何地方调用。这消除了一遍又一遍写相同的代码的需要。这将会使程序员能够将一个大程序分成若干小的,可管理的函数功能。

除了内置函数,VBA允许我们编写用户定义的函数,以及和语句都应写Function和End Function之间

Sub过程

子程序的工作类似函数,Sub过程一般无返回值,函数可能会或可能不会返回一个值。 Sub过程可以不调用关键字。子过程总是使用Sub和End Sub语句括起来。

VBA宏注释 - VBA教程

VBA注释

注释是用来记录程序逻辑和用户信息与其他程序员可以在相同的代码无缝协同工作打好基础。

它可包括开发,修改的信息,例如,它也可以包括引入作为逻辑。注释被解释执行时忽略。

在VBA中的注释用两种方法来表示。

1.是用单引号(?)开始的任何语句都被当作注释。下面是一个例子:

' This Script is invoked after successful login
' Written by : YiiBai
' Return Value : True / False

2.以关键字“REM”开头的任何声明。下面是一个例子:

REM This Script is written to Validate the Entered Input
REM Modified by : Yiibai/user_a

VBA消息框 - VBA教程

VBA消息框

MsgBox函数显示一个消息框,并等待用户点击一个按钮,然后根据用户点击该按钮的动作执行。

语法

MsgBox(prompt[,buttons][,title][,helpfile,context])

参数说明

  • Prompt - 必需的参数。这显示在对话框中的消息的字符串。 prompt 最大长度大约是1024个字符。如果消息扩展到多行,那么可以单独使用回车符(CHR(13))或每行之间的换行符(CHR(10))。
  • buttons - 一个可选的参数。数值表达式,用于指定按钮的类型来显示,图标样式使用,默认按钮的标识以及消息框的样式。如果留空,对于按钮的默认值是0。
  • Title - 一个可选的参数。在对话框的标题栏中显示的字符串表达式。如果标题为空,应用程序的名称被放置在此标题栏中。
  • helpfile - 一个可选的参数。标识帮助文件中的字符串表达式使用提供的对话框中的上下文相关帮助。
  • context - 一个可选的参数。数值表达式,用于标识由帮助文件的作者指定给适当的帮助主题的上下文编号。如果上下文中提供帮助文件,此项还必须提供。

按钮参数可以采用任何的下列值:

  • 0 vbOKOnly只显示OK按钮。
  • 1 vbOKCancel显示确定和取消按钮。
  • 2 vbAbortRetryIgnore显示放弃,重试和忽略按钮。
  • 3 vbYesNoCancel Displays Yes, No, and Cancel buttons.
  • 4 vbYesNoCancel显示是,否和取消按钮。
  • 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)描述的图标的sytle要被显示,第三组(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
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工作表函数,如下图所示执行。

Message Box in VBA

2.一个简单的消息框将显示一条消息,“Welcome”和“OK”按钮:

Message Box in VBA

3.单击确定后,另一个对话框将显示一条消息,“yes, no, 和 cancel”按钮。

Message Box in VBA

4.单击取消按钮键的值之后(7)被存储为一个整数,如下所示显示消息框给用户。使用该值,我们就能够知道哪个按钮用户点击。

Message Box in VBA

VBA输入框 - VBA教程

什么是输入框?

InputBox函数帮助用户从用户得到值。输入值时,如果用户点击OK按钮或键盘上按下ENTER后,InputBox函数将返回在文本框中的文本。如果用户点击取消按钮,该函数会返回一个空字符串(“”)。

语法

InputBox(prompt[,title][,default][,xpos][,ypos][,helpfile,context])

参数说明:

  • Prompt - 必需的参数。这显示在对话框中的消息的字符串。 prompt 最大长度大约是1024个字符。如果消息扩展到多行,那么可以单独使用回车符(CHR(13))或每行之间的换行符(CHR(10))。
  • Title - 一个可选的参数。在对话框的标题栏中显示的字符串表达式。如果标题为空,应用程序的名称被放置在标题栏中。
  • Default - 一个可选的参数。显示在文本框中的默认文本
  • XPos - 一个可选的参数。X轴的位置,表示从屏幕的左侧水平提示距离。如果留空,输入框水平居中。
  • YPos - 一个可选的参数。Y轴的位置,表示从画面垂直方向的左侧的提示距离。如果留空,输入框垂直居中。
  • helpfile - 一个可选的参数。标识帮助文件中的字符串表达式使用提供的对话框中的上下文相关帮助。
  • 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.执行相同,我们需要调用使用函数名,然后按下面输入如图所示。

Input Box Demo

2.在执行时,第一个输入框(长度)的显示和用户输入一个值在输入框中。

Input Box Demo

3.进入的第一个值之后,第二输入框(宽度)被显示给用户。

Input Box Demo

4.在进入第二数量并点击OK按钮,该区域被显示给用户,如下所示。

Input Box Demo

VBA变量 - VBA教程

变量是用来存放可以在脚本执行过程中改变的值命名的存储位置。下面是命名变量的基本规则。下面所列的是用于命名一个变量的规则。

  • 必须使用一个字母作为第一个字符。
  • 不能使用空格,句号(.),感叹号(!),或字符@, &, $, #在变量名称中。
  • 名称不能超过255个字符。
  • 不能使用Visual Basic保留关键字作为变量名。

语法

在VBA中,我们需要在使用之前声明变量。

Dim <<variable_name>> As <<variable_type>>

数据类型

有许多的VBA的数据类型,它可以非常分为两大类,即数字和非数字数据类型。

数字数据类型

下表显示的数值数据类型和值的允许范围。

类型

值范围

Byte

0 - 255

Integer

-32,768 - 32,767

Long

-2,147,483,648 - 2,147,483,648

Single

-3.402823E+38 ~ -1.401298E-45 为负值 1.401298E-45 ~ 3.402823E+38 为正值

Double

-1.79769313486232e+308 ~ -4.94065645841247E-324 为负值 4.94065645841247E-324 ~ 1.79769313486232e+308 为正值

Currency

-922,337,203,685,477.5808 to 922,337,203,685,477.5807

Decimal

+/- 79,228,162,514,264,337,593,543,950,335 if no decimal is use +/- 7.9228162514264337593543950335 (28 decimal places).

非数字数据类型

下表显示了非数值数据类型和值的允许范围。

类型

值范围

String(fixed length)

1 ~ 65,400 字符

String(variable length)

0 ~ 2 十亿个字符

Date

1月 1, 100 到12月 31, 9999

Boolean

True 或False

Object

任何嵌入对象

Variant(numeric)

任何Double值一样大

Variant(text)

同为可变长度的字符串

例子

我们创建一个按钮,并将其命名为“Variables_demo”用来演示使用变量。

vba_02.jpg

Private Sub Variables_demo_Click()
Dim password As String
password = "Admin#1"

Dim num As Integer
num = 1234

Dim BirthDay As Date
BirthDay = 30 / 10 / 2020

MsgBox "Passowrd is " & password & Chr(10) & "Value of num is " & num & Chr(10) & "Value of Birthday is " & BirthDay

End Sub

输出

时执行该脚本,则输出将如下所示。

vba_03.jpg

VBA常量 - 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_05.jpg

VBA运算符 - 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 MOD A = 0

^

求幂运算符

B ^ A = 100000

比较运算符

以下是VBA支持的比较运算符:

假设变量A=10和变量B=20,则:

查看例子

运算符

描述

例子

==

检查,如果两个操作数的值是否相等,如果是,则条件变为true。

(A == B) 为False.

<>

检查,如果两个操作数的值是否相等,如果值不相等,则条件变为true。

(A <> B) 为True.

>

检查,如果左操作数的值大于右操作数的值,如果是的话那么条件为true。

(A > B) 为False.

<

检查,如果左操作数的值小于右操作数的值,如果是的话那么条件为true。

(A < B) 为True.

>=

检查,如果左边的操作数的值大于或等于右操作数的值,如果是,则条件变为true。

(A >= B) 为False.

<=

检查,如果左边的操作数的值小于或等于右操作数的值,如果是,则条件变为true。

(A <= B) 为True.

逻辑运算符:

以下是VBA支持的逻辑运算符:

假设变量A=10和变量B=0,则:

显示例子

运算符

描述

例子

AND

所谓逻辑与运算符。如果两个条件都为真则表达式为true。

a<>0 AND b<>0 is False.

OR

所谓逻辑OR运算符。如果有两个条件都为真则条件成立。

a<>0 OR b<>0 is true.

NOT

所谓逻辑非运算符。使用反转操作数的逻辑状态。如果条件为真,则逻辑非运算符将返回false。

NOT(a<>0 OR b<>0) is false.

XOR

所谓逻辑排除。这是不和OR运算符的结合。如果一个,只有一个,表达式的计算结果为真,结果为true。

(a<>0 XOR b<>0) is false.

串联运算符

以下是VBA支持级联运算符:

假设变量A=5和变量B=10,则:

显示例子

运算符

描述

例子

+

添加两个值的变量值数值

A + B = 15

&

连接两个值

A & B = 510

假设变量A=“Microsoft”和变量B =“VBScript”,则:

运算符

描述

例子

+

连接两个值

A + B = MicrosoftVBScript

&

连接两个值

A & B = MicrosoftVBScript

注:连接操作,可用于数字和字符串。输出取决于上下文,如果变量持有数值或字符串值。

VBA决策 - VBA教程

决策允许程序员控制脚本的执行流程或它的部分之一。执行是通过一个或多个条件语句的约束。

以下是在大多数编程语言中的一个典型的决策结构的一般形式:

Decision making statements in VBA

VBA提供了以下几种类型的决策语句。点击以下链接查看的详细资料。

语句

描述

if 语句

if语句包含一个布尔表达式后跟一个或多个语句。

if..else 语句

if else语句包含一个布尔表达式后跟一个或多个语句。 如果条件为真,if语句执行。如果条件是假的,脚本的else部分被执行

if...elseif..else 语句

if语句后面跟着一个或多个elseif的声明,即由布尔表达式,然后跟着一个可选的else语句, 其中当所有的条件为假时 else语句部分执行。

内嵌 if 语句

if 或 elseif 语句中可以加入另一个 if 或 elseif 声明。

switch statement

switch语句允许一个变量,为防止值列表相等进行测试。

VBA循环 - VBA教程

可能有一种情况,需要执行代码块多次。在一般情况下,语句顺序执行:在一个函数的第一条语句,首先执行,然后是第二个...等等。

编程语言提供了多种控制结构,使更复杂的执行路径。

循环语句可以执行语句的语句多次或多组,下面是VBA循环的一般语句。

Loop Architecture

VBA提供循环以下类型的处理循环的要求。点击以下链接查看其详细信息。

循环类型

描述

for 循环

执行语句多次序列,简写形式用于管理循环变量的代码。

for ..each 循环

这执行,如果有组的至少一种元素并且重申为在一组中的每个元素。

while..wend 循环

这在执行循环体之前测试条件。

do..while 循环

do..while语句只要条件为真时执行。(即)循环重复,直到条件为False。

do..until 循环

do..until语句执行直到条件为False。(即)循环应重复,只要条件为真。

循环控制语句:

循环控制语句改变其正常的顺序执行。当执行离开了循环范围,在循环中的所有剩余语句不执行。

VBA支持下列控制语句。点击以下链接查看其详细信息。

控制语句

描述

Exit For 语句

终止 for 循环语句并将执行的语句,将立即循环体的下面语句

Exit Do 语句

终止do while语句并将执行循环紧随其后的语句

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 支持字符串的方法。请点击的方法,每个人都应该知道的细节。

函数名称

描述

InStr

返回指定字符串的第一次出现。搜索从发生左向右。

InstrRev

返回指定字符串的第一次出现。搜索发生从右到左。

Lcase

返回指定字符串的小写。

Ucase

返回指定字符串的大写。

Left

返回字符从字符串的左侧的特定数目。

Right

返回字符从字符串的右侧的特定数目。

Mid

返回从基于指定参数的字符串的字符的特定数目。

Ltrim

返回指定的字符串的左侧去除空格之后的字符串。

Rtrim

返回在右侧的指定字符串的去除空格之后的一个字符串。

Trim

返回删除这两个开头和结尾空格后的字符串值。

Len

返回给定字符串的长度。

Replace

返回字符串替换字符串后的字符串。

Space

填补了字符串的空格指定的数目。

StrComp

返回比较两个指定的字符串后的整数值。

String

返回具有指定字符的指定次数的字符串。

StrReverse

返回反转给定字符串的字符序轮机后的字符串。

VBA日期时间函数 - VBA教程

VBScript的日期和时间函数帮助开发人员转换日期和时间,转换另一种格式或表达的适合特定条件格式的日期或时间值。

日期函数

函数

描述

Date

一个函数,返回当前系统日期

CDate

一个函数,一个给定的输入转换为日期

DateAdd

一个函数,返回已添加日期到其指定的时间间隔

DateDiff

一个函数,返回在两个时间段的差异(差值)

DatePart

一个函数,返回给定输入日期值的指定部分

DateSerial

一个函数,返回一个有效日期为特定年份,月份和日期

FormatDateTime

一个函数,它将格式化基于提供的参数日期

IsDate

一个函数,返回一个布尔值,是否提供的参数是一个日期

Day

一个函数,返回1到31之间的整数,表示指定日期的当天

Month

一个函数,返回1到12之间的整数,表示指定日期的月份

Year

一个函数,返回一个整数,表示指定日期的年份

MonthName

一个函数,返回特定月份名称为指定日期

WeekDay

一个函数,返回一个整数(1〜7),表示星期几指定一天。

WeekDayName

一个函数,返回星期名称指定的一天。

时间函数

函数

描述

Now

一个函数,返回当前系统日期和时间

Hour

一个函数返回介于0和23,整数表示的给定时间的小时部分

Minute

一个函数,返回介于0和59,整数表示分钟的指定时间部分

Second

一个介于0和59功能,返回整数表示的给定时间的秒数部分

Time

一个函数,返回当前系统时间

Timer

一个函数,返回秒和毫秒的数量自12:00 AM

TimeSerial

一个函数,将特定的输入返回时间的小时,分钟和秒

TimeValue

一个函数,把输入字符串转换为时间格式

VBA数组 - 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")

  1. 虽然,数组大小显示为5,它可以容纳6个值作为数组索引从零开始。
  2. 数组索引不能为负数。
  3. 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语句用于声明动态数组变量并分配或重新分配存储空间。

ReDim [Preserve] varname(subscripts) [, varname(subscripts)]

  • Preserve - 可选参数,用来当改变最后一维的大小来保存数据在现有的数组。
  • varname - 必需的参数,它表示的变量,它应该遵循标准的变量命名约定的名称。
  • subscripts - 必需的参数,它表示该数组大小。

例子

在下面的例子中一个数组已经被重新定义,在保存的值时该数组的现有大小被改变。

注:在调整大小的数组小于它最初的值,在消除元素的数据将会丢失。

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中的各种内置函数,帮助开发者有效地处理数组。所有正在使用中一起选择数组方法在下面列出。请点击方法名详细了解。

函数

描述

LBound

此函数返回一个整数,对应于给定的数组中最小的下标。

UBound

此函数返回一个整数,对应于给定数组的最大下标。

Split

此函数返回包含值的指定数量的数组。分割后基于分隔符。

Join

此函数返回一个包含子字符串数组中的指定数量的字符串。这是Split 方法的完全相反的作用。

Filter

此函数返回零的数组包含字符串数组基于一个特定的过滤标准的子集。

IsArray

此函数返回一个布尔值,指示输入变量是否是一个数组。

Erase

此函数恢复所分配的内存为数组变量。

VBA定义函数 - 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

调用函数

调用一个函数,调用使用函数名称,如下所示:

Decision making statements in VBA

VBA子过程 - VBA教程

子过程

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

1.现在可以调用函数只而不是子过程,如下图所示。

sub_procedure in VBA

2.面积计算,仅在消息框中显示。

calculate_area_sub_2 in VBA

3.结果单元格显示为零面积值不是从函数返回。总之,不能直接从Excel工作表调用一个子过程。

calculate_area_sub_3 in VBA

VBA事件 - VBA教程

VBA 事件

VBA,事件驱动编程时可以手动更改单元格值的单元格或单元格区域被触发。更改事件可能会使事情变得更容易,但可以很快结束了一个完全格式化的页面。有两种类型的事件。

  • 工作表事件
  • 工作簿活动

工作表事件

工作表事件被触发时,在工作表中有变化。表标签上执行右键单击,选择“view code”,然后粘贴代码创建的。

用户可以选择那些工作表中的每一个,并从下拉列表中选择“工作表”下去把所有支持工作表的事件列表。

Input Box Demo

下面是可以由用户添加的支持工作表的事件。

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

输出

当双击任意单元格,显示消息框给用户,如下所示。

Input Box Demo

工作簿活动

工作簿事件被触发时,有一个变化以对整个工作簿。可以通过选择“ThisWorkbook'和选择从下拉'workbook',如下所示添加为工作簿的事件的代码。立即 Workbook_open 子过程显示给用户,如下所示。

Input Box Demo

下面是可以由用户添加的支持工作薄的事件。

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工作表的消息显示给用户,如下所示。

Input Box Demo

VBA错误处理 - VBA教程

有三种类型的编程错误:(1)语法错误和(b)运行时错误(三)逻辑错误。

语法错误

语法错误,也被称为解析错误,发生在VBScript解释的时候。例如,下面的一行将导致一个语法错误,因为它缺少一个右括号:

Function ErrorHanlding_Demo()
dim x,y
x = "Yiibai"
y = Ucase(x
End Function

运行时错误

在执行过程中运行时错误,也被称为异常,发生解释后。

例如,下面的行导致运行时错误,因为这里的语法是正确的,但在运行时,它试图调用乘法,这是一个不存在的功能:

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

逻辑错误

逻辑错误可能是最困难的类型的错误跟踪。这些错误不是一个语法或运行时错误的结果。相反,当犯了脚本逻辑的一个错误发生,没有得到所期望的结果。

无法抓到这些错误,因为这取决于你想要把什么样的程序执行在逻辑业务需求中。

例如,一个数字除以零或进入无限循环,写在脚本中。

Err对象

假设,如果有一个运行时错误,则执行停止通过显示错误信息。作为开发人员,如果想捕捉错误,那么可以使用Error对象。

示例

在下面的例子中,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 }

关键字

描述

GoTo line

可允许在需要的行参数指定的行开始的错误处理例程。指定的行必须在相同的过程中On Error语句,否则将发生编译时错误。

GoTo 0

禁用启用的错误处理当前过程中,并重置为Nothing。

GoTo -1

在当前过程中禁用启用例外,它重置为Nothing。

Resume Next

指定在运行时发生错误时,控制转到该语句立即出现错误的语句之后,并继续从该点执行

示例

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教程

什么是Excel对象?

当使用VBA编程,用户将处理的一些重要的对象。

  • 应用对象
  • 工作簿对象
  • 工作表对象
  • 对象范围

应用对象

Application对象包括以下

  • 应用范围的设置和选项。
  • 方法返回顶层对象,如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

工作簿对象

工作簿对象是工作簿集合的成员,并包含所有当前在Microsoft Excel中打开的工作簿对象。

例子

'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

工作表对象

工作表对象是工作表集合的成员,并包含一个工作簿中所有工作表对象。

例子

'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教程

VBA文本文件

我们可以读取Excel文件,并写入单元格中的内容到一个文本文件。这样一来,VBA允许用户使用文本文件的工作。我们可以测试文件使用工作的两种方法

  • 文件系统对象
  • 使用Write命令

使用文件系统对象(FSO)

正如其名称所说的,FSO对象帮助开发者使用驱动器,文件夹和文件的工作。在本节中,我们将讨论如何使用FSO。

对象类型

描述

Drive

驱动器是一个对象。包含的方法和属性,收集关于连接到系统的驱动器的信息

Drives

硬盘是一个集合。它提供了连接到系统,无论是物理或逻辑的驱动器的列表。

File

文件是一个对象。它包含的方法和属性,使开发人员能够创建,删除或移动文件。

Files

文件是一个集合。它提供了包含在文件夹内的所有文件的列表。

Folder

文件夹是一个对象。它提供的方法和属性,使开发人员能够创建,删除或移动文件夹。

Folders

文件夹是一个集合。它提供了一个文件夹内的所有文件夹列表。

TextStream

文本流是一个对象。它使开发人员能够读取和写入文本文件。

驱动器

Drive是一个对象,它提供了访问特定的磁盘驱动器或网络共享的属性。以下属性是由驱动器对象支持:

  • AvailableSpace
  • DriveLetter
  • DriveType
  • FileSystem
  • FreeSpace
  • IsReady
  • Path
  • RootFolder
  • SerialNumber
  • ShareName
  • TotalSize
  • VolumeName

例子

第1步:在继续使用FSO脚本,我们应该使Microsoft脚本运行。做同样,导航到"Tools" >> "References" ,如下图所示:

Excel FSO in VBScript

第2步:添加“Microsoft Scripting RunTime”,然后单击确定。

Excel FSO in VBScript

第3步:添加数据,将它写入一个文本文件,并添加一个命令按钮。

Excel FSO in VBScript

第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

输入

当执行脚本,请确保将光标放在工作表的第一个单元格。如在下面创建Support.log文件 "D:\Try":

Excel FSO in VBScript

该文件的内容也被显示如下:

Excel FSO in VBScript

使用写命令

不像FSO,我们不需要添加任何引用,但是不能够正常工作的驱动器,文件和文件夹。能够只流添加到文本文件中。

例子

Private Sub fn_write_to_text_Click()
Dim FilePath As String
Dim CellData As String
Dim LastCol As Long
Dim LastRow As Long

LastCol = ActiveSheet.UsedRange.Columns.Count
LastRow = ActiveSheet.UsedRange.Rows.Count

FilePath = "D:\Try\write.txt"
Open FilePath For Output As #2

CellData = ""
For i = 1 To LastRow
For j = 1 To LastCol
CellData = "The Value at location (" & i & "," & j & ")" & Trim(ActiveCell(i, j).Value)
Write #2, CellData
Next j
Next i

Close #2
MsgBox ("Job Done")
End Sub

输出

如下图所示当执行脚本时,在“D:\Try”创建“write.txt”文件。

Excel FSO in VBScript

该文件的内容也被显示如下:

Excel FSO in VBScript

VBA图表编程 - VBA教程

VBA - 图表编程

使用VBA,就可以做到生成基于一定的标准图表。让我们来看看它的一个例子。

步骤1:首先输入针对图表有生成的数据。

Graph in VBA

第2步:让我们创建3个按钮中的一个来生成柱状图,饼图,柱形图。

Graph in VBA

第3步:现在让我们建立一个宏来生成这些类型的每一个图表

' Procedure to Generate Pie Chart
Private Sub fn_generate_pie_graph_Click()
Dim cht As ChartObject
For Each cht In Worksheets(1).ChartObjects
cht.Chart.Type = xlPie
Next cht
End Sub

' Procedure to Generate Bar Graph
Private Sub fn_Generate_Bar_Graph_Click()
Dim cht As ChartObject
For Each cht In Worksheets(1).ChartObjects
cht.Chart.Type = xlBar
Next cht
End Sub

' Procedure to Generate Column Graph
Private Sub fn_generate_column_graph_Click()
Dim cht As ChartObject
For Each cht In Worksheets(1).ChartObjects
cht.Chart.Type = xlColumn
Next cht
End Sub

步骤4:在点击相应的按钮,创建的图表。在下面的输出,我们点击生成饼图按钮。

Graph in VBA

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论