VBA 变量的声明和赋值
在之前的两篇教程中,简单介绍了 VBA 中变量的声明和赋值以及基本语句。变量的声明和赋值,通常是一个 VBA 过程的开始,也是最基本的部分。VBA 开发过程中,好的声明方式和正确的赋值过程,是写出准确又高效代码的根本。
本篇教程给大家介绍什么是 VBA 中的声明以及基本语法,然后介绍多个数据类型的赋值方法。学习完本篇,可以开始尝试写一些基本的 VBA 代码了。
什么是声明变量
在《VBA 变量》一文中介绍,变量是一个存储数据的 VBA 代码结构。在代码中,通过变量名获取变量所代表的值。而声明变量,就是告诉 VBA,变量的名字和它所存储的值的数据类型。
VBA 中声明变量,有 4 种变量,它们是:
- 基本类型变量。基本类型变量是那些存储单个数据的变量,例如数字、文本、日期等。
- 通用变量。通用变量,即 Variant 类型变量。该变量的类型在程序运行过程中,根据赋值的数据自动指定。
- 数组。数组包含多个变量的集合。
- 对象。对象包含一些列属性和方法。
声明语句的基本语法
4 种类型的变量的声明方法基本一致。他们的语法如下。
1.基本类型变量
'语法
Dim [变量名] As [数据类型]
'实例
Dim name As String
Dim age As Integer
Dim height As Double
Dim birthday As Date
2.通用变量
声明 Variant 类型变量时,如果忽略数据类型,默认情况是 Variant 类型,因此下方两种方式是相同的。
'语法
Dim [变量名] As Variant
Dim [变量名]
'实例
Dim message As Variant
Dim message
3.数组
'语法
'固定长度数组声明
Dim [变量名](开始序号 to 结束序号) As [数据类型]
'动态数组声明
Dim [变量名]() As [数据类型]
'实例
'声明包含10个文本类型元素的数组
Dim names(1 to 10) As String
'声明长度未知的文本类型数组
Dim names() As String
关于数组的声明和赋值,将在数组一章中做详细的介绍。
4.对象
声明对象时,一般有两种方式。一种是前期绑定,即一开始就指定对象的类型;一种是后期绑定,即声明时不指定对象类型,后期指定。
'语法
'前期绑定声明语法
Dim [变量名] As [对象类型]
'后期绑定声明语法
Dim [变量名] As Object
'实例
Dim sh As Worksheet
Dim car As Object
关于对象的声明和赋值,在对象一章中做更详细的介绍。
在哪里写声明语句
声明变量,意思是在使用变量前,告诉 VBA,变量的名字和数据类型。因此,声明变量的语句,必须写在使用它的语句前。
错误写法
如果先于声明语句前使用变量,VBA 会报「变量未定义」错误。
正确写法
Dim name As String
name = "Zhang San"
如何声明多个同类型变量
通过以上部分的学习,在写多个同类型变量的声明语句时,有人可能会按以下方式写:
'声明两个整数类型的 i、j 变量
Dim i,j As Integer
首先,以上写法,语法上没问题,不会出现错误。但是,这种方式声明变量,Integer 类型只作为第二个 j 变量的数据类型。第一个变量,即 i 变量,它的数据类型是 Variant,并不是 Integer 类型。
因此,VBA 中不能合并声明语句。正确的声明方法如下:
'第一种,按两行写
Dim i As Integer
Dim j As Integer
'第二种,使用 : 符号,在一行写
Dim i As Integer : Dim j As Integer
声明变量是必须的吗
准确来讲,VBA 中声明变量不是必须的。也就是说,没有声明变量,而直接开始用,也没有错误。
但是,不声明变量,是一种不好的习惯,也常常会带来很多错误。这也是为什么之前的教程中都没有提到这点的原因。
不声明变量典型弊端包括:
- 数据类型自动设置为 Variant 类型,效率低。
- 变量名写错,不会提示错误。
- 无法使用 VBA 代码自动补全。
- 数据类型不匹配时,不会提示错误。
基于以上原因,强烈建议,每次使用变量,都要声明其变量名和数据类型。
VBA 提供一个选项,可以强制变量声明,即在模块头部写上以下语句:
Option Explicit
模块中有以上语句时,如果未声明变量而直接使用变量,VBA 会提示「变量未定义」错误,方便检查代码。
设置 VBA 编辑器变量声明选项时,可以自动为每个模块插入Option Explicit
语句,不需要手动书写。设置方法如下:
基本类型变量的赋值
基本类型变量是存储单个值的变量,例如数字、文本、日期等。
VBA 中,给基本类型变量赋值,以 Let
关键词开头。赋值操作是给=
左侧的变量,用=
右边的数据,指定其代表的值。在后续的代码中,该变量就代表指定的数据。
在实际开发中,给基本类型变量赋值时,Let
关键词可以忽略不写,直接以变量开头写赋值语句。
给基本类型变量赋值语法如下:
'语法,两种写法相同
Let [变量名] = [数据]
[变量名] = [数据]
'实例
Dim name As String
Let name = "Zhang San"
Dim age As Integer
Let age = 30
Dim birthday As Date
Let birthday = #2000-1-1#
赋值语句中,=
右侧可以是包含其他变量、函数、复杂计算的表达式。该表达式返回的值的类型,与变量类型一致就可以正常赋值。
Dim birthday As Date
Dim age As Integer
birthday = #2000-1-1#
age = Year(Now) - Year(birthday)
一种特殊情况是,=
右侧可以是变量本身。这种方式多用于循环结构中。
Dim i As Integer
Do While i < 10
Msgbox i
i = i + 1
Loop
'返回 => 0,1,2,3,4,5,6,7,8,9
Variant 类型变量的赋值
我们知道 Variant 类型时通用类型,因此赋值很直接,没有类型强制要求。Variant 类型变量第一次赋值后,可以继续赋值其他类型数据。
'声明变量(两者相同)
Dim message As Variant
Dim message
'赋值
message = "Hello World"
message = 1234567890
message = #2018-12-1#
这里依然强调,虽然 Variant 类型变量比较灵活,但是也有很多弊端,所以在实际开发中,不建议使用该类型,使用确切类型变量。
数组类型变量的赋值
数组是可以存储多个同类型元素的数据类型。声明时一般指定其数据长度。给数组赋值时,一般使用每个元素的序号。
数组赋值基本语法如下:
[数组名](元素序号) = [数据]
下面看一下实际的实例。
'声明数组
Dim arr(1 to 5) As String
'数组赋值
arr(1) = "Zhang San"
arr(2) = "Li Si"
arr(3) = "Wang Wu"
以上是数组的基本赋值方式,关于数组的更多声明和赋值方法,将在《数组》一章中详细介绍。
对象类型变量的赋值
VBA 中,对象是程序的一个元素,不同于基本类型数据,它包括多个属性和多个方法。例如,Excel 中工作簿、工作表、单元格、图表等都是对象。
对象类型变量赋值时,不同于基本类型变量使用Let
(可以忽略)关键词,对象使用 Set
关键词,并且Set
关键词不能省略。
如下是对象类型变量基本的赋值方法:
Set [变量名] = [对象类型数据]
下面看一下实际的用法。
'声明工作表类型的对象
Dim sheet As Worksheet
'将名称为“绩效表”的工作表,赋到 sheet 变量
Set sheet = Worksheets("绩效表")
由于对象可以包含多个属性,因此 VBA 提供一种同时给多个属性赋值的简单方法。具体方法是对象多个属性赋值语句,放置在 With
+对象
和End With
关键词中间。
Dim sheet As Worksheet
Set sheet = Worksheets("绩效表")
With sheet
.Name = "旧绩效"
.Visible = False
End With
关于对象的更多声明和赋值方法,将在《对象》一章中详细介绍。
总结
以上是 VBA 中最基本的变量声明和赋值方法。声明和赋值变量,是代码的开始部分,需要熟练掌握。
不同类型变量,声明和赋值方法做了简单的介绍,除了以上介绍的,不同类型的变量有自己特点,这些部分会在以后的教程详细介绍。
关于变量声明和赋值,还有几个比较重要的知识点,包括相关错误和局部、全局变量,这部分内容将会做单独的、详细的介绍。
大家如果有问题,欢迎留言或私信,大家一起交流探讨。
很棒!
所以请问数组章节到底在哪里呀
后期会更新,欢迎关注
老师怎么联系你?
微信:office-guy
Sub MyCode()
Dim sheet As Worksheet
Set sheet = Worksheets(“绩效表”)
End Sub
这里提示下标越界
最可能的错误是,当前工作簿内没有“绩效表”这个工作表。
我试了,有这个工作表也会报错,是为什么
可以换个变量名试一下,因为sheet是一个内置对象,有可能是这个原因。
非常系统!对我帮助很大!谢谢1
老师 讲数组啦
收到
前期绑定和后期绑定那里有点没有弄明白,两种方式写出来不是差不多的吗?区别是啥
前期绑定:需要手动引入相关类库,编写代码时具备代码提示、补全等便捷功能,适合本人一个人使用的程序;
后期绑定:不需要手动引入,但是失去代码提示、补全等功能,适合发给多个人使用
感谢作者,一口气看到这里,没有一句废话,很通俗易懂。
言简意赅,学的好快乐
追加一下,
运行报错时,语句Set是被自动选中的。
是Set语法有错误吗?
感谢作者的内容,学到很多。
Dim sheet As Worksheet
Set sheet = Worksheets(“绩效表”)
With sheet
.Name = “旧绩效”
.Visible = False
End With
上面这段程序运行时总会报错提示”编辑错误 无效外部过程”
这是什么原因?
v
sub ()
end sub
这个加了吗?vba每个程序的外部都要加上这个
抱歉,一样的代码,我没有复现出来错误,运行正常。要是问题还在,微信发一下代码文件,我看一下。
微信:office-guy
“它的数据类型时 Variant”这里”时”是不是错了,应该是”是”吧
感谢反馈,已修正
感谢分享
感谢,好详细!
写的很棒,小白都上手了!
非常好的学习课文
非常适合小白
Dim sheet As Worksheet
‘将名称为“绩效表”的工作表,赋到 sheet 变量
Set sheet = Worksheets(“绩效表”)
为什么下面赋值的时候变成Worksheets,多加了个s?
Worksheet是单个工作表对象,而 Worksheets 是多个工作表对象的集合。本例中,通过集合拿到单个对象,赋值到工作表类型的变量中。
版主写的太好了,很适合小白入门
点赞
学到了
谢谢分享!捉个小虫:“所代表的的值”,“的”重复了
感谢反馈,已修改
请问数组章节什么时候讲呢。想把数组作为过程的输入参数,但弄不对。
与基础类型数据、对象类型数据不一样,当过程或函数传数组参数时,只能以引用类型(ByRef)传递,如果强制 ByVal 传递,程序会报错。
引用类型(ByRef)传递意味着,在过程或函数内部对数组进行修改,则影响到外部数组。
With sheet
.Name = “旧绩效”
.Visible = False
前面为什么加.啊 没有说到
这是 with 结构的用法,具体可以看这篇:https://www.lanrenexcel.com/vba-with-structure/
对象的引用,克隆有没有什么办法
没有内置或其他很直接的方法。可以尝试在对象内部写一个复制的方法,逐一复制每个属性。
写的很好,适合小白,通俗易懂
本来想当个白嫖怪的,但是你写的太好了,忍不住赞美一下
欢迎继续来学习:)
希望一直更新, 我觉得文章写的很好. 会一直跟着学习的
文章写得不错, 点个赞 加油
不同类型变量赋值 Dim Let Set 感觉有点傻傻分不清
可以这样记:
Dim 用于声明变量;
Let 用于赋值简单类型变量(数字、字符串、逻辑值等);
Set 用于赋值复杂类型变量,即对象。