codecamp

VBA的变量含义和变量作用

代码存在的位置:模块

VBA 代码必须存放在某个位置,这个地方就是模块。

有两种基本类型的模块:标准模块和类模块。模块中的每个过程可能是函数过程,也可能是子程序。

本课的最后部分将讨论函数过程和子程序的区别。

新术语:

模块:它是作为一个单元保存在一起的VBA定义和过程的集合。

类模块:VBA允许你创建自己的对象,对象的定义包含在类模块中。

你的大部分工作集中在标准模块中(简称为模块)。

当录制宏时如果不存在模块,EXCEL 会自动创建一个。

EXCEL 和 VBA 不关心代码存放在哪一个模块中,只要代码存在于打开的工作簿中即可。

对模块的概览

过程被定义为 VBA 代码的一个单元,过程中包括一系列用于执行某个任务或是进行某种计算的语句。工作簿的每个过程都有唯一的名字加以区分。

有两种不同的过程:子程序和函数过程。子程序只执行一个或多个操作,而不返回数值。当录制完宏查看代码时,所看到的就是子程序。宏只能录制子程序,而不能录制函数过程。一个子程序的例子如下所示:

例:

Sub cmdSmallFont_Click()
    With Selection.Font
        .Name="Arial"
        .FontStyle="Regular"
        .Size=16
    End With
End sub

上面列出的过程实际上是一个事件过程。通过它的名字,就可以知道这是一个事件过程。这个过程的名字是由一个对象的名字CmdSmallFont和一个事件的名字Click组成的,两者之间用下划线分开。如果还不明白,可以告诉你,CmdSmallFont是一个命令按钮的名字。也就是说,当单击这个命令按钮时,就会运行这个事件过程。

函数过程通常情况下称为函数,要返回一个数值。这个数值通常是计算的结果或是测试的结果,例如False 或True。

正如前面所说,可以用VBA创建自定义函数。实际上可以在工作表上使用你创建的函数。下面是一个计算价格的10%为运费的简单例子。

简单的用户定义函数示例:

Public Function Shipping(Price)
    Shipping = Price * 0.1
End Function

请注意,这个函数使用一个参数(Price)。子程序和函数都可以使用参数。不论Price的值是多少,它都将决定运费额。

Price 可以是数字或单元格引用。

函数返回计算出来的运费,这个函数可以用在单元格中(B2为表达式)。

 
 1 Price  100 
2 Shipping  =shipping(B1)

创建过程

创建第一个过程需要两个基本步骤。首先,需要向工作簿中添加一个模块。接着需要向模块中添加一个工程。对于创建的每一个应用程序,只需添加一次模块。可以使用多个模块,但这是不必要的。某些开发者喜欢使用多个模块,以便根据他们的目的或者窗体对过程进行组织。在本练习中,创建的过程只显示一个消息框。

在本练习中使用Msgbox是为了提供一个可见的例子,虽然我们还没有介绍过Msgbox语句,但是在本例中将使用它。要创建该过程,请按如下步骤进行:

1、打开一个新工作簿。

2、选择"工具"-"宏"-"Visual Basic编辑器",打开VBA编辑器窗口。

3、在`VBA 编辑器的左面,可以看到"工程资源管理器"窗口。在工程资源管理器窗口的"Thisworkbook"上单击鼠标右键,选择"插入"-"模块",这样就将一个模块添加到应用程序中了。(如果你没有看见"工程资源管理器"窗口,可以按Ctrl+R)

4、选择"插入""过程",显示"添加过程"对话框。


5、输入"第一个工程"作为过程名字。在"类型"分组框中,确认选择了"子程序"。单击"确定"按钮。这样一个新的过程就添加到模块中了。可以在模块中看到以 P​ublicSub 第一个过程()​开始,以​End Sub​结束的语句结构。

6、在过程中插入光标,输入以下语句并回车:

Msgbox "这是我的第一个过程"

在输入Msgbox后,会自动弹出一个消息框告诉你有关这条命令的信息,称之为自动列表技术。

输入完成的过程如下所示:

Public Sub 第一个过程()
    Msgbox "这是我的第一个过程"
End Sub

VBA对子程序和函数有如下的命名规则:

* 名字中可以包含字母数字和下划线。

* 名字中不能包含空格句号惊叹号,也不能包含字符@ & $ #.

* 名字最多可以包含255个字符。  

运行宏

创建这个过程后,可以运行一下。运行一个过程有几种方法:可以直接使用"运行"菜单,"运行子程序/用户窗体"工具栏按钮或按下F5键。要运行一个过程,可以按照如下步骤:

1、单击"运行子程序/用户窗体"工具栏按钮,过程执行并显示一个消息框。

2、单击消息框之中的"确定"按钮,关闭该消息框。


保存对模块所做的改变

要保存新过程,需要保存过程所驻留的工作簿.可以用 VBA 编辑器保存工作簿.具体步骤如下:

1、选择"文件"-"保存工作簿".因为本工作簿还没有保存过,所以要给它命名.

2、输入"HOUR4"作为文件名并按回车键,则工作簿和模块与过程都保存下来了.。

变量

变量是用于临时保存数值的地方.每次应用程序运行时,变量可能包含不同的数值,而在程序运行时,变量的数值可以改变.

为了说明为什么需要变量,可以按照如下步骤创建一个简单的过程:

1、创建一个名为"你叫什么名字"的过程。

2、在过程中输入如下代码:​Inputbox "输入你的名字:"

现在不要担心inputbox语句的语法,将在第六小节中了解到有关这条命令的更多信息。

3、按下F5键运行过程,这时会显示一个输入框,要求输入你的名字。

4、输入你的名字按"确定"按钮,则结束该过程。

你输入的名字到那里去了?如何找到用户在输入框中输入的信息?在这种情况下,需要使用变量来存储用户输入的结果。

变量的数据类型

使用变量的第一步是了解变量的数据类型.变量的数据类型控制变量允许保存何种类型的数据.下表列出了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
(单精度浮点数,类似于C语言的float)
 4字节
负值范围:-3.402823E38 ~ -1.401298E-45
正值范围:1.401298E-45 ~ 3.402823E38
 Double
(双精度浮点型)
8字节 
 负值范围:-1.79769313486232E308 ~ -4.94065645841247E-324
正值范围:4.94065645841247E-324 ~ 1.79769313486232E308
 Currency
(货币类型)
 8字节  -922,337,203,685,477.5808 ~ 922,337,203,685,477.5807
 Decimal
(精准型)
14字节  不包括小数时:
-79,228,162,514,264,337,593,543,950,335 ~ +79,228,162,514,264,337,593,543,950,335 
包括小数时:
-7.9228162514264337593543950335 ~ 
+7.9228162514264337593543950335
 Date8字节 1000年1月1日 ~ 9999年12月31日
 Object4字节 任何引用对象 
 String(长字符串)10字节+1字节/字符 0 ~ 约20亿 
 String(固定长度) 字符串的长度1 ~约65400 
 Varient(数字)16字节 double范围内的任何数值 
 Varient(文本)22字节+1字节/字符 数据范围和变长字符串相同 
注: Currency是vb独有的一种数据类型,他用来进行货币的换算和定点计算特别方便(他的精度是确定的,不会出现精度带来的舍入误差)。
decimal与single和double的区别是,前者不是浮点数据类型,他的精度是确定的。因为使用的内存空间极大,他可以将精度控制得很准确(比后两者更准确),但因此牺牲了其性能,在有精度要求(无法容忍精度带来的舍入误差,比如财务计算)的情况下建议使用decimal。

作为 VBA 程序员,一个目标是选择需要存储空间尽量小的数据类型来保存所需要的数据,这正是上表提供各种数据类型存储空间的原因。例如,要保存诸如班级学生总数这样的小数字,那么Byte数据类型就足够了。在这种情况下,使用Single数据类型只是对计算机存储空间的浪费。

用Dim语句创建变量(声明变量)

现在,你对变量可以使用的数据类型已经比较熟悉了,接下来我们将创建变量。创建变量可以使用Dim语句,创建变量通常称为"声明变量"  Dim语句的基本语法如下:

Dim 变量名 AS 数据类型

这条语法中的变量名代表将要创建的变量名。对变量的命名规则和对过程的命名规则相同。

这条语句中的数据类型部分可以是上表中的任何一种数据类型。

变量名必须以字母开始,并且只能包含字母数字和特定的特殊字符,不能包含空格句号惊叹号,也不能包含字符@ & $ #。

名字最大长度为255个字符。

在接下来的练习中将说明如何在 VBA 中使用变量。你将要输入你的名字,并用一个消息框将其显示出来。具体步骤如下:

1、创建一个名为"显示你的名字"的子程序.

2、输入以下代码:

Public Sub 显示你的名字()
    Dim s名字 As String
    s名字 = Inputbox("请输入你的名字:")
    Msgbox "你好"& s名字
End Sub

3、将鼠标放到过程中的任何地方,按下F5键运行过程,会显示一个输入框。

4、输入你自己的名字并按回车键,会显示一个消息框,显示的文字中包含你自己的名字。

5、单击"确定"按钮,返回过程中。


在 Dim 语句中不必提供数据类型.如果没有数据类型,变量将被定义为 Variant 类型,因为VBA 中默认的数据类型是 Variant.你知道这一点后,最初的反应也许是觉得应该不用自己决定数据类型,而将一切抛给VBA.这种观念是完全错误的。你必须决定选择使用何种数据类型。因为Variant数据类型占用存储空间较大(16或22字节)而且它将影响程序的性能。VBA必须辨别Variant类型的变量中存储了何种类型的数据。

变量命名的惯例

下表给出了推荐的变量命名惯例



变量命名的前缀

使用数组

如果你使用过其他编程序语言,可能对数组已经比较熟悉了.数组是具有相同数据类型并共同享有一个名字的一组变量的集合.数组中的元素通过索引数字加以区分,定义数组的方法如下:

Dim array_name(n) As type​ (其中n是数组元素的个数)

例如,如果要创建保存10个学生名字的数组,可以用以下语句:

Dim s学生名字(9) As Integer

注意,括号中的数字是9而不是10.这是因为在默认的情况下,第一个索引数字是0.数组在处理相似信息时非常有用.假设要处理15门考试成绩,可以创建15个独立的变量,这意味着要使用15个Dim语句。也可以创建一个数组来保存考试成绩,具体如下:

Dim s学生名字(14) As Integer

声明数组时的另一种方法是不给定大小。可以在程序运行时定义其大小。通过创建动态数组就可以做到。例如,你的程序要创建一表格,可以提示用户输入表格的行和列的数目。声明动态数组的语法如下:

Dim dyn_array() As type

对数组声明后可以在程序运行时用:ReDim语句指定数组的大小:

ReDim dyn_array()(array_size)

参数array_size代表数组的新大小。如果要保留数组的数值,请在ReDim语句后使用保留字Preserve,具体语法如下:

ReDim Preserve dyn_array(array_size)

变量赋值

声明变量后就可以给变量赋值。请注意下列语句中为数组变量赋值时索引数字的使用。

Dim i人数 As Integer
Dim i考试成绩() As Integer
Dim i As Integer
i人数 = inputbox("输入学生的人数:")
ReDim Preserve i考试成绩(i人数)
For i = 1 to i人数
    i考试成绩(i) = inputbox("输入考试成绩"& i )
Next


Excel中控件的常规使用方法
用VBA设置工作表使用权限的步骤
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }