当前位置:   article > 正文

VBA快速入门学习笔记_vba refersto

vba refersto

 

NOTE 1:

一、VBA对象

       工作簿、工作表、单元格、批注、透视表、自选图形、名称等等都是对象,VBA正是用于处理这些对象的语言。下图是一个比较经典的VBA对象类别图。在VBE(VB编辑器)里也可以看到对象的浏览器(F2键),对象可以相互包含。

二、VBA对象引用

        对象的引用(reference) 在写代码是要控制对象,首先要找到这个对象,然后把这个对象的地址告诉给VBA程序,且要遵循从大到小的规则。和我们中国地址的习惯一致,如我们在写地址的时候:先写中国,然后是某省,某市,某区依次往下写。告诉给VBA的时候也是一样的。 例如:

1 Workbooks集合包含在Application对象里,我们要引用名称为“book.xlsm”的工作薄时就是:Application.Workbooks(“book.xlsm”)

2 当我们引用“book.xlsm”里面的工作表“Sheet1”时应是:

Application.Workbooks(“book.xlsm”).Worksheets(“Sheet1”)

3 可以继续延伸到下一层,引用“book.xlsm”里工作表“Sheet1”里面的单元格区域“B1:D10”: Application.Workbooks(“book.xlsm”).Worksheets(“Sheet1”).Range(“B1:D10”)

特别注意1:如果我们引用的是活动对象,也就是被激活的对象,引用就可以进行简化。

如果是book.xlsm工作薄是激活的,引用可以简化为

Worksheets(“Sheet1”).Range(“B1:D10”)

如果Sheet1当前也是激活的,引用甚至还可以简化为Range(“B1:D10”),也可以直接输入[B1:D10],如果引用的单元Range是单个的单元格,可以用Range(“B1”)引用,还可以用Cells(行号,列号)的引用方式。

特别注意2:和引用文件不同的是,VBA里使用的分隔符是点。

特别注意3:引用不是选择,如下面的截图是选择的截图,引用不会有视觉效果。

 

三、常用对象的属性和方法

Names对象

应用程序或工作簿中的所有**Name** 对象的集合。

每一个 Name 对象都代表一个单元格区域的定义名称。 名称可以是内置名称, 例如 Database、Print_Area 和 Auto_Open (或 custom names)。

RefersTo 参数必须以 A1 样式表示法指定,包括必要时使用的美元符 ($)。 例如,如果在 Sheet1 上选定了单元格 A10,并且通过将 RefersTo 参数“=Sheet1!A1:B1”而定义了一个名称,那么该新名称实际上指向单元格区域 A10:B10(因为指定的是相对引用)。 若要指定绝对引用,请使用“=Sheet1!$A$1:$B$1”。

方法

Add方法:为单元格区域定义新名称。

Item 方法:从Names集合中返回单个**Name** 对象。

属性

Application 属性:在不使用对象识别符的情况下使用时, 此属性返回代表 Microsoft Excel 应用程序的**Application** 对象。 如果与对象识别符一起使用,则此属性返回代表指定对象的创建者的 Application 对象(可以将此属性与 OLE 自动化对象一起使用以返回该对象的应用程序)。 只读。

Count 属性:返回一个 Long 值,它表示集合中对象的数量。

Creator 属性:返回一个 32 位整数,该整数指示在其中创建了此对象的应用程序。 只读 Long。

Parent 属性:返回指定对象的父对象。 只读。

Name 对象

代表单元格区域的定义名。 名称可以是内置名称, 例如 Database、Print_Area 和 Auto_Open (或 custom names)。

方法

Delete 方法:删除对象

属性

Application 属性:在不使用对象识别符的情况下使用时, 此属性返回代表 Microsoft Excel 应用程序的**Application** 对象。 如果与对象识别符一起使用,则此属性返回代表指定对象的创建者的 Application 对象(可以将此属性与 OLE 自动化对象一起使用以返回该对象的应用程序)。 只读。

Category 属性:返回或设置指定名称的类别中的宏语言。 名称必须引用自定义的函数或命令。 读/写 String。

CategoryLocal 属性:返回或设置指定名称的类别中的用户语言名称引用自定义的函数或命令。 读/写 String。

Comment 属性:返回或设置与名称相关联的批注。 读/写 String。

Creator 属性:返回一个 32 位整数,该整数指示在其中创建了此对象的应用程序。 只读 Long。

Index 属性:返回一个 long 类型值,该值代表相似对象的集合中对象的索引号。

MacroType 属性:返回或设置名称所引用的对象。 读/写**XlXLMMacroType**。 xlXLMMacroType可以是下列xlXLMMacroType常量之一。 ||xlCommand。 名称是指用户定义的宏。 ||xlFunction。 名称是指用户定义的函数。 ||xlNotXLM。 名称不引用函数或宏。

Name 属性:返回或设置一个String值,它代表对象的名称。

NameLocal 属性:返回或设置中的语言的用户对象的名称。 读/写 String。

Parent 属性:返回指定对象的父对象。 只读。

RefersTo 属性:用宏语言以 A1 样式表示法返回或设置名称所引用的公式(以等号开头)。 读/写 String。

RefersToLocal 属性:返回或设置名称引用的公式。 公式中的用户语言和处于 A1 样式表示法,开头等号。 读/写 String。

RefersToR1C1 属性:返回或设置名称引用的公式。 公式中的宏,语言和处于 R1C1 样式表示法,开头等号。 读/写 String。

RefersToR1C1Local 属性:返回或设置名称引用的公式。 此公式中的用户语言和处于 R1C1 样式表示法,开头等号。 读/写 String。

RefersToRange 属性:返回一个由Name对象引用的**Range** 对象。 只读。

ShortcutKey 属性:返回或设置定义为自定义 Microsoft Excel 4.0 宏命令的名称的快捷键。 读/写 String。

ValidWorkbookParameter 属性:如果指定的Name对象是有效的工作簿参数,则返回True 。 只读 Boolean。

Value 属性:返回或设置一个String值,该值代表公式的规定名称去引用。

Visible 属性:返回或设置一个布尔值, 确定对象是否可见。 读/写。如果将某个名称的Visible属性设置为False, 则该名称将不会出现在 '定义名称' 对话框中。

WorkbookParameter 属性:返回或设置为工作簿参数指定的Name对象。 读/写

Validation对象

代表工作表区域的数据有效性规则。

方法

Add方法:向指定区域添加数据验证。

Delete 方法:删除对象。

Modify 方法:修改指定区域的数据有效性验证。

属性

AlertStyle 属性:返回有效性检验警告样式。 只读的**XlDVAlertStyle**。信息图标,警告图标,禁止图标

Application 属性:

在不使用对象识别符的情况下使用时, 此属性返回代表 Microsoft Excel 应用程序的**Application** 对象。 如果与对象识别符一起使用,则此属性返回代表指定对象的创建者的 Application 对象(可以将此属性与 OLE 自动化对象一起使用以返回该对象的应用程序)。 只读。

Creator 属性:返回一个 32 位整数,该整数指示在其中创建了此对象的应用程序。 只读 Long。

ErrorMessage 属性:返回或设置数据有效性检验错误消息。 读/写 String。

ErrorTitle 属性:返回或设置数据有效性错误对话框的标题。 读/写 String。

Formula1 属性:返回与条件格式或者数据有效性相关联的值或表达式。 可为常量值、字符串值、单元格引用或公式。 只读的字符串。

Formula2 属性:返回与条件格式或数据有效性验证第二部分相关联的值或表达式。 仅在数据验证条件格式**运算符** 属性为xlBetween或xlNotBetween时使用。 可为常量值、字符串值、单元格引用或公式。 只读 String 类型。

IgnoreBlank 属性:如果指定区域内的数据有效性检验允许空值,则该值为 True。 读/写 Boolean。

IMEMode 属性:返回或设置日文输入规则的说明。 可以是下表中列出的**XlIMEMode** 常量之一。 Long 类型,可读写。

InCellDropdown 属性:如果数据有效性显示含有有效取值的下拉列表,则该属性值为 True。 读/写 Boolean。

InputMessage 属性:返回或设置数据有效性检验输入信息。 读/写 String。

InputTitle 属性:返回或设置数据有效性输入对话框的标题。 读/写 String。 限制为32个字符。

Operator 属性:返回一个Long值, 它代表数据有效性的运算符。

Parent 属性:返回指定对象的父对象。 只读。

ShowError 属性:如果用户输入无效数据时显示数据有效性检查错误消息,则该属性值为 True。 读/写 Boolean。

ShowInput 属性:如果用户在数据有效性检查区域内选定了某一单元格时,显示数据有效性检查输入消息,则该属性值为 True。 读/写 Boolean。

Type 属性:返回一个Long值, 它包含一个**XlDVType** 常量, 该常量代表区域的数据类型验证。

 

Value 属性:返回一个布尔值, 该值指示是否满足所有验证条件 (即, 如果该范围包含有效数据)。

PageSetup 对象

代表页面设置说明。PageSetup 对象包含作为特性的所有页面设置属性(左边距、下边距、纸张大小等)。

属性(常用)

AlignMarginsHeaderFooter 属性:返回True excel 以对齐的边距设置页面设置选项中的页眉和页脚。 读/写 Boolean。

BlackAndWhite 属性:如果为true以黑白方式打印文档中的元素。 读/写 Boolean。

BottomMargin 属性:返回或设置下边距的大小, 以磅为单位。 读/写 Double。

CenterFooter 属性:居中对齐PageSetup对象中的页脚信息。 读/写 String。

CenterFooterPicture 属性:返回一个代表页脚的中心部分的图片的**图形** 对象。 用于设置图片的属性。

CenterHeader 属性:居中对齐中的PageSetup对象的头信息。 读/写 String。

CenterHeaderPicture 属性:返回一个代表中心节标头的图片的**图形** 对象。 用于设置图片的属性。

CenterHorizontally 属性:如果在页面的水平居中位置打印指定工作表,则该属性值为 True。 Boolean 类型,可读写。

CenterVertically 属性:True如果在上的垂直居中位置打印工作表。 读/写 Boolean。

DifferentFirstPageHeaderFooter 属性 :True,如此 如果不同的页眉或页脚使用第一页上。 读/写 Boolean。

Draft 属性:如果为true将图形不打印工作表。 读/写 Boolean。

EvenPage 属性:返回或设置工作簿或节的偶数页上的文本对齐方式。

FirstPage 属性:返回或设置工作簿或节的第一页上的文本对齐方式。

FirstPageNumber 属性:返回或设置打印指定工作表时第一页的页号。 如果xlAutomatic, Microsoft Excel 将选择第一个页码。 默认值为 xlAutomatic。 Long 类型,可读写。

FitToPagesTall 属性:返回或设置打印工作表时,对工作表进行缩放使用的页高。 仅应用于工作表。 读/写 Variant。

FitToPagesWide 属性:返回或设置打印工作表时,对工作表进行缩放使用的页宽。 仅应用于工作表。 读/写 Variant。

FooterMargin 属性:返回或设置从页面底部的距离,页脚,以磅为单位。 读/写 Double。

HeaderMargin 属性:返回或设置从页面顶部的距离,页眉,以磅为单位。 读/写 Double。

LeftFooter 属性:返回或设置工作簿或节的左页脚上的文本对齐方式。

LeftFooterPicture 属性:返回一个代表左侧的页脚节的图片的**图形** 对象。 用于设置图片的属性。

LeftHeader 属性:返回或设置工作簿或节的左页眉上的文本对齐方式。

LeftHeaderPicture 属性:返回一个代表左侧标头的各个部分的图片的**图形** 对象。 用于设置图片的属性。

LeftMargin 属性:以磅为单位返回或设置左边距的大小。 读/写Doub

OddAndEvenPagesHeaderFooter 属性 :True 指定的 PageSetup 对象是否的奇数和偶数页不同的页眉和页脚。 读/写 Boolean。

Order属性:返回或设置一个**XlOrder** 值, 该值代表 Microsoft Excel 在打印大型工作表时对页面编号时使用的顺序。

 

Orientation属性:返回或设置一个**XlPageOrientation** 值, 它代表纵向或横向打印模式。

 

Pages属性:返回或设置pages集合中页面的计数或项目号。

PaperSize 属性:返回或设置纸张大小。 XlPaperSize 类型,可读写。

PrintArea 属性:使用采用宏语言的 A1 样式引用,以字符串形式返回或设置要打印的区域。 读/写 String。

PrintComments 属性:返回或设置批注随工作表打印的方式。 读/写**XlPrintLocation**。

PrintErrors 属性:设置或返回一个**XlPrintErrors** 常量, 该常量指定显示的打印错误的类型。 该功能允许用户在打印工作表时取消错误显示。 可读写。

PrintGridlines 属性:True如果在上打印单元格网格线。 仅适用于工作表。 读/写 Boolean。

PrintHeadings 属性:如果为true行和列标题的打印此页。 仅适用于工作表。 读/写 Boolean。

PrintNotes 属性:True如果单元格注释打印作为表的尾注。 仅适用于工作表。 读/写 Boolean。

PrintQuality 属性:返回或设置打印质量。 读/写 Variant。

PrintTitleColumns 属性:返回或设置包含要重复左侧的每一页中,在语言的宏的 A1 样式表示法字符串形式的单元格的列。 读/写 String。

PrintTitleRows 属性:返回或设置那些包含在每一页顶部重复出现的单元格的行,用宏语言字符串以 A1 样式表示法表示。 读/写 String。

RightFooter 属性:返回或设置页的右边缘和页脚的右边界之间的距离 (以磅为单位)。 读/写 String。

RightFooterPicture 属性:返回一个代表页脚的右部分的图片的**图形** 对象。 用于设置图片的属性。

PageSetup.RightHeader 属性:返回或设置页眉的右侧部分。 读/写 String。

RightHeaderPicture 属性:指定应在右侧的标头中显示的图形图像。 只读。

RightMargin 属性:返回或设置的右边距的大小,以磅为单位。 读/写 Double。

ScaleWithDocHeaderFooter 属性:返回或设置如果文档的大小更改时应与文档扩展的页眉和页脚。 读/写 Boolean。

TopMargin 属性:返回或设置上边距的大小,以磅为单位。 读/写 Double。

Zoom属性:返回或设置一个Variant值, 它代表 Microsoft Excel 用于缩放工作表时使用的百分比 (10% 到 400%)。

Hyperlinks 对象

代表工作表或区域的超链接的集合。

方法

add方法:向指定的区域或形状添加超链接。

Delete 方法:删除对象。

属性

Application 属性:在不使用对象识别符的情况下使用时, 此属性返回代表 Microsoft Excel 应用程序的**Application** 对象。 如果与对象识别符一起使用,则此属性返回代表指定对象的创建者的 Application 对象(可以将此属性与 OLE 自动化对象一起使用以返回该对象的应用程序)。 只读。

Count 属性:返回一个 Long 值,它表示集合中对象的数量。

Creator 属性:返回一个 32 位整数,该整数指示在其中创建了此对象的应用程序。 只读 Long。

Item 属性:从集合中返回一个对象。

Parent 属性:返回指定对象的父对象。 只读。

Hyperlink 对象

代表一个超链接。

方法

AddToFavorites 方法:将工作簿或超链接的快捷方式添加到“收藏夹”文件夹。

CreateNewDocument 方法:新建一篇链接到指定超链接的文档。

Delete 方法:删除对象。

Follow方法:显示缓存文档 (如果已下载)。 否则,此方法将解析该超链接,下载目标文档,并在相应的应用程序中显示此文档。

属性

Address 属性:返回或设置一个String值,该值代表目标文档的地址。

Application 属性:在不使用对象识别符的情况下使用时, 此属性返回代表 Microsoft Excel 应用程序的**Application** 对象。 如果与对象识别符一起使用,则此属性返回代表指定对象的创建者的 Application 对象(可以将此属性与 OLE 自动化对象一起使用以返回该对象的应用程序)。 只读。

Creator属性:返回一个 32 位整数,该整数指示在其中创建了此对象的应用程序。 只读 Long。

EmailSubject 属性:返回或设置指定超链接的电子邮件主题行的文本字符串。 主题行追加到超链接的地址。 读/写 String。

Name 属性:返回一个String值,它代表对象的名称。

Parent 属性:返回指定对象的父对象。 只读。

Range 属性:返回一个**range** 对象, 该对象代表指定的超链接所附加到的区域。

ScreenTip属性:返回或设置指定超链接的屏幕提示文字。 读/写 String。

Shape 属性:返回一个**Shape** 对象,它代表附加到指定的超链接的形状。

SubAddress 属性:返回或设置与超链接相关联的文档中的位置。 读/写 String。

TextToDisplay 属性:返回或设置指定超链接显示的文本。 默认值是超链接的地址。 读/写 String。

Type属性:返回一个Long值, 它包含一个**MsoHyperlinkType** 常量, 该常量代表 HTML 框架的位置。

Filter筛选器对象

代表单个列的筛选。Filter对象是 Filters 集合中的成员。 Filters 集合包含自动筛选区域中的所有筛选。

属性

Application 属性:在不使用对象识别符的情况下使用时, 此属性返回代表 Microsoft Excel 应用程序的**Application** 对象。 如果与对象识别符一起使用,则此属性返回代表指定对象的创建者的 Application 对象(可以将此属性与 OLE 自动化对象一起使用以返回该对象的应用程序)。 只读。

Count属性:返回集合中对象的数目。 只读 Long。

Creator 属性:返回一个 32 位整数,该整数指示在其中创建了此对象的应用程序。 只读 Long。

Criteria1 属性:筛选区域中返回指定列的第一个筛选的值。 只读的Variant。

Criteria2 属性:筛选区域中返回指定列的第二个筛选的值。 只读的Variant。

On 属性:True如果位于指定的筛选器。 只读 Boolean。

Operator属性:返回一个**XlAutoFilterOperator** 值, 该值代表关联指定筛选器所应用的两个条件的运算符。

Parent 属性:返回指定对象的父对象。 只读。

Filters 对象

Filter 对象的集合, 该集合代表自动筛选区域中的所有筛选器。

AutoFilter 对象

代表对指定工作表的自动筛选。

方法

ApplyFilter 方法:应用指定的自动筛选对象。

ShowAllData 方法:显示自动筛选对象返回的所有数据。

属性(常用)

FilterMode 属性:如果工作表处于自动筛选模式, 则返回True 。 只读 Boolean 类型。

Filters 属性:返回一个**Filters** 集合, 该集合代表自动筛选区域中的所有筛选器。 此为只读属性。

Range属性:返回一个**range** 对象, 该对象代表应用指定的自动筛选的区域。

Sort属性:获取一个或多个列, 并对AutoFilter集合的排序顺序进行排序。

四、变量与常量

         在VBA中可以使用名称来表示内存的位置,这个名称就是标识符,可以理解为变量和常量的名字。

a、第一个字符必须使用英文字母或中文字符(中文版EXCEL支持中文字符),禁止使用数字

b、名称长度不超过255个字符

c、名称不能与VBA本身的Function过程、语句、即方法的名称相同,避免冲突。如不能使用保留字,如sub,end,if等等

d、不能在同一范围的相同层级中使用重复的名称

e、最好有特定意义,便于使用

f、变量不能使用空格和句号,感叹号等标点符号

变量的概念

变量是用于保存程序运行过程中的临时值,和常量不同的是,在程序运行过程中变量保存的值是可以被改变的。

声明变量

在使用变量时,需要告诉VBA程序变量的名称和数据类型,即声明变量。通常用Dim语句来声明动态变量(还有一种不常用的Static语句来声明静态变量,后面会介绍。)

Dim语句格式如下:Dim 变量名 [ AS  数据类型 ]

声明变量通常都是在程序开始处,可以再同一行声明多个变量,用英文逗号间隔即可。举几个例子:

声明i为整型变量   

Dim i As Integer

声明j为字符串,k为整型变量   

Dim j As String, k As Integer

声明x和y为整型变量   

Dim x, y As Integer

格式中 [AS 数据类型] 是可以省略的,即声明变量时不指定变量的类型。系统会自动将其分配为Variant变量(即变体型),这叫隐式声明。

但在编写代码时不推荐使用隐式声明变量,1、隐式声明变量后,之后变量名如果用错,VBA不会有提示。2、变体型变量占用内存多,会拖累程序运行速度。

所以通常在模块中添加Option Explict语句,要求该模块中所有变量必须先强制声明再使用。(也可以系统中直接设置默认添加这个语句,在VBE的“工具-选项”中,勾选“要求变量声明”再插入新模块时,就会默认有Option Explict语句)

 

变量赋值

为变量赋值就需要用到赋值语句,赋值语句的作用就是对表达式进行运算,并把运算结果赋值给变量或者属性。

表达式为如下(其中let经常都省略):[ let ] 变量或属性的名称=常量值或者表达式

前面用for循环举例时就用过赋值语句,下么我再举例说明下

Sub test()

   Dim i As String 

   Let i = "VB使人快乐"

   MsgBox i

End Sub

声明的了i是字符串变量后,赋值一个字符串,最后用msgbox函数将变量的内容输出。

这里有个例需要说明,除了let语句外,在后期遇到将对象类型赋值给变量的情况时,需要用set语句来赋值,后期遇到时候会再讲解。

变量的作用域

 

 

作用域就是变量使用范围,VBA中有三种级别的作用域,即过程级变量、模块级变量和工程级变量。

通常使用的是过程级变量,也称为局部变量,就是再Sub和End Sub之间编写代码时声明的变量。在过程结束时,占用的内存空间就会释放,有利于节省计算机内存。在不同的过程中可以使用相同名称的过程级变量。

模块级变量时在模块的第一个过程之前使用Dim或者private声明的变量,该模块的所有过程都可以使用这个变量。

工程级的变量时在模块声明部分用puplic来声明,即Public 变量名 As  变量类型。可以在窗体、模块和类模块中都使用工程级变量。

(对于不同级的变量使用的原则,尽量使用过程级变量,如果不同过程之间有共享值时,才使用模块变量,要控制工程级变量的使用数量。)

变量的存活期

变量的存活期就是指变量在内存中保留的时间。那么当程序开始运行时,模块级和工程级的变量就会出现在内存中,而过程级变量时一个SUB过程开始后才储存到内存中,退出SUB过程后,变量占用的内存也会释放。

而当程序退出时,工程级变量、模块级变量和过程级变量占用的变量占用的内存都会释放。

但是如果将变量用static语句声明为静态变量,那么在过程退出时,静态变量仍保存在内存中。过程再运行一遍时,动态变量重置,而静态变量还是上一次过程运行后的结果。

静态变量声明staitc与dim语句的声明格式一样。下面我举例来说明动态变量和静态变量的区别。用Debug.print将运行结果在立即窗口中显示。

 

多次运行这个过程之后,运行的结果在立即窗口中显示,变量默认值为0,第一次运行过程,a和b结果都为1。第一次过程结束后,动态变量a重新变成默认值0,而静态变量b仍为1,第二次运行过程,动态变量a结果1,静态变量结果为2。结束后动态变量由会变成默认值0,而B仍为2,依次类推。只有当程序退出时候静态变量才会重置。

其实模块级变量和工程级变量的结果和静态变量时一样的,只有当程序退出时占用的内存才会释放。

 

常 量  

最后简单说一下常量,在程序运行过程中值不会发生变化,常量可以在程序中直接书写的量。

如果一个常数需要反复用到,比如圆周率3.14,就可以为一个常量命名,定义格式如下:

Const 符号常数名=符号常数或表达式

 

五、数据类型、转换、运算符

数据类型

数据类型转换

VBA提供了15种标准数据类型
数据类型的转换
各种进制转换函数
VB中涉及到的数据进制之间的转换函数主要有如下几个:
Hex 函数: 返回代表十六进制数值的 String;
Oct 函数: 返回代表一数值的八进制值的Variant (String);
Cint函数: 强制将一个表达式转换成-32,768 至 32,767的整型;
CLng函数: 强制将一个表达式转换成-2,147,483,648 至 2,147,483,647的长整型;
Cdec函数: 强制将一个表达式转换成Decimal 数据类型;
CDbl函数: 强制将一个表达式转换成Double 数据类型;
例子:
(1) A=hex(5) 返回5;
(2) B=hex(10) 返回A
(3) C=hex(23) 返回17
(4) D=oct(5) 返回5
(5) E=oct(10) 返回12
(6) F=oct(23) 返回27
(7) G=Cint(&H17) 返回23
(8) H=Cint(&O12) 返回10

运算符

a、算术运算符

以下是VBA支持算术运算符。

假设变量A=5,变量B=10,那么

运算符描述示例
+两个操作数相加A + B = 15
-两个操作数相减A - B = -5
*两个操作数相乘A * B = 50
/两个操作数相除B / A = 2
%模运算符,整数除法后的余数B % A = 0
^指数运算符B ^ A = 100000

 

b、比较运算符

VBA支持的比较运算符如下所示。

假设变量A=10,变量B=20,则 -

运算符描述示例
=检查两个操作数的值是否相等。如果是,那么条件是真。(A = B)结果为:False
<>检查两个操作数的值是否不相等。如果值不相等,则条件为真。(A <> B)结果为:True
>检查左操作数的值是否大于右操作数的值。如果是,那么条件是真。(A > B)结果为:False
<检查左操作数的值是否小于右操作数的值。如果是,那么条件是真。(A < B)结果为:True
>=检查左操作数的值是否大于或等于右操作数的值。 如果是,那么条件是真。(A >= B)结果为:False
<=检查左操作数的值是否小于或等于右操作数的值。如果是,那么条件是真。(A <= B)结果为:True

 

c、逻辑(或关系)运算符

以下由VBA支持的逻辑运算符。

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

运算符描述示例
AND逻辑AND运算符。如果两个条件都为真,则表达式为真。A<>0 AND B<>0结果为:False
OR逻辑OR运算符。如果两个条件中的任何一个为真,则条件为真。A<>0 OR B<>0结果为:True
NOT逻辑NOT运算符。用于反转其操作数的逻辑状态。 如果条件成立,那么逻辑非运算符结果是条件不成立。NOT(a<>0 OR b<>0)结果为:False
XOR

逻辑排除。它是NOTOR运算符的组合。如果表达式中只有一个表达式的值为True,则结果为True
 

(a<>0 XOR b<>0)结果为:True

d、连接运算符

VBA支持以下连接运算符。

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

运算符描述示例
+将两个值添加为变量,其值是数字A + B = 15
&连接两个值A & B = 510

 

假设变量A = "Microsoft",变量B = "VBScript",则 

运算符描述示例
+连接两个值A + B 的结果为MicrosoftVBScrip
&连接两个值A + B 的结果为MicrosoftVBScrip

e、like运算符

Like运算符的语法
Like运算符用于判断给定的字符串是否与指定的模式相匹配,其语法为:
结果=<字符串> Like <模式>
说明:
(1) <字符串>为文本字符串或者对包含文本字符串的单元格的引用,是要与<模式>相比较的字符串,数据类型为String型。
<模式>数据类型为String型,字符串中可以使用一些特殊字符,其它的字符都能与它们相匹配,其如下表1所示。
<模式>的字符                       与<字符串>匹配的文本
?                                          任意单个字符
*                                            零或者多个字符
#                                          任意单个数字(0-9)
[charlist]                                字符列表中的任意单个字符
[!charlist]                               不在字符列表中的任意单个字符
[ ]                                          空字符串(“ “)
(2) <结果>为Boolean型。如果字符串与指定的模式相匹配,则<结果>为True;否则<结果>为False。如果字符串或者模式Null,则结果为Null。
(3) Like运算符缺省的比较模式为二进制,因此区分大小写。可以用Option Compare语句来改变比较模式,如改变为文本比较模式,则不区分大小写。
(4) [Charlist]将模式中的一组字符与字符串中的一个字符进行匹配,可以包含任何一种字符,包括数字;在[Charlist]中使用连字号(-)产生一组字符来与字符串中的一个字符相匹配,如[A-D]与字符串相应位置的A、B、C或D匹配;在[Charlist]中可以产生多组字符,如[A-D H-J];各组字符必须是按照排列顺序出现的;在Charlist的开头或结尾使用连字号(-)与连字号自身相匹配,例如[-H-N]与连字号(-)或H到N之间的任何字符相匹配。
在Charlist中的一个字符或者一组字符前加上!号,表明与该字符或该组字符之外的所有字符匹配,如[!H-N]与字符H-N范围之外的所有字符匹配;而在[]外使用!号则只匹配其自身。要使用任何特殊字符作为匹配字符,只需将它放在[]中即可,例如[?]表明要与一个问号进行匹配。
为了与左括号 ([)、问号 (?)、数字符号 (#) 和星号 (*) 等特殊字符进行匹配,可以将它们用方括号括起来。不能在一个组内使用右括号 (]) 与自身匹配,但在组外可以作为个别字符使用。

以实例来认识Like运算符
下面的代码演示了Like运算符在不同情况下所得的结果。
Sub testLikePattern()
Dim bLike1 As Boolean, bLike2 As Boolean
Dim bLike3 As Boolean, bLike4 As Boolean
Dim bLike5 As Boolean, bLike6 As Boolean
Dim bLike7 As Boolean
bLike1 = "aBBBa" Like "a*a"    ' 返回 True
bLike2 = "F" Like "[A-Z]"    ' 返回 True
bLike3 = "F" Like "[!A-Z]"    ' 返回 False
bLike4 = "a2a" Like "a#a"    ' 返回 True
bLike5 = "aM5b" Like "a[L-P]#[!c-e]"    ' 返回 True
bLike6 = "BAT123khg" Like "B?T*"    ' 返回 True
bLike7 = "CAT123khg" Like "B?T*"    ' 返回 False
MsgBox "Like运算符不同情形匹配结果:" & vbCrLf & " ""aBBBa"" Like ""a*a"" 结果为True." & _
     vbCrLf & """F"" Like ""[A-Z]""结果为True." & _
     vbCrLf & """F"" Like ""[!A-Z]""结果为False." & _
     vbCrLf & """a2a"" Like ""a#a""结果为True." & _
     vbCrLf & """aM5b"" Like ""a[L-P]#[!c-e]""结果为True." & _
     vbCrLf & """BAT123khg"" Like ""B?T*""结果为True." & _
     vbCrLf & """CAT123khg"" Like ""B?T*""结果为False."
End Sub

Like运算符的使用及示例

[示例一] 利用Like运算符自定义字符比较函数
IsLike函数非常简单,如果文本字符串与指定的模式匹配,该函数则返回True,代码如下:
Function IsLike(text As String,pattern As String) As Boolean
   IsLike= text Like pattern
End Function
该函数接受两个参数:
text:字符串或者是对包含字符串的单元格的引用。
pattern:包含有如上表1所示特殊字符的字符串。
函数的使用:在工作表中输入下面所示公式,可以查看函数的结果。
(1)下面的公式返回True。因为*匹配任意数量的字符。如果第一个参数是以“g”开始的任意文本,则返回True:
=IsLike(“guitar”,”g*”)
(2)下面的公式返回True。因为?匹配任意的单个字符。如果第一个参数是以“Unit12”,则返回False:
=IsLike(“Unit1”,”Unit?”)
(3)下面的公式返回True,原因是第一个参数是第二个参数的某个单个字符:
=IsLike(“a”,”[aeiou]”)
(4)如果单元格A1包含a,e,I,o,u,A,E,I,O或者U,那么下面的公式返回True。使用Upper函数作为参数,可以使得公式不区分大小写:
=IsLike(Upper(A1),Upper(“[aeiou]”))
(5)如果单元格A1包含以“1”开始并拥有3个数字的值(也就是100到199之间的任意整数),那么下面的公式返回True:
=IsLike(A1,”1##”)

[示例二] 判断文本框的输入结果
打开一个工作簿,选择菜单“工具——宏——Visual Basic编辑器”或按Alt+F11组合键,打开VBE编辑器。在VBE编辑器中,选择菜单“插入——用户窗体”,新建一个用户窗体,点击控件工具箱中的“文本框”控件和“按钮”控件,在用户窗体上放置一个“文本框”和一个“按钮”,并在用户窗体中对它们的大小和位置进行合理调整,将按钮的标题改为

双击刚创建的“按钮”控件,并输入下面的代码:
Private Sub CommandButton1_Click()
Dim sEnd As String, sPattern As String
sEnd = "in Office"
sPattern = "[F W]*" & sEnd
If TextBox1.Text Like sPattern Then
    MsgBox "输入正确"
Else
    MsgBox "输入错误"
End If
End Sub
示例说明:本代码中[F W]*表示字符以F或W开头的字符串,使用&连接符将其与变量sEnd所代表的字符串“in Office”相连接。如果您在文本框中输入以字符F或字符W开头并以“in Office”结尾的句子,将显示“输入正确”消息框,否则将显示“输入错误”的消息框。在VBE编辑器中点击运行按钮或按F5键,运行该代码试试。当您在文本框中输入“Fanjy in Office”后,单击按钮,将显示“输入正确”消息框。注意,本示例区分大小写。

 

在Excel中实现字数统计
(1) 使用Len工作簿函数进行简单的字数统计
'① - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
'对当前单元格进行字数统计

Sub TotalCellCharNum()
Dim i As Long
i = Len(ActiveCell.Value)
MsgBox "当前单元格的字数为:" & Chr(10) & i
End Sub
'② - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
'对所选的单元格区域进行字数统计

Sub TotalSelectionCharNum()
Dim i As Long
Dim rng As Range
For Each rng In Selection
    i = i + Len(rng.Value)
Next rng
MsgBox "所选单元格区域的字数为:" & Chr(10) & i
End Sub

(2) 使用Like运算符进行较复杂的字数统计
'③ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
'对当前单元格中的文本分类进行字数统计

Sub SubTotalCellCharNum()
Dim str As String, ChineseChar As Long
Dim Alphabetic As Long, Number As Long
Dim i As Long, j As Long
j = Len(ActiveCell.Value)
For i = 1 To Len(ActiveCell)
    str = Mid(ActiveCell.Value, i, 1)
    If str Like "[一-龥]" = True Then
      ChineseChar = ChineseChar + 1 '汉字累加
    ElseIf str Like "[a-zA-Z]" = True Then
      Alphabetic = Alphabetic + 1 '字母累加
    ElseIf str Like "[0-9]" = True Then
      Number = Number + 1 '数字累加
    End If
Next
MsgBox "当前单元格中共有字数" & j & "个,其中:" & vbCrLf & "汉字:" & ChineseChar & "个" & _
     vbCrLf & "字母:" & Alphabetic & "个" & _
     vbCrLf & "数字:" & Number & "个", vbInformation, "文本分类统计"
End Sub
'④ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
'对所选的单元格区域中的文本分类进行字数统计

Sub SubTotalSelectionCharNum()
Dim str As String, ChineseChar As Long
Dim Alphabetic As Long, Number As Long
Dim i As Long, rng As Range, j As Long
For Each rng In Selection
    j = j + Len(rng.Value)
    For i = 1 To Len(rng)
      str = Mid(rng.Value, i, 1)
      If str Like "[一-龥]" = True Then
        ChineseChar = ChineseChar + 1 '汉字累加
      ElseIf str Like "[a-zA-Z]" = True Then
        Alphabetic = Alphabetic + 1 '字母累加
      ElseIf str Like "[0-9]" = True Then
        Number = Number + 1 '数字累加
      End If
    Next
Next
MsgBox "所选单元格区域中共有字数" & j & "个,其中:" & vbCrLf & "汉字:" & ChineseChar & "个" & _
     vbCrLf & "字母:" & Alphabetic & "个" & _
     vbCrLf & "数字:" & Number & "个", vbInformation, "文本分类统计"
End Sub

小结
上面对Like运算符的相关知识进行了介绍,在编写代码的过程中,可以灵活使用Like运算符。例如,可以用来进行字符串的比较,然后进行相应的统计或者执行进一步的操作,或者用来判断用户输入是否正确,以判断程序是否向下运行,等等

五、条件语句

VBA中条件语句分为单条件的判断和多条件的判断

1、单条件判断

if  判断1   then

代码 1    

else   

代码  2    

end if 

当条件成立时执行代码1的操作,否则执行代码2的操作。

举例:

如果A1单元格中的数字大于等于60,B1单元格中显示及格,否则显示不及格。

Sub 判断()

If Range('A1') >= 60 Then

Range('b1').Value = '及格'

Else

Range('b1').Value = '不及格'

End If

End Sub

2、多条件判断

以下是在大多数编程语言中找到的典型条件判断结构的一般形式。

VBA提供了以下类型的条件判断声明

编号语句描述
1if语句一个if语句由一个布尔表达式和一个或多个语句组成。
2if…else语句

if else语句由一个布尔表达式和一个或多个语句组成。如果条件为True,则执行If语句下的语句。如果条件为false,则执行脚本的Else部分。//原文出自【易百教程】,商业转载请联系作者获得授权,非商业转载请保留原文链接:https://www.yiibai.com/vba/vba_decisions.html
 

3if…elseif…else语句

一个if语句,后跟一个或多个else...if语句,它由布尔表达式组成,接着是一个可选的else语句,当所有条件变为false时执行else语句块。//原文出自【易百教程】,商业转载请联系作者获得授权,非商业转载请保留原文链接:https://www.yiibai.com/vba/vba_decisions.html
 

4嵌套if语句一个ifelseif语句中可以嵌套另一个ifelseif语句。
5switch语句一个switch语句允许一个变量与一个值列表进行测试。

条件判断有两种语

1、单条件的判断语句:

学习函数时我们经常用IF来判断,VBA 中也一样。语法如下:

if  判断1   then

代码 1    

else   

代码  2    

end if 

 

当条件成立时执行代码1的操作,否则执行代码2的操作。

举例:

如果A1单元格中的数字大于等于60,B1单元格中显示及格,否则显示不及格。

Sub 判断()

If Range('A1') >= 60 Then

Range('b1').Value = '及格'

Else

Range('b1').Value = '不及格'

End If

End Sub

我们在A1中输入不同数据,然后按F5运行代码试试看B1中的结果。

2、多条件的判断语句

多条件判断有两种语句

1)、

if 判断1 then

代码1

elseif 判断2  then

代码2

elseif 判断3  then

代码3

……

else

end if

 

举例:

如果A1单元格中的数字大于等于85,B1单元格中显示优秀,若大于等于60,B1中显示良好,小于60,显示差。

Sub 多重判断1()

If Range('A1') >= 85 Then

Range('b1').Value = '优秀'

ElseIf Range('A1') >= 60 Then

Range('b1').Value = '良好'

ElseIf Range('A1') < 60 Then

Range('b1').Value = '差'

End If

End Sub

2)、

select case 判断的对象

case (is)条件1           

代码1

case(is)条件2

代码2

……

case ( is) 条件N

代码n

end select

还是上面的例子,我们试试用select case 来写

Sub 多重判断2()

Select Case Range('A1')

Case Is >= 85

Range('b1').Value = '优秀'

Case Is >= 60

Range('b1').Value = '良好'

Case Is < 60

Range('b1').Value = '差'

End Select

End Sub

如果条件是单个自变量,用select case 写起来更加方便,而且在case后面直接写比较运算符时,case后面的is会自动添加上去,代码显得更加简洁。

六、循环语句

VBA提供以下类型的循环来处理循环需求A提供以下类型的循环来处理循环需求

编号循环类型描述
1for循环多次执行一系列语句,缩写管理循环变量的代码。
2for…each循环如果组中至少有一个元素并为组中的每个元素重复执行,则执行此操作。
3while…wend循环这在执行循环体之前测试条件。
4do…while循环do..while语句只要条件为True就会被执行(即,)循环应该被重复直到条件为False
5do…until循环只要条件是Falsedo..Until语句就会被执行(即,)循环应该被重复直到条件为真。

1、For 循环

For循环是一种重复控制结构,它允许开发人员有效地编写需要执行特定次数的循环

语法:

For counter = start To end [Step stepcount]
      [statement 1]
      [statement 2]
      ....
      [statement n]
      [Exit For]
      [statement 11]
      [statement 22]
      ....
      [statement n]

      Next

流程图:

控制流程:

  • For步骤先执行。这一步允许您初始化任何循环控制变量,并递增步进计数器变量。
  • 其次,评估条件。 如果评估结果为:True,则循环体被执行。 如果为False,则循环体不会执行,并且控制流将跳转到紧跟在For循环之后的下一个语句。
  • 在执行For循环体之后,控制流将跳转到下一个语句。 这个语句更新任何循环控制变量。 它根据步计数器值进行更新。
  • 现在条件再次评估。 如果条件为:True,则循环执行并且该过程重复自身(循环体,然后递增步,然后再次条件)。 条件变为False后,For循环终止。

示例:

Private Sub Constant_demo_Click()
      Dim a As Integer
      a =10 
      For i = 0 To a Step 2
            MsgBox ("The value is i is : " & i)
      Next
End Sub

当上面的代码被编译并执行时,会产生类似以下结果。
The value is i is : 0
The value is i is : 2
The value is i is : 4
The value is i is : 6
The value is i is : 8
The value is i is : 10
 

2、For Each 循环

For Each循环用于为数组或集合中的每个元素执行语句或一组语句。
For Each循环与For循环类似; 然而,For Each循环是为数组或组中的每个元素执行的。 因此,这种类型的循环中将不存在步计数器。 它主要用于数组或在文件系统对象的上下文中使用,以便递归操作。

语法:

For Each element In Group
   [statement 1]

   [statement 2]
   ....
   [statement n]
   [Exit For]
   [statement 11]
   [statement 22]

Next

示例:

Private Sub Constant_demo_Click()  
     'fruits is an array
     fruits = Array("苹果", "橙子", "樱桃")
     Dim fruitnames As Varian
     'iterating using For each loop.
     For Each Item In fruits
           fruitnames = fruitnames & Item & Chr(10)
     Next
     MsgBox fruitnames
End 
Sub

当执行上面的代码时,它会在每行中打印一个项目的所有水果名称。

3、while…wend循环

While...Wend循环中,如果条件为True,则会执行所有语句,直到遇到Wend关键字。

如果条件为false,则退出循环,然后控件跳转到Wend关键字后面的下一个语句。

语法:

While condition(s)

       [statements 1]

       [statements 2]
   ...
       [statements n]

Wend

流程图:

示例:

Private Sub Constant_demo_Click()
     Dim Counter :  Counter = 10   
     While Counter < 15     ' Test value of Counter.
          Counter = Counter + 1   ' Increment Counter.
          msgbox "The Current Value of the Counter is : " & Counter
     Wend   ' While loop exits if Counter Value becomes 15.

End Sub

当上面的代码被执行时,它会在消息框中打印以下内容。

The Current Value of the Counter is : 11 
The Current Value of the Counter is : 12 
The Current Value of the Counter is : 13 
The Current Value of the Counter is : 14 
The Current Value of the Counter is : 15

4、do....while循环

语法:

Do While condition
     [statement 1]
     [statement 2]
      ...
     [statement n]
     [Exit Do]
     [statement 1]
     [statement 2]
     ...
     [statement n]
Loop

流程图:

示例:

以下示例使用Do...while循环来检查循环开始处的条件。循环内部的语句只有在条件成立时才被执行。
Private Sub Constant_demo_Click()
   Do While i < 5
      i = i + 1
      msgbox "The value of i is : " & i
   Loop
End Sub
Vb
当上面的代码被执行时,它会在消息框中输出下面的输出。
The value of i is : 1
The value of i is : 2
The value of i is : 3
The value of i is : 4
The value of i is : 5

备用/替代语法

另外还有一个替代语句for...while循环,用于在循环结束时检查条件。下面的例子解释了这两种语法的主要区别。

语法 :
Do 
   [statement 1]
   [statement 2]
   ...
   [statement n]
   [Exit Do]
   [statement 1]
   [statement 2]
   ...
   [statement n]
Loop

While condition

示例:

以下示例使用Do...while循环来检查循环结束时的条件。循环内的语句至少执行一次,即使条件为False

Private Sub Constant_demo_Click() 
   i = 10
   Do
      i = i + 1
      MsgBox "The value of i is : " & i
   Loop While i < 3 'Condition is false.Hence loop is executed once.
End Sub

运行结果为:

The value of i is: 11

5、do...untile循环

语法:

第一种语法:
Do Until 条件式
条件式为True为止,循环处理
Loop

第二种语法:
Do
条件式为True为止,循环处理
Loop Until 条件式
示例:

下面分别针对如上的两种语法,给出相应的例子:
如下代码功能为:'单元格A1~A10内,填入1~10
i = 1
Do Until i = 11
Worksheets("Sheet1").Cells(i, 1).Value = i
i = i + 1
Loop

如下代码的功能为:'单元格A1~A10内,填入1~10

i = 10
Do
Worksheets("Sheet1").Cells(i, 1).Value = i
i = i + 1
Loop Until i = 11

循环控制语句:

循环控制语句从正常顺序改变执行。 当执行离开一个作用域时,循环中的所有其余语句都不会被执行。

VBA支持以下控制语句。

编号控制语句描述
1Exit For 语句终止For循环语句并将执行转移到循环之后的语句
2Exit do  语句终止Do While语句并将执行转移到循环之后的语句

6、Exit For语句

流程图:

示例:

以下使用Exit For语句的示例。 如果计数器(i)的值达到4,则退出For循环,并在For循环之后立即跳转到下一个语句。
Private Sub Constant_demo_Click()
   Dim a As Integer
   a = 10
   For i = 0 To a Step 2 'i is the counter variable and it is incremented by 2
      MsgBox ("The value is i is : " & i)
      If i = 4 Then
         i = i * 10 'This is executed only if i=4
         MsgBox ("The value is i is : " & i)
         Exit For 'Exited when i=4
      End If
   Next
End Sub
Vb
当执行上面的代码时,它将在消息框中输出以下输出。
The value is i is : 0
The value is i is : 2
The value is i is : 4
The value is i is : 40

7、Exit Do 语句

Exit Do被执行时,控制器在Do循环之后立即跳转到下一个语句。

示例:

以下示例演示如何使用Exit Do语句,如果计数器的值达到10,则退出Do循环,并在For循环之后立即跳转到下一个语句。
Private Sub Constant_demo_Click()
   i = 0
   Do While i <= 100
      If i > 10 Then
         Exit Do   ' Loop Exits if i>10
      End If
      MsgBox ("The Value of i is : " & i)
      i = i + 2
   Loop
End Sub
Vb
当上面的代码被执行时,它会在消息框中输出下面的输出。
The Value of i is : 0
The Value of i is : 2
The Value of i is : 4
The Value of i is : 6
The Value of i is : 8
The Value of i is : 10

NOTE2

七、子程序

子程序(Sub Procedures,也叫子过程)与函数类似,但有一些差异。

  a、子过程不需要有返回一个值,而函数可能会或可能不会有返回一个值。
  b、子程序可以不用call关键字来调用。
  c、子程序总是包含在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
Vb
现在只能调用该函数,而不能调用子程序,如下图所示

该区域的面积仅在消息框中计算和显示。

结果单元显示为零,因为计算的面积值不是从函数返回的。简而言之,不能直接在Excel工作表中调用子程序。

八、宏注释

 注释用于记录程序逻辑和用户信息,其他程序员将来可以阅读并理解相同的代码无缝工作。
它包括由开发者,修改者以及还可以包括合并逻辑的信息。 解释器在执行时忽略注释。
VBA中的注释用两种方法表示,它们分别如下 

任何以单引号(')开头的语句都被视为注释。以下是注释的一个例子。
' This Script is invoked after successful login 
' Written by : Yiibai Yiibai
' Return Value : True / False
Vb
任何以关键字"REM"开头的语句。以下是注释的一个例子。
REM This Script is written to Validate the Entered Input 
REM Modified by  : Yiibai Yiibai /user2

九、VBA事件

在VBA中,要手动更改单元格或单元格值范围时,可以触发事件驱动的编程。 更改事件可能会使事情变得更容易,但您可以非常快速地结束一个完整的格式化页面。VBA中有两种事件 -

  • 工作表事件
  • 工作簿事件

1、工作表事件

工作表事件在工作表中发生更改时被触发。 它是通过右键单击工作表选项卡并选择“查看代码”,然后粘贴代码来创建的。

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

以下是可以由用户添加的支持的工作表事件。
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 ("这是一个双击事件触发提示")
End Sub
Vb
双击任何单元格后,消息框将显示给用户,如以下屏幕截图所示。

2、工作簿事件

工作簿事件总是在工作簿发生更改时触发的。可以通过选择“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)
Vb
例子只需要向用户显示一条消息,无论何时创建新的工作表,都会成功创建新的工作表。
Private Sub Workbook_NewSheet(ByVal Sh As Object)
   MsgBox "New Sheet Created Successfully"
End Sub
Vb
在创建一个新的excel工作表后,会向用户显示一条消息,如以下屏幕截图所示。

 

十、VBA错误处理

在(VBScript/VBA)编程中有三种类型的错误:

  • 语法错误
  • 运行时错误
  • 逻辑错误

语法错误:

语法错误(也称为解析错误)发生在VBScript的解释时间。 例如,下面一行导致语法错误,因为它缺少一个右括号。
Function ErrorHanlding_Demo()
   dim x,y
   x = "Yiibai Yiibai"
   y = Ucase(x
End Function
Vb
运行时错误

运行时错误(也称为异常)在执行期间发生,在解释之后。
例如,下面的行会导致运行时错误,因为这里的语法是正确的,但是在运行时它正在尝试调用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
Vb
逻辑错误

逻辑错误可能是最难追查的错误类型。这些错误不是语法或运行时错误的结果。 相反,当您在驱动脚本的逻辑中犯了一个错误,并且没有得到预期的结果时,就会发生这种情况。
你可能无法捕捉到这些错误,因为这取决于业务需求,在程序中加入什么类型的逻辑。
例如,将一个数字除以零,或写入一个进入无限循环的脚本。
Error对象

假设我们有一个运行时错误,那么通过显示错误信息来停止执行。作为开发人员,如果想捕获错误,那么使用Error对象。
例子
在下面的例子中,Err.Number给出错误号,Err.Description给出错误描述。
Err.Raise 6   ' Raise an overflow error.
MsgBox "Error # " & CStr(Err.Number) & " " & Err.Description
Err.Clear   ' Clear the error.
Vb
错误处理

VBA启用错误处理例程,也可以用来禁用错误处理例程。没有On Error语句,发生的任何运行时错误都是致命的:显示错误消息,并且执行突然停止。
On Error { GoTo [ line | 0 | -1 ] | Resume Next }

编号关键字描述
1GoTo line

启用在所需的行参数中指定的行开始的错误处理例程。指定的行必须与On Error语句在相同的过程中,否则将发生编译时错误。//原文出自【易百教程】,商业转载请联系作者获得授权,非商业转载请保留原文链接:https://www.yiibai.com/vba/vba_error_handling.html
 

2GoTo 0禁用当前过程中启用的错误处理程序并将其重置为Nothing
3GoTo -1禁用当前过程中启用的异常并将其重置为Nothing
4Resume 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将单元格的内容写入文本文件。VBA允许用户使用两种方法处理文本文件 -

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

1、文件系统对象(FSO)

FSO对象帮助开发人员使用驱动器,文件夹和文件

编号对象类型描述
1DriveDrive是一个对象。 包含收集有关连接到系统的驱动器的信息的方法和属性。
2DrivesDrives是一个集合。 它提供了连接到系统的驱动器的物理或逻辑列表。
3FileFile是一个对象。 它包含允许开发人员创建,删除或移动文件的方法和属性
4FilesFiles是一个集合。 它提供了一个文件夹中包含的所有文件的列表。
5FolderFolder是一个对象。 它提供了允许开发人员创建,删除或移动文件夹的方法和属性。
6FoldersFolders是一个集合。 它提供了一个文件夹内所有文件夹的列表。
7TextStreamTextStream是一个对象。 它使开发人员能够读写文本文件。

Drive

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

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

示例:

第1步 - 在使用FSO进行脚本编写之前,应该启用Microsoft脚本运行时。请导航到工具->引用,如以下屏幕截图所示。

第2步 - 添加“Microsoft脚本运行时间”,然后单击确定。

第3步 - 添加想要写入文本文件中的数据,这里添加一个命令按钮。

第4步 - 现在运行脚本。

Sub CommandButton1_Click()
   Const ForReading = 1, ForWriting = 2, ForAppending = 3
   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

    ' Create a TextStream.
   Set fso = CreateObject("Scripting.FileSystemObject")
   Set stream = fso.OpenTextFile("F:\worksp\vba\Support.log", ForWriting, True)

   CellData = ""
   ' LastRow = 3
   LastCol = 3
   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文件的创建方式如下面“F:\worksp\vba”的目录,如下的截图所示。

该文件的内容,如以下屏幕截图中所示 - 
The Value at location (1,1)姓名
The Value at location (1,2)性别
The Value at location (1,3)城市
The Value at location (2,1)张三
The Value at location (2,2)男
The Value at location (2,3)北京
The Value at location (3,1)李四
The Value at location (3,2)男
The Value at location (3,3)北京
The Value at location (4,1)王五
The Value at location (4,2)男
The Value at location (4,3)上海
The Value at location (5,1)李小丽
The Value at location (5,2)女
The Value at location (5,3)深圳
The Value at location (6,1)Linsa
The Value at location (6,2)女
The Value at location (6,3)深圳

2、Write命令

与FSO不同,不需要添加任何引用,但是,我们将无法使用驱动器,文件和文件夹。也能够将流添加到文本文件。

示例:

Sub CommandButton1_Click()
   Const ForReading = 1, ForWriting = 2, ForAppending = 3
   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 = "F:\worksp\vba\write.txt"
   Open FilePath For Output As #2

   CellData = ""
   LastCol = 3
   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

执行该脚本时,将在“F:\worksp\vba”位置创建“write.txt”文件,如以下屏幕截图所示。

该文件的内容显示如以下屏幕截图

 

十二、VBA生成图标示例

使用VBA,可以根据特定标准生成图表。下面通过一个例子来看看它如何实现

第1步 - 输入要生成图形的数据。

第2步 - 创建3个按钮 - 一个生成条形图,另一个生成饼图,另一个生成柱形图。

第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步 - 点击相应的按钮,图表被创建。 在下面的输出中,点击生成饼图按钮。

十三、VBA自定义函数

函数是一组可重复使用的代码,可以在程序中的任何地方调用。这消除了一遍又一遍地编写相同的代码的需要。这使程序员能够将一个大程序划分成许多小的可管理的功能模块。
除了内置函数外,VBA还允许编写用户定义的函数。 在本章中,我们将学习如何在VBA中编写自己的函数。

1、函数定义

一个VBA函数可以有一个可选的return语句。如果要从函数返回值,则可使用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
调用函数

要调用函数,请使用函数名称调用函数,如以下屏幕截图所示。

计算面积的结果输出如下所示将显示给用户。

十四、数组

1、声明:

我们都知道,一个变量是一个存储值的容器。 有时,开发人员希望一次可以在一个变量中保存多个值。 当一系列值存储在单个变量中时,则称为数组变量。
数组声明数组声明的方式与声明变量相同,只是数组变量的声明使用括号。 在下面的例子中,括号里提到了数组的大小。参考以下示例 - 
'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")

在上面代码中,

a、虽然数组大小被指定为5,但是当数组索引从零开始时,它可以保持6个值。
b、数组索引不能是负数。
c、VBScript数组可以在数组中存储任何类型的变量。因此,一个数组可以在一个数组变量中存储一个整数,字符串或字符。

2、赋值

通过为每个要分配的值指定一个数组索引值,将这些值分配给数组。它可以是一个字符串。

示例:

添加一个模块并添加以下代码 - 
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

3、多维数组

数组不仅限于一个维度,但它们最多可以有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

4、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
Vb
当执行上面的函数时,它会产生下面的输出。
XYZ
41.25
22
3
4
5
6
7

5、数组方法

VBScript中有各种内置函数,可以帮助开发人员有效地处理数组。 下面列出了与数组一起使用的所有方法。

 

编号方法描述
1LBound它返回一个整数,对应于给定数组的最小下标。
2UBound它返回一个整数,对应于给定数组的最大下标。
3Split它返回一个包含指定数量值的数组。根据分隔符分割。
4Join它返回一个包含数组中指定数量的子串的字符串。这是Split方法的一个完全相反的功能。
5Filter它返回一个基于零的数组,该数组包含基于特定过滤条件的字符串数组的子集。
6IsArray它返回一个布尔值,表示输入变量是否是一个数组。
7Erase为数组变量恢复分配的内存。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/625244
推荐阅读
相关标签
  

闽ICP备14008679号