VBA编程基础1:注释、变量、数据类型、赋值运算

VBA语言元素

首先是一个简单的VBA Sub过程,包含典型VBA语言元素。

Sub VBA_Demo()
'注释:这是一段VBA代码示例
  Dim Total As Long,  i As Long
  Total = 0
  For i = 1 To 100
    Total = Total + i
  Next i
  MsgBox Total
End Sub

以上过程中包含部分常见VBA语言元素:

  • 一行注释,注释行使用单引号开头
  • 一行变量声明语句,以 Dim 开头
  • 两个变量, Total 和 i
  • 两条赋值语句,Total = 0 和 Total = Total + i
  • 一个循环结构,For-Next 结构
  • 一个VBA函数,MsgBox 函数

通常每行写一条指令,但不强制遵守。在一行中可以用冒号隔开多条指令;对于稍长的代码可以使用空格和下划线组成的VBA换行连续序列。例如:

Sub OneLine()
' 使用“:”在一行中分隔多条指令
  x = 1: y = 2: z = 3: MsgBox x + y + z
End Sub
Sub LongLine()
' 使用空格加下划线可以实现代码连续换行,便于阅读
  SumValue =  _
    Worksheets("Sheet1").Range("A1").Value + _
    Worksheets("Sheet2").Range("A1").Value
End Sub

注释

VBA注释以(英文)单引号开始,“注释”是嵌入代码中的描述性文本。使用注释可以清晰描述编程思路(代码功能),便于修改和阅读代码。注释可以占用整行,也可以在代码后插入注释。为发挥注释作用,以下是一些常规提示:

  • 使用注释描述变量的目的
  • 使用注释简要描述每个过程的目的。
  • 使用注释描述对过程所做的修改。
  • 使用注释指出非标准(或常规)方式使用的函数或构件。
  • 写完代码后加注释,不如编写代码的同时写注释。
Sub CommentDemo()
'这是一个没有实际作用的过程
  x = 0  'x没有任何含义
'显示结果
  MsgBox x
End Sub

变量、数据类型和常量

“变量”是一些已命名的位于计算机内存中的存储位置,在程序执行过程中变量的值可能发生变化。“数据类型”指如何把数据存储到内存中, 如作为整数、实数或字符串等等。有时候需要引用不发生变化的值或字符串,即“常量”。

变量

尽可能用描述性的词语定义变量名称,会比较直观。此外,VBA规定了一些变量命名规则:

  • 第一个字符必须是字母,可以使用字母,数字和一些标点符号。
  • VBA变量名称不区分大小写。建议使用帕斯卡(Pascal)命名法,做法是首字母大写,如:UserName。
  • 变量名中不能包括空格和句点。有时为了可读性,可用下划线,如:User_Name。
  • 不能在变量名中嵌入特殊类型的声明字符,如#、$、%、&或!。
  • 变量名最多可以包含254个字符,但不推荐过长的变量名。

下面是一些赋值表达式,等号左侧是变量名称。每条表达把右边的值赋给左侧的变量:

x = 1
InterestRate = 0.065
DataUpdated = False
x = x + 1
'日期总是使用“月/日/年”格式定义
DateEnd = #12/31/2018#  
UserName = "哎喂可乐"

定义数据类型

VBA 内置的数据类型如下:

数据类型 所使用的字节 数值的范围
Byte 1个字节 0-255
Boolean 2个字节 True或False
Integer 2个字节 -32 768~32 767
Long 4个字节 -2 147 483 648~2 147 483 647
Single 4个字节 负值:-3.402 823E38~-1.401 298E-45
正值:1.401 298E-45~3.402 823E38
Double 8个字节 负值:-1.797 693 134 862 32E308~-4.940 656 458 412 47E-324
正值:4.940 656 458 412 47E-324~1.797 693 134 862 32E308
Currency 8个字节 -992 337 203 685 477.5808~992 337 203 685 477.5807
Decimal 12个字节 不带小数位时+/-79 228 162 514 264 337 593 543 950 335
带28个小数位时+- 7.922 816 251 426 433 759 354 395 033 5
Date 8个字节 0100年1月1日~9999年12月31日
Object 4个字节 任意对象的引用
String(变长) 10个字节+字符串的长度 0~大约20亿个字符
String(定长) 字符串的长度 1~大约65400个字符
Variant(数字) 16个字节 最大到双精度(Double)数据类型的任意数值。也可以保存诸如Empty、Error、Nothing和Null之类的特殊数值。
Variant(字符) 22个字节+字符串的长度 0~大约20亿
用户自定义 因元素类型而异 因元素类型而异

如果不为VBA中使用的某个变量声明数据类型,将默认使用Variant类型,存储为Variant类型的数据行根据处理内容不同将改变数据的类型。尽管VBA可以自动维护数据类型,但是会导致执行速度慢以及内存使用效率不高等问题。因此,最好将变量显示的声明为某种特定的数据类型,为了强制声明使用的所有变量,可在VBA模块中使用以下语句作为第一条指令:

Option Explicit

局部变量:在过程中声明的一种变量,只能作用才声明它的过程中。过程结束时,局部变量不复存在。

Sub MySub()
' 使用Dim关键字声明局部变量
  Dim TodayDate As Date
  Dim UserName As String * 50  '限定字符串最大长度为50
  Dim TextData  As String      '变长字符串

  ' 可以用一条Dim语句声明多个变量
  Dim First As Long, Last As Double 
End Sub

模块作用域下的变量:在模块的所有过程中都可以使用的变量,只要在模块的第一个过程之前(在任何过程或函数外)声明变量即可。

Dim UserName As String '模块作用域下,MySub1()和MySub2()过程中都可以使用
Sub MySub1()
  ' 第一个过程的代码
End Sub
Sub MySub2()
  ' 第二个过程的代码
End Sub

公共变量:在项目的所有VBA模块的所有过程中都可以使用的变量,需要声明在模块层次上(第一个过程之前),使用Public关键字声明而不是使用Dim声明。例如:

Public FileName as Double '公共变量

静态变量:比较特殊,这些变量在过程层次上进行变量的声明,过程结束时静态变量保持它们的值不变。如果有一条End语句终止了该过程,静态变量将丢失它们的值。注意,End语句与End Sub语句并不相同。使用Static关键字可以声明静态变量:

Sub MySub()
  Static Counter As Long '静态变量
  ' 过程的代码
End Sub

常量

使用Const关键字来声明常量。用常量代替硬编码的值或者字符串是一个非常好的习惯,可以使代码更具可读性且便于修改。比如,PI=3.1415926, 或者多次引用某个利率Rate等。

Const AppName = "哎喂可乐"
Const FirstDay As Date = #1/1/2018#
Const LunchTime = #12:00:00#
Const Rate = 0.065, Period = 12

与变量类似,常量也有作用域。可以在Sub或Function语句后声明局部常量,或使用Public关键字声明公共常量。

Public Const InterestRate As Double = 0.065

赋值语句

“赋值语句”是一条VBA指令,它进行数学(函数)计算并将结果赋给某个变量或对象。VBA使用等号(=)作为赋值运算符。以下为赋值语句示例:

x = 1
x = x+1
x = (y * 3) / (z - 4)
FileClosed = True
FileClosed = Not FileClosed 
Range("A1").Value = 2018

使用小括号()可改变运算的优先级,默认运算符的优先级如下:

运算符 运算 优先级
^ 幂运算(乘方) 1
*和/ 乘和除 2
+和- 加和减 3
& 字符串连接 4
=、<、>、<=、>=、<> 比较 5

此外,VBA提供了逻辑运算符(具体信息及实例可查看VBA帮助系统):

运算符 用途
Not 执行表达式的逻辑“非”运算
And 执行两个表达式的逻辑“与”运算
Or 执行两个表达式的逻辑“或”运算
Xor 执行两个表达式的逻辑“异或”运算
Eqv 执行两个表达式的逻辑“等价”运算
Imp 执行两个表达式的逻辑“蕴涵”运算
'Score同时满足大于等于60且小于80时,MsgBox语句将显示True
'若不满足其中一个条件或两个都不满足,则MsgBox语句将显示False
MsgBox Score >= 60 And Score <80

数组

“数组”是一组拥有相同名称的同类元素,使用数组名称和索引号可以引用数组中的某个特定元素。默认情况下,VBA数组的索引号从0开始。例如包含一周7天名称的字符串数组命名为WeekDays,那么第一个元素为WeekDays(0),第二个元素为WeekDays(1),……,第七个元素为WeekDays(6)。

声明数组:声明数组与声明普通变量类似,需在变量名后加括号。此外可以指定上界索引号,还可以指定第一个索引号、关键字To以及最后一个索引号,在括号中括起来。示例如下:

' 声明一维数组
Dim MyArray(100) As Integer        '第一个索引号默认0,上界索引号100,包含101个元素
MyArray(0) = 888 '赋值给数组中的元素
Dim YourArray(1 To 100) As Integer '第一个索引号1,上界索引号100,包含100个元素

' 声明多维数组
Dim MatrixArray(1 To 10, 1 To 10)As Integer '包含100个整数的二维数组,可认为是10*10矩阵 
MatrixArray(6, 6) = 666           '赋值给数组中的元素

'声明动态数组
Dim DynamicArray() As Integer
'动态数组使用前,必须使用ReDim语句说明包含多少个元素
'常使用一个变量(例如x)指定动态数组中元素个数,直到某个过程结束才直到个数
ReDim DynamicArray(1 To x)

对象变量

“对象变量”是代表一个完整对象的变量,如单元格区域或工作表。对象变量的作用体现在显著简化代码和提高代码执行速度两个方面。
可以像声明普通变量一样声明对象变量。例如下面代码把变量TargetAera声明为一个Range对象,并使用Set关键字把对象赋值给变量:

Dim TargetAera As Range
Set TargetAera = Range("A1:C10")

以下是没有使用对象变量的一个过程:

Sub NoObjVar()
  Worksheets("Sheet1").Range("A1:C10").Value = 666
  Worksheets("Sheet1").Range("A1:C10").Font.Bold= True
  Worksheets("Sheet1").Range("A1:C10").Font.Italic = True
  Worksheets("Sheet1").Range("A1:C10").Font.Size = 16
  Worksheets("Sheet1").Range("A1:C10").Font.Name = "微软雅黑"
End Sub

为实现与上述代码相同功能,还可以使用一个对象变量进行简化:

Sub ObjVar()
  Dim TargetAera As Range
  Set TargetAera = Worksheets("Sheet1").Range("A1:C10")
  TargetAera.Value = 666
  TargetAera.Font.Bold= True
  TargetAera.Font.Italic = True
  TargetAera.Font.Size = 16
  TargetAera.Font.Name = "微软雅黑"
End Sub

自定义数据类型

VBA允许用户创建自定义数据类型。自定义数据类型要在模块最上端与任何过程之前。例如,程序要处理一组通讯录信息,可能要创建一个名为ContactInfo的联系人信息数据类型,如下所示:

' 自定义“联系人信息”数据类型
Type ContactInfo
  Name As String
  PhoneNum As String
  Email As String
  WeChatID As String
  Birthday As Date
End Type

' 声明包含100个联系人信息元素的数组,每个元素由5部分组成
Dim MyContacts(1 To 100) as ContactInfo
MyContacts(1).Name = “哎喂可乐”
MyContacts(1).PhoneNum = "12345678"
MyContacts(1).Email ="awkl@awkl.com"
MyContacts(1).WeChatID = “***”
MyContacts(1).Birthday  = #11/11/1911#

内置函数

与大多数编程语言一样,VBA包含各种内置函数,可以简化计算和操作。

VBA语句清单和内置函数清单后续补充。

系列:
VBA编程基础1:注释、变量、数据类型、赋值运算
VBA编程基础2:处理对象和过程控制

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

推荐阅读更多精彩内容

  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,114评论 0 13
  • 一、Java 简介 Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计...
    子非鱼_t_阅读 4,153评论 1 44
  • 1.1 VBA是什么 直到90年代早期,使应用程序自动化还是充满挑战性的领域.对每个需要自动化的应用程序,人们不得...
    浮浮尘尘阅读 21,707评论 6 49
  • 今天上午第一课,学习一篇选自《世说新语》的文章。乍一看很简单,也就没花多少时间备课。讲着讲着,把两个人物关系讲错了...
    顾鸣芬阅读 151评论 0 1
  • 实战公开头条日引1000+ 精准客户 我们做网络流量的都知道,只有掌握流量、拥有流量的人才能走得更长久,今日头条很...
    十二奇迹阅读 198评论 0 0