第四章 VB/VBA语法基础知识

说明:本篇内容由SudoMe根据AutoCAD官方开发文档整理修改而来,如有内容表述不准确或理解错误的,请及时反馈。

书写规定

长语句续行
语句的长度其实没有明确的限制,但窗口的尺寸却有限。为了使语句具有更好的可读性,往往在编写代码语句时,将一个长语句行断为两行或多行,断行处要用下划线"_”连接,下划线左右至少应有一个空格。如下所示:

MsgResult = MsgBox(“请选择 ‘是 ’或 ‘否 ’,决定是否打印图形文件 ” _
 vbYesNo + vbQuestion + vbDefaultButton2)

注释语句
使用英文状态下的单撇号作为注释语句的开始,注释语句不会编译和执行。

大小写的约定
关键字、类对象名、内置常数符号等,字母的大小写有特定的设定,无须用户干涉,也不论用户怎么书写,均按系统规定的形式显示,如:Dim blkObj As AcadBlock
从功能上讲,代码中字母的大小写一般不会影响程序的运行,使用大小写,目的也是为了提高代码的可读性。如上语句,当你声明对象变量为bikObj之后,在后续代码输入中,不论你全部用大写字母,还是全部用小写字母,总是只有字母0为大写,其余均为小写。
引用参考:文档约定 (VBA) | Microsoft Learn

对象、属性、方法和事件

对象
对象(Object)是VB程序设计的核心。窗体、控件、屏幕、打印机、数据库和应用程序等都是对象。(一切皆对象)

属性
属性是对象的特征。

  1. 设置属性值 设置属性的方法有两种,一种是直接在【属性】窗口设置属性的值而无须编写任何代码,另一种是通过代码在运行时设置。设置属性采用对象.属性=属性值(或表达式)语法。
  2. 读取属性值 对象的属性值可以赋给变量,或称读取属性值。使用变量=对象.属性语法。
  3. 读写属性与只读属性 在运行时可以设置并可获得值的属性叫做读写属性。在运行时只能读取的属性叫做只读属性。只读属性在属性窗口设置。
    例如,在AutoCAD中Circle对象的Center属性表示位于圆心在3D世界坐标系中的坐标。更改圆心,只需将属性设置为新坐标。

方法
对象可调用的过程称为方法,对象用方法来执行动作。

  1. 如果方法不要求参数,则用对象.方法语法。
  2. 如果方法要用多个参数,就用逗号将它们分开。
  3. 如果要保存方法的返回值,就必须把参数用括号括起来。
  4. 如果没有返回值,则参数不会出现在括号中。

例如,在AutoCAD中Circle对象的Offset方法可以在距现有圆的指定偏移距离处创建新对象。

事件
事件是可被对象识别的动作,例如单击鼠标、文本框中的文字改变、加载或卸载窗体等都是事件。通过向对象的事件过程中添加代码,使得应用程序可以响应该对象的事件。当对象的事件被激发时,VB执行对象的事件过程中的代码。
引用参考:理解对象、方法、属性和事件 (VBA) | Microsoft Learn
引用参考:在代码中使用括号 (VBA) | Microsoft Learn

变量与常量

变量说明

任何编程语言都离不开变量。变量用来指定内存中的某一位置及大小,在变量的有效期内,该位置为用户保存特定的数据,直到该变量被释放。要正确地使用变量,有两个要素:确定变量的类型及在程序中声明变量。

  • 变量的类型(货架) 变量能够保存任何数据,比如一个数字、文本字符串、日期等,甚至对象的一个实例,比如窗体控件、数据库对象等,而保存对象实例的变量,我们称之为对象变量。但由于数字、字符串或对象实例等数据,从结构到形式都有很大的不同,因此,在使用变量保存这些数据时,程序需要知道某一变量要用来存放哪一类数据,即要明确变量的类型。
  • 变量声明 变量在程序中使用时,程序必须知道该变量用来的数据类型,这就是变量声明。对于VB和VBA你可以只声明一个变量,而不定义它的数据类型,此时程序就将未声明的变量定义成变体(Variant)类型。如果我们在使用某个变量时,想明确知道它的类型,最好给出明确的声明。

数据类型

VB中常见的数据类型有字节型(Byte)、整数型(Integer)、长整数型(Long)、单精度浮点型(Single)、双精度浮点型(Double)、货币型(Currency)、小数型(Decimal)、字符串型(String)、日期型(Date)、布尔型(Boolean)等。

定义数据类型的优点如下:

  • 便于内存管理
    (举例:房间的货架)
  • 便于程序进行计算(数值型)和其它使用(非数值型)
    (举例:对比梦诚和我们的钢筋与其他的计算分类)

1. 字符串 String
字符串是用于保存文本数据的,字符串内容应放置于双引号内。

2. 数字类型
VBA中用于表示数字的数据类型有4种:整型 Integer、长整型 Long、单精度浮点型 Single、双精度浮点型 Double。整型及长整型用于表示整数,单精度与双精度浮点型都用于表示小数。
整型与长整型的区别在于两者所能表示的数值范围不同:

  • 整型数据能表示的数据范围:-32768 ~ 32767
  • 长整型数据能表示的数据范围:-2147483648 ~ 2147483647

单精度浮点数与双精度浮点数除了在数值范围不同之外,两者所能表示的数据精度(即小数点后多少位)也是不同

  • 单精度浮点型能表示的数据范围
    在表示负数时: -3.402823E38 ~ -1.401298E-45
    在表示正数时: 1.401298E-45 ~ 3.402823E38
  • 双精度浮点型能表示的数据范围
    在表示负数时: -1.79769313486231E308 ~ -4.94065645841247E-324
    在表示正数时: 4.94065645841247E-324 ~ 1.79769313486231E308

反正一句话,它们可以表示非常大的数据,但要注意的时,单精度浮点型其精度是6,即只能保存小数点后最多6位的数据;双精度浮点型其精度是14,即只能保存小数点后最多14位的数据。如果超出以上长度,则超出部分会被去掉,并且会自动四舍五入。

3. 日期型 Date
日期型数据不仅可以表示日期,还可以表示时间。可以表示的日期范围是:100年1月1日 ~ 9999年12月31日;可以表示的时间范围是:0:00:00 ~ 23:59:59。

4. 布尔型 Boolean
布尔型数据用于表示逻辑值:真、假 。其中“真”为True,“假”为False。布尔值数据常用于条件判断语句。应当注意的是,当其它数据类型转换为布尔值时,0会转成False,其它值则变成True。当把布尔值转换成其他数据类型时,False会转换为0,True则是-1。

5. 变体型 Variant
变体型数据是一种特殊的数据类型,几乎可以用于保存所有其它数据类型的数据。可以简单地理解为:当不知道变量所要表示的数据是什么类型时,就把它定义为Variant。

变量声明

变量的声明在形式上有显式声明、隐式声明和用户自定义类型声明3种。

显式声明

Dim 变量名1 As 变量类型1
Private 变量名1 As 变量类型1
Public 变量名1 As 变量类型1

Dim、Private和Public是声明变量的关键字。

  • Dim关键字
    可用于模块级和过程级声明变量。在模块级声明的变量可用于该模块的所有过程中,而在过程级声明的变量只能用于该过程。
  • Private关键字
    只能在模块级声明变量,效果与Dim一样 ,所以很少使用 。
  • Public关键字
    必须放在模块级声明变量。Public变量在整个工程内的所有模块和窗体中可用,使用时应特别注意。

注意:固定长度字符串的声明格式如下:Dim 变量名 As String*strLength

隐式声明
变量的隐式声明要求,在首次分配变量值时,在变量的结尾处使用一种特殊的字符,例如:IntVal%=1。
以下为变量类型与标识字符表:

变量类型 标识字符
整型 %
长整型 &
单精度 !
双精度 #
货币型 @
字符串 $

自定义类型声明
用户自定义数据类型,可使用户创建包含混合信息。

[Public] Type 变量名
    元素 1 As 数据类型 1
    元素 2 As 数据类型 2
End Type</pre>

以下为代码示例:

Type Employee
    FirstName As String
    LastName As String
    Salary As Single
End Type

Public Sub User_Defined()
    Dim NewEmployee As Employee
    Dim FullName As String
    NewEmployee.FirstName = "John"
    NewEmployee.LastName = "Dole"
    NewEmployee.Salary = 3500
    FullName = NewEmployee.FirstName & "," & _
NewEmployee.LastName
    MsgBox FullName & "的月薪是" & NewEmployee.Salary
End Sub

注意:Option Explicit是强制变量声明语句。
引用参考:声明变量 (VBA) | Microsoft Learn

常量声明

常量的区别在于,常量符号代表的数据不能在程序的运行过程中被修改。常量符号可以自定义,也可以使用VBA定义的内置常量符号。语法如下:

Const 常量名称 As 数据类型 = 值

数据结构

在语法基础知识里还有一个比较重要的内容,就是数组。但是在章节内容编写的时候,忽然觉得不知道将它如何归类,因为它严格来说不属于数据类型,个人理解更像是数据结构,于是不严谨的在百度检索了“VB数据结构”字样,虽然答案不多,但是找到一条类似的分类,如下图所示:


ActiveX-数据结构.png

为什么不是直接以数组为大标题,更主要的原因在其他编程语言里还有类似存在,比如Python里的数组、列表、字典等,主要是保持个人的知识框架和思路。

数组

定义数组的目的,是可以用相同名字引用一系列变量,并用索引号来识别它们。在许多场合,利用索引值设计一个循环,可以缩短和简化程序。数组分为固定大小的数组与动态数组两种类型。

固定大小数组
待补充

动态数组
待补充
引用参考:声明数组 (VBA) | Microsoft Learn

基本语句

赋值语句
常见的语法格式为:变量=表达式。对象变量的赋值必须使用Set关键字。其语法格式如下:set 对象变量 =对象运算表达式,以下为示例:

Set blkobj = ThisDrawing.Blocks.Add("TestBlock")

引用参考:(VBA) 创建对象变量 | Microsoft Learn
引用参考:(VBA) 编写赋值语句 | Microsoft Learn

IF条件语句

语法格式1:
If condition Then Command
语法格式2:
If condition Then
    Code Lines 1
    [Else]
    [Code Lines 2]
End If
语法格式3:
If condition1 Then
    Code Lines 1
ElseIf condition2 Then
    Code Lines 2
    [Else]
    [Code Lines n]
End If

引用参考:使用 If...Then...Else 语句 (VBA) | Microsoft Learn

Select Case语句

Select Case compvalue
    Case valuel
    Code Lines 1
    Case value2
    Code Lines 2
    [Case Else ]
    [Code Lines n]
End Select

引用参考:(VBA) 使用 Select Case 语句 | Microsoft Learn

Do...Loop语句

语法格式1:
Do While condition
    Code Lines
Loop
语法格式2:
Do Until condition
    Code Lines
Loop
语法格式3:
Do
    Code Lines
Loop While condition
语法格式4:
Do
    Code Lines
Loop Until condition

引用参考:使用 Do...VBA) (循环语句 | Microsoft Learn

For...Next语句

For counter = s_value To e_value[ Step stepvalue]
    Code Lines
Next [counter]

引用参考:使用 For...下一个语句 (VBA) | Microsoft Learn

For Each...Next语句

For Each Object In collection
    Code Lines
Next [Object]

引用参考:使用 For Each...Next 语句 (VBA) | Microsoft Learn

With...End With语句
从严格意义上说,With...End With语句不是一个控制语句,它是一种简化对象对属性引用的结构语句。

With Object
    Statements
End With</pre>

引用参考:(VBA) 使用 With 语句 | Microsoft Learn

Goto语句
Goto语句是一个无条件跳转语句,它可以使程序的执行指针,转移到任意一条语句上。
语法格式:Goto Line_tag,其中的Line_tag是一个行标志或行号。行标志的名称由编程者设定,以冒号“:”结束。在一个过程中可以使用许多行标志,但每一个行标志必须有一个唯一的名称。
引用参考:GoTo 语句 (VBA) | Microsoft Learn

Exit语句

  • Exit Do:能够跳出一个 Do...Loop 循环。
  • Exit For:能够跳出一个 For...Next 或 For Each...Next 循环。
  • Exit Function:可以结束包含本语句的函数过程。
  • Exit Property:可以结束包含本语句的属性过程。
  • Exit Sub:可以结束包含本语句的 Sub 过程。

On Error语句

  • On Error Resume Next:忽略错误时,使用此语句。此语句捕获错误,而不是显示错误消息并终止程序,它只是移动到下一行代码并继续处理。
  • On Error GoTo Label:想要编写显式错误处理程序时,将使用此语句。此语句捕获错误,并跳转到代码中的特定位置,而不是显示错误消息并终止程序,特定位置的代码可以通过适合的方式响应错误。
  • On Error GoTo 0:取消当前错误处理程序。On Error Resume Next和On Error GoTo Label语句将一直有效,直到子过程结束、声明另一个错误处理程序或使用On Error GoTo 0语句取消错误处理程序。

On Error Resume Next示例:

Sub Ch11_ColorEntities()
    Dim entry As Object
    On Error Resume Next
    For Each entry In ThisDrawing.ModelSpace
        entry.Color = acRed
    Next entry
End Sub</pre>

On Error GoTo Label示例:

Sub Ch11_ColorEntities2()
    Dim entry As Object
    On Error GoTo MyErrorHandler
    For Each entry In ThisDrawing.ModelSpace
        entry.Color = acRed
    Next entry
    Exit Sub
MyErrorHandler:
     Msgbox entry.EntityName + " is on a locked layer." + _
     " The handle is: " + entry.Handle
     Resume Next
End Sub

关于处理错误
对于VB和VBA,对错误的默认反应是显示错误消息并终止应用程序,但这是不够的,可能存在要忽略的错误,或者要提供特殊响应的错误。通常,只要需要用户输入以及使用文件I/O,就必须进行错误处理。

应用程序中主要有以下类型错误:

  • 编译时错误:发生在应用程序的创建过程中。这些错误主要由语法错误、变量范围问题或数据类型问题组成。在VBA中,开发环境会捕获这些类型的错误并高亮显示。
  • 运行时错误:一般更难查找和更正。它们发生在代码执行期间,通常涉及从用户接收信息。例如,如果应用程序要求用户输入图形的名称,而用户输入不存在的图形的名称,则会发生运行时错误。若要有效地处理运行时错误,必须预测可能发生的问题类型,捕获它们,然后编写代码来处理这些情况。
  • 逻辑错误:是最难发现和纠正的。逻辑错误的症状包括没有编译时错误和运行时错误,但程序的结果仍然不正确。

VB和VBA提供Err对象捕获错误类型的信息。Err对象具有多个属性:Number、Description、Source、HelpFile、HelpContext和LastDLLError。Err对象最重要的属性是“Number”和“Description”属性。Number属性包含与错误关联的唯一错误代码,而Description属性包含通常显示的错误消息。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,233评论 6 495
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,357评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,831评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,313评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,417评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,470评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,482评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,265评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,708评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,997评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,176评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,827评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,503评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,150评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,391评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,034评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,063评论 2 352

推荐阅读更多精彩内容