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条件语句

语法格式1If condition Then Command
语法格式2If condition Then
    Code Lines 1
    [Else]
    [Code Lines 2]
End If
语法格式3If 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语句

语法格式1Do While condition
    Code Lines
Loop
语法格式2Do Until condition
    Code Lines
Loop
语法格式3Do
    Code Lines
Loop While condition
语法格式4Do
    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属性包含通常显示的错误消息。

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空