百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

【VBA基础】变量的类型和申明变量类型的重要性

yuyutoo 2025-01-05 00:09 5 浏览 0 评论

各位朋友,你们好,今天和你们聊点VBA基础知识:VBA变量。

注:

此文字数约3500字,主要是讲解VBA变量知识,通过一些动图展示变量上的效果;

如果你是初学者,建议先收藏此文,看看最后给初学者的建议那一部分;

如果你是有一定的基础,想详细了解VBA的变量,提升代码运行效率,可以详细看看。


目录如下:

一、变量的概念

二、变量的命名

三、变量的申明

四、变量的类型

五、变量的作用域

六、变量的赋值

七、变量的存活期

八、正确申明变量类型对运行时间的影响

九、给初学者的建议


一、变量的概念

变量是用于保存程序运行过程中的临时值。和常量不同的是,变量是一个指定的内存位置,用于保存代码执行过程中可以更改的值。

变量有两种:动态变量和静态变量

静态变量和动态变量的区别:

动态变量:过程每运行一遍,动态变量的值会重置;

静态变量:过程每运行一遍,静态变量的值还是上一次过程运行的结果。

我们用动态图片来展示动态变量和静态变量:


二、变量的命名

在VBA中,可以使用名称来表示内存的位置,这个名称就是标识符,可以理解为变量的名字。

变量命名的注意事项:

1、第一个字符必须使用英文字母或中文字符(中文版EXCEL支持中文字符);

2、名称长度不超过255个字符;

3、名称不能与VBA本身的Function过程、语句、即方法的名称相同,避免冲突;

4、不能在同一范围的相同层级中使用重复的名称。


三、变量的申明

在使用变量时,需要告诉VBA程序,变量的名称和数据类型,即声明变量。

通常用Dim语句来声明动态变量,用Static语句来声明静态变量。

声明数据类型后,可以在计算机内建立一个指定的存储位置,这样在运行代码时程序就会很快,内存利用效率很高,否则,计算机还要耗用很大的内存来判断其数值类型,运行会比较慢。

1、申明变量的写法

声明变量通常都是在程序开始处,可以在同一行声明多个变量,用英文逗号间隔即可。写法如下:

Dim 变量1 As 变量类型,变量2 As 变量类型,……

Static 变量1 As 变量类型,变量2 As 变量类型,……

2、强制申明变量

要强制申明变量,直接在输入代码时最顶头输入【Option Explicit】,就可以,我们看下图的效果:

演示过程解析:

① 未设置强制申明变量,在未申明变量的状态下,代码可以正常执行;

② 设置了强制申明变量,在未申明变量的状态下,无法执行代码,提醒变量未定义;

③ 设置了强制申明变量,在申明了变量的状态下,代码执行通过。

扩展:如果不会写【Option Explicit】,是否有快捷方法实现强制申明变量呢?当然有,请看下面动图

VBE编辑器菜单的工具→选项→编辑器→勾选要求变量申明。确定后,每次插入模块,都会在模块前面增加【Option Explicit


四、变量的类型

VBA中的变量类型及相关参数,详见上表,我们在申明变量时,要选择合适的变量类型。

比如变量的值为整数,就把变量申明为Integer型;

如果变量的值是大于32767的整数,就要把变量申明为Long型;

如果变量是时间,就要把变量申明为Date型(在工作表中,时间是数值的一种;但是在VBA中,要根据情况明确;申明数值时,还要根据数值的形式、范围选择合适的数值类型)

注意:

1、Variant型(变体型)可以存放任何类型的数据,当指定为变体型时,不必在数据类型间转换,VBA会自动转换;

2、在程序中不特别说明时,均默认为变体型;

3、由于变体型存放空间大,因此不在特殊情况下不适用该类型。


五、变量的作用域

作用域就是变量使用范围,VBA中有三种级别的作用域:过程级变量模块级变量全局级级变量。

1、过程级变量:过程级变量只在变量所在的过程中有效。

Sub Test()
    Dim a As Integer
    Debug.Print a + 1
End Sub

如上面这个Test过程,这里申明的变量a,就只能用于此过程中。

2、模块级变量:在同一个模块内通用的变量。

与过程级变量声明的不同方式在于,写过程前先声明变量,模块级代码的申明方式如下:

方法①:Dim 变量 As变量类型
方法②:Private 变量 As 变量类型

演示效果如下:

演示过程解析(强制申明变量状态下演示):

① 在模块1中申明了变量a,在模块1中运行通过;

② 切换到模块2,Test2过程中有一个未申明的变量a,直接运行,提示变量未申请;

③ 用Private申明了变量b,然后将模块1和模块2过程中的变量都修改为b,在模块2中运行通过,在模块1中运行错误。

④通过演示得出结论,这两种申明变量的方式生成的都是模块级变量,只能在当前模块中使用,跨模块使用无效。

3、全局级变量:在该工程内通用的变量。

全局变量与过程级变量声明的方式相同,都是写过程前先声明变量,全局变量的申明方式如下:

Public 变量 As 变量类型

演示效果如下:

演示过程解析(强制申明变量状态下演示):

① 在模块1中申明了全局变量a,在模块2中申明了全局变量b;

② 模块1种Test过程中有变量a和b,运行通过;

③ 模块2种Test2过程中有变量a和b,运行通过;

注意:

① 对于不同级的变量使用的原则,尽量使用过程级变量;

② 如果不同过程之间有共享值时,才使用全局级变量;

③ 要控制全局级变量的使用数量。


六、变量的赋值

1、给文本、数值、日期等数据类型变量赋值

语句为: Let 变量名称 = 变量值(这里的Let可以省略,即:变量名称=变量值)

例如:

Sub 变量赋值()
    Dim str As String
    Let str = "我是上班下班"
End sub

2、给对象变量(Object型,例如单元格)赋值

语句为:Set 变量名称=对象(这里Set千万不能少。)

  例如:

SUB 变量赋值() 

Dim rng = Range

Set rng = Worksheets("sheet1").Range("A1")

rng.Value= "我是上班下班"

End sub


七、变量的存活期

变量的存活期就是指变量在内存中保留的时间,这个与变量的作用域有很大的关系。

1、过程级变量:

出现:当SUB过程开始执行时,过程级代码才储存到内存中;

结束:SUB过程执行完成时,变量占用的内存就会立即释放。

2、模块级变量:

出现:当程序开始运行时,模块级代码就储存到内存中;

结束:当关闭工作薄时,变量占用的内存才会释放。

3、全局级变量:

出现:当程序开始运行时,全局级代码就储存到内存中;

结束:当关闭工作薄时,变量占用的内存才会释放。

4、静态变量:

出现:当程序开始运行时,全局级代码就储存到内存中;

结束:当关闭工作薄时,变量占用的内存才会释放。


八、正确申明变量类型对运行时间的影响

我们直接来看一张动图

动图解析:

1、当不申明变量类型时,运行完成需要9.17秒;

2、当正确申明变量类型时,运行完成需要5..61秒;

3、如果换成更大量的数据、更复杂的运算,运行时间上的差距还会更大;

4、所以大家可以看到正确申明变量的总要性。


九、给初学者的建议

1、学习VBA是否一定要先学习变量?

①初学者不必马上去学习定义变量的各种知识,直接写代码照样可以入门;
②入门以后再学习定义变量的方法,并根据自己的认识取舍即可;

2、是否必须在程序开头加上Option Explicit?

在电脑286、386时代,在DOS程序代码时代,在内存仅16M,32M时代,你必须定义好每一个变量的数据类型,以便最高效地进行内存使用。即,一个口袋里只有10元钱的人,要生活一周,于是你必须精打细算好每一分钱,否则就会饿死。

Option Explicit 的作用,就在于:如果你的程序没有做到精确定义每一个变量的数据类型,编译程序就会拒绝执行,它认为你太奢侈了,不懂得节约使用每一分钱。

而现在的电脑硬件环境,已经是过去的几千倍了。每一个人口袋里都有几百万的钱,还有必要去考虑一分钱、一元钱的用法么?

3、是否需要dim 所有变量?

好处:不同的数据类型,占用大小不同的字节,因此计算时对内存的占用和运算效率有所不同。因此,定义变量数据类型以后,可能的好处是少占用一些内存以及大量重复运算是提高计算速度。
坏处:由于各种类型占用字节的限制,它所能代表的数值范围受到了限制!如果初学者试图去使用定义变量类型的方法时,往往尚未得到实际好处,即【运算速度提高】的好处(但实际运算量小时速度的差别很小、很小可以完全忽略不计)却首先受到了因为不能恰如其份地定义好变量类型,而造成了变量溢出或冲突导致代码无法运行的严重后果。

比如:如果你不了解Integer的范围,在超出变量范围的情况下使用就会提示出错。比如“溢出“

4、动态数组是否必须定义?

Dim arr、Dim txt、Dim Num全部无意义,因为:

Dim arr 等价于 Dim arr As Variant
Dim txt 等价于 Dim txt As Variant
Dim Num 等价于 Dim Num As Variant

5、学习VBA,完全可以先实战后深入,不必花费太多时间再如何声明好变量类型上,能事半功倍。抛开一些没必要的东西先让程序跑起来的确更重要。


我是上班下班,因为爱好办公软件、喜欢分享。所以来到这里将我的学习心得和踩过的一些坑,和大家聊聊,希望大家学习我成功的经验,避开我踩过的坑。我和你们一起进步。

好了,今天就聊到这里,感谢各位朋友的关注和支持。

如果你喜欢我分享的内容,请点个赞支持下;

如果你觉得我分享的内容对你有帮助,可以关注我;

如果要看我以前分享过的好玩的内容,大家可以去我的主页查看历史文章。

相关推荐

当 Linux 根分区 (/) 已满时如何释放空间?

根分区(/)是Linux文件系统的核心,包含操作系统核心文件、配置文件、日志文件、缓存和用户数据等。当根分区满载时,系统可能出现无法写入新文件、应用程序崩溃甚至无法启动的情况。常见原因包括:...

玩转 Linux 之:磁盘分区、挂载知多少?

今天来聊聊linux下磁盘分区、挂载的问题,篇幅所限,不会聊的太底层,纯当科普!!1、Linux分区简介1.1主分区vs扩展分区硬盘分区表中最多能存储四个分区,但我们实际使用时一般只分为两...

Linux 文件搜索神器 find 实战详解,建议收藏

在Linux系统使用中,作为一个管理员,我希望能查找系统中所有的大小超过200M文件,查看近7天系统中哪些文件被修改过,找出所有子目录中的可执行文件,这些任务需求...

Linux 操作系统磁盘操作(linux 磁盘命令)

一、文档介绍本文档描述Linux操作系统下多种场景下的磁盘操作情况。二、名词解释...

Win10新版19603推送:一键清理磁盘空间、首次集成Linux文件管理器

继上周四的Build19592后,微软今晨面向快速通道的Insider会员推送Windows10新预览版,操作系统版本号Build19603。除了一些常规修复,本次更新还带了不少新功能,一起来了...

Android 16允许Linux终端使用手机全部存储空间

IT之家4月20日消息,谷歌Pixel手机正朝着成为强大便携式计算设备的目标迈进。2025年3月的更新中,Linux终端应用的推出为这一转变奠定了重要基础。该应用允许兼容的安卓设备...

Linux 系统管理大容量磁盘(2TB+)操作指南

对于容量超过2TB的磁盘,传统MBR分区表的32位寻址机制存在限制(最大支持2.2TB)。需采用GPT(GUIDPartitionTable)分区方案,其支持64位寻址,理论上限为9.4ZB(9....

Linux 服务器上查看磁盘类型的方法

方法1:使用lsblk命令lsblk输出说明:TYPE列显示设备类型,如disk(物理磁盘)、part(分区)、rom(只读存储)等。...

ESXI7虚机上的Ubuntu Linux 22.04 LVM空间扩容操作记录

本人在实际的使用中经常遇到Vmware上安装的Linux虚机的LVM扩容情况,最终实现lv的扩容,大多数情况因为虚机都是有备用或者可停机的情况,一般情况下通过添加一块物理盘再加入vg,然后扩容lv来实...

5.4K Star很容易!Windows读取Linux磁盘格式工具

[开源日记],分享10k+Star的优质开源项目...

Linux 文件系统监控:用脚本自动化磁盘空间管理

在Linux系统中,文件系统监控是一项非常重要的任务,它可以帮助我们及时发现磁盘空间不足的问题,避免因磁盘满而导致的系统服务不可用。通过编写脚本自动化磁盘空间管理,我们可以更加高效地处理这一问题。下面...

Linux磁盘管理LVM实战(linux实验磁盘管理)

LVM(逻辑卷管理器,LogicalVolumeManager)是一种在Linux系统中用于灵活管理磁盘空间的技术,通过将物理磁盘抽象为逻辑卷,实现动态调整存储容量、跨磁盘扩展等功能。本章节...

Linux查看文件大小:`ls`和`du`为何结果不同?一文讲透原理!

Linux查看文件大小:ls和du为何结果不同?一文讲透原理!在Linux运维中,查看文件大小是日常高频操作。但你是否遇到过以下困惑?...

使用 df 命令检查服务器磁盘满了,但用 du 命令发现实际小于磁盘容量

在Linux系统中,管理员或开发者经常会遇到一个令人困惑的问题:使用...

Linux磁盘爆满紧急救援指南:5步清理释放50GB+小白也能轻松搞定

“服务器卡死?网站崩溃?当Linux系统弹出‘Nospaceleft’的红色警报,别慌!本文手把手教你从‘删库到跑路’进阶为‘磁盘清理大师’,5个关键步骤+30条救命命令,快速释放磁盘空间,拯救你...

取消回复欢迎 发表评论: