说明:本篇内容由SudoMe根据AutoCAD官方开发文档整理修改而来,如有内容表述不准确或理解错误的,请及时反馈。
书写规定
长语句续行
语句的长度其实没有明确的限制,但窗口的尺寸却有限。为了使语句具有更好的可读性,往往在编写代码语句时,将一个长语句行断为两行或多行,断行处要用下划线"_”连接,下划线左右至少应有一个空格。如下所示:
MsgResult = MsgBox(“请选择 ‘是 ’或 ‘否 ’,决定是否打印图形文件 ” _
vbYesNo + vbQuestion + vbDefaultButton2)
注释语句
使用英文状态下的单撇号‘
作为注释语句的开始,注释语句不会编译和执行。
大小写的约定
关键字、类对象名、内置常数符号等,字母的大小写有特定的设定,无须用户干涉,也不论用户怎么书写,均按系统规定的形式显示,如:Dim blkObj As AcadBlock
。
从功能上讲,代码中字母的大小写一般不会影响程序的运行,使用大小写,目的也是为了提高代码的可读性。如上语句,当你声明对象变量为bikObj之后,在后续代码输入中,不论你全部用大写字母,还是全部用小写字母,总是只有字母0为大写,其余均为小写。
引用参考:文档约定 (VBA) | Microsoft Learn
对象、属性、方法和事件
对象
对象(Object)是VB程序设计的核心。窗体、控件、屏幕、打印机、数据库和应用程序等都是对象。(一切皆对象)
属性
属性是对象的特征。
- 设置属性值 设置属性的方法有两种,一种是直接在【属性】窗口设置属性的值而无须编写任何代码,另一种是通过代码在运行时设置。设置属性采用
对象.属性=属性值(或表达式)
语法。 - 读取属性值 对象的属性值可以赋给变量,或称读取属性值。使用
变量=对象.属性
语法。 - 读写属性与只读属性 在运行时可以设置并可获得值的属性叫做读写属性。在运行时只能读取的属性叫做只读属性。只读属性在属性窗口设置。
例如,在AutoCAD中Circle对象的Center属性表示位于圆心在3D世界坐标系中的坐标。更改圆心,只需将属性设置为新坐标。
方法
对象可调用的过程称为方法,对象用方法来执行动作。
- 如果方法不要求参数,则用
对象.方法
语法。 - 如果方法要用多个参数,就用逗号将它们分开。
- 如果要保存方法的返回值,就必须把参数用括号括起来。
- 如果没有返回值,则参数不会出现在括号中。
例如,在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数据结构”字样,虽然答案不多,但是找到一条类似的分类,如下图所示:
为什么不是直接以数组为大标题,更主要的原因在其他编程语言里还有类似存在,比如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属性包含通常显示的错误消息。