每天一篇原创Excel图文微信公众号:Excel星球NO.81-什么是变量?作者:看见星光微博:EXCELers / 知识星球:Excel

哈罗,大家好,我是星光,今天给大家聊一下编程中一个非常重要的概念——变量。变量这个词有些朋友可能感到陌生,但其实就概念来说,无论在生活中还是在学习上,变量都是无处不在的。
你的身高是变量,你小时候身高=1米2,后来你长大了,身高=1米8。你考试的成绩是变量,你小时候学渣,成绩=45,你长大了学霸,成绩=150。你玩王者荣耀时角色的生命值也是变量,满血时生命=3200,残血时生命=300;你一顿操作猛如虎,一看战绩……9-0,战绩=9-0还是变量——所以,什么是变量?变量在编程中的意义和作用是什么?

什么是变量

所谓变量,就是储存数据的容器,就好比贴着标签装着数据的盒子。标签是变量的名称,不占据盒子内的空间,比如身高;盒子里装着的数据是可以改变的,比如1米2,后来变成了1米8等。
……我们可以把计算机看成是一个人,它的脑袋十分巨大,里面整齐的摆放着成千上万个小盒子,也就是脑细胞;每一个小盒子都是一个空间,有多种类型,可以装各种的数据;但一个盒子只能放一个数据。我们只有将数据装到计算机的脑袋里,才能让它帮助我们分析和处理数据——那我们如何将数据装到计算机的脑袋里去?
打个响指,很简单,代码如下。

身高=180

代码中的"="是赋值符号(不是判断符等于号,两者的区别我们以后会聊)。这句代码的意思是我们在计算机的大脑袋里申请了一个小盒子,贴上标签:身高,盒子里装上数据:180。这样一来,计算机就知道名字为身高的小盒子里装着数据180了。
后来一段时间你吃了好多鱼……好吧,还吃了不少卫龙辣条,于是身高莫名其妙长高了,我们得把这事告诉计算机,把身高数据更新一下。

身高=190

于是计算机按照标签"身高",取出小盒子。由于一个盒子只能放一个数据,要装新的数据,计算机就会用新数据覆盖掉旧数据,所以最后名为"身高"的小盒子里装着数据是190。
试试按分步运行以下Sub过程,在本地窗口观察"身高"的变化,以及最后返回的值是多少?

Sub 变量()    Dim 身高 As Byte    身高 = 120    身高 = 130    身高 = 140    身高 = 140    身高 = 180    MsgBox 身高End Sub

如你所想,这里名为"身高"的小盒子即是变量,很显然,它有两部分构成:名称和值,值可以变,但名称不变,以不变应万变。
就这么回事。什么是声明变量我们上一节讲过,数据是有类型的,在VBA中数据的类型可以划分为……上一章的那么多种(摊手,没办法,我就是这么懒,别指望我重说一遍)。而变量是装数据的容器,也是有类型的。简而言之,数据有多少类型,变量就有多少类型。声明变量,就是给数据指定不同类型的小盒子,并贴上标签名字。
在VBA中如何声明变量呢?最常见的是使用Dim语句。语法格式如下:

Dim 变量名 As 变量类型

我举个一个小栗子。

Sub 声明变量()    Dim 身高 As Byte    身高 = 180    身高 = 300End Sub

▎代码解析:
第2行代码,Dim 身高 As Byte是声明变量,意思是向计算机申请一个专门用来装Byte数据类型的小盒子,1个字节大小,范围是0~255之间的整数,并贴上标签"身高"。
第3行代码,身高=180,想必你已经知道什么意思了,给变量身高赋值,也就是往名为"身高"的小盒子里装入一个数据180。
第4行代码,身高=300,想必你还是知道——但其实你不知道,微微笑。咱们在第2行代码声明了变量身高的类型是Byte,所以只能用来装0~255之间的整数,这里却要求计算机装300。盒子太小,它装不下,于是会弹出一个提示溢出的警告框,同时中断程序运行:

……
有个叫看见我蓝了吗?的网友发来提问:星光大熊迪,请问声明变量是必需的吗?
答:……这个问题,有两种情况。一种是声明了变量,但没有指定类型,示例代码如下。

Sub 变体变量()    Dim 身高    身高 = 120    身高 = "我很高"    MsgBox 身高End Sub

第2行代码中声明了变量"身高",但没有指定类型,则系统默认为变体型。什么是变体?咱们上节课讲过了。变体型变量就像一个万能的小盒子,啥都能往里装,它会自动调整数据类型。第3行代码身高=120,我们往名为"身高"的小盒子里装了个数值120;第4行代码身高="我很高",我们往小盒子里又装了个字符串"我很高",同时覆盖掉了旧数据120,此时小盒子装的就是字符串"我很高"。
还有一种情况,变量声明都不声明,带头大哥附体挽起袖子直接干,示例代码如下:

Sub 变量不声明就用()    身高 = 120    身高 = "我真的很高"    MsgBox 身高End Sub

这段代码并没有声明变量身高,第2行代码直接就赋值了。系统同样默认身高为变量,类型为变体,作用类同上一段代码。
这时可能有朋友就想了,既然变体变量什么都能装,还会自动调整数据类型,连声明都可以省了(能偷懒?激动的搓搓手),那干嘛还声明变量呢?直接举国体制一刀切,全部用变体不就行了?
长者曰:小同志,你这个想法很大胆啊。变体变量确实省事又好用,但是,一来它占据的内存空间可能比较大——好吧,咱是有别墅的人了,这点大部分情况下都不重要;但麻烦的是变体不够聪明,怎么不够聪明法?——咱们后面有个单章专门再聊。
……
有个叫姐要三宫六院七十二男妃的网友发来提问:星光哥哥,你举的例子都是声明一个变量,如果需要声明多个变量,代码应该怎么写?
答:可以一行代码声明一个变量,多个变量用多行声明。示例如下。

Sub 多行声明多个变量()    Dim s As String '声明变量s为字符串    Dim i As Long '声明变量i为long    Dim j As Long '声明变量j为longEnd Sub

另外,VBA是支持一行代码声明多个变量的,不过每个变量都需要指定数据类型,如果没有指定数据类型,则默认为变体Variant。
举两个例子,下面是一行代码声明了多个变量,每个变量都指定了类型,只在开头使用了一个DIM。代码如看不全,可以左右拖动..▼

Sub 一行代码声明多个变量()    Dim s As String, i As Long, j As LongEnd Sub

下面也是一行代码声明了多个变量,但只在最后一个变量指定了类型为字符串。在有的编程语言中,这意味着a/b/c三个变量都是字符串类型,但在VBA中不是,只有c是字符串类型,a/b没有指定类型,则默认为变体。

Sub 一行代码声明多个变量()    Dim a, b, c As StringEnd Sub

……
还有个叫和尚洗头用飘柔的网友发来提问:在泡论坛时,经常见到有人声明变量i%,j&,s$,d#,请问%&$#是什么鬼?
答:和尚莫慌,我有李云龙画像在此。它们不是鬼哩,是类型声明符,或者说变量类型缩写。不过不是所有的数据类型都支持声明符,常用的只有4个。其中%是整数型Integer(其实已经不常用了,但看古董级代码时会见到),&是长整形Long(最常用的一个),$是字符串string($看起来就像string的首字母s),#是双精度浮点Double(#可以理解为双精度的双)。
……聊完了如何声明对象,看个广告放松一下,接下去咱们再说下如何为变量赋值。
如何为变量赋值
所谓为变量赋值,是指把数据储存到变量中。常见的有两种情况;一种是非对象类型的变量赋值,比如数值、字符串、日期等;一种是为对象(Object)类型的变量赋值,比如工作表等。
先说一下非对象类型的变量赋值——其实你已经会了,也就是类似咱们前面小节所使用的语句身高=120。它的完整语法如下:

[Let] 变量名=值

其中关键字Let是可以省略的,正常情况下,也都是省略的。所不同的是为对象类型的数据赋值,比如工作簿、工作表、单元格等对象。语法如下:

Set 变量名=值

语法中的关键字Set是不能省略的,不然你会找不到对象——看我眼神,骗你娶你,不论男女。
举个例子,将当前活动工作表赋值给变量sht,代码如下。

Sub 对象变量赋值()    Dim sht As Worksheet '定义变量类型为工作表。    Set sht = ActiveSheet '将当前工作表赋值给变量sht    MsgBox sht.Name '消息框显示当前工作表的名称End Sub

第3行代码是将当前工作表赋值给变量sht,这时关键字Set是不能省略的,如果省略Set,系统会发出如下所示的警告对话框,同时中断程序运行。贴士:▎为对象类型的变量赋值时遗漏Set,是新人最常见的错误;如果你以后也经常犯这样的错误,麻烦告诉我一声你到底有没有对象,是不是从来没被掐破肉过?多么痛的领悟!!!……我朋友。
……
打个响指,再给大家看另一个很典型的变量赋值的小栗子。

Sub 累加变量()    Dim k As Long    k = 1    k = k + 1    MsgBox "变量k的值是:" & kEnd Sub

▎代码解析:
第2行代码是声明变量,其名为k,其类为long,k之大,你知我知庄子不知。

第3行代码为变量k赋值,其值为1。

第4行代码是k=k+1,想一想,这句代码是怎么运行的?

第5行代码使用消息框显示结果为2,猜一猜,为什么是2?

代码之所以返回变量k的值为2,是因为语句k=k+1的作用是将k在原值(本例为1)的基础上增加了1。

那么计算机是怎么运行k=k+1的?

这句代码包含了两个操作符,一个是"+",另一个是赋值号"="。"+"的运算优先级要高于"=",因此计算机先执行k+1,结果为2;然后再执行赋值,将2赋值给变量k。

这就是一个典型的变量=表达式的赋值语句。

那么,再思考一下,下面的语句会返回什么呢?为什么?

Sub 测试()    Dim k As Long    k = 1    MsgBox k + 1 = kEnd Sub

那谁,您先想着,我这有点事,就先走了。噢,对了,麻烦记得关注我一下,关注不迷路,见面不尴尬,你说是不是这理儿?握手,咱们下期再贱。

▎系统学习Excel
推荐加入我的Excel社群 ▎扩展阅读

vba set语句_零基础学VBA编程06:什么是变量?相关推荐

  1. keil debug如何在watch直接修改变量值_零基础学VBA:什么是VBA?如何编写和运行VBA代码?...

    HI,大家好,我是星光,今天咱们来继续学习VBA.在上一章咱们讲了为什么要学习VBA~VBA还值不值得学~学了还有没有用~零基础学VBA编程01:VBA还能不能学?学了还有没有用? 这一章咱们再来简单 ...

  2. python语言程序设计难不难_零基础学Python编程开发难度大吗?从哪学起?

    转行零基础学Python编程开发难度大吗?从哪学起? 近期很多小伙伴问我,如果自己转行学习Python,完全0基础能否学会呢?Python的难度到底有多大? 今天,小编就来为大家详细解读一下这个问题. ...

  3. 我的世界python入门教程_零基础学Minecraft编程(图文版)中文pdf_Python教程

    资源名称:零基础学Minecraft编程(图文版) 中文pdf 概述 1 Minecraft 是什么 1 虚拟世界 2 Minecraft 是如何诞生的 2 Minecraft 编程是什么 2 这本书 ...

  4. response_json是什么类型数据_零基础学VBA编程第5课:什么是数据类型?

    每天一篇Excel技术图文微信公众号:Excel星球NO.79-什么是数据类型?作者:看见星光微博:EXCELers / 知识星球:Excel 嗨,大家好,我是星光,今天咱们来继续学习VBA编程. 在 ...

  5. response_json是什么类型数据_零基础学VBA编程05:什么是数据类型?

    每天一篇Excel技术图文微信公众号:Excel星球NO.79-什么是数据类型?作者:看见星光微博:EXCELers / 知识星球:Excel 嗨,大家好,我是星光,今天咱们来继续学习VBA编程. 在 ...

  6. python 少儿趣味编程下载_零基础学Python编程(少儿趣味版)

    本书是一本少儿编程入门书,适合零基础的读者.本书以"派森号"飞船和西西船长等人的童话故事为载体,从头开始介绍了Python语言的基础语法.全书共有6个章节.每章都有约十个独立的内容 ...

  7. 视频教程-零基础学C#编程—C#从小白到大咖-C#

    零基础学C#编程-C#从小白到大咖 专注编程领域,拥有多年开发经验 王小科 ¥99.00 立即订阅 扫码下载「CSDN程序员学院APP」,1000+技术好课免费看 APP订阅课程,领取优惠,最少立减5 ...

  8. 视频教程-零基础学Java编程—Java从小白到大咖-Java

    零基础学Java编程-Java从小白到大咖 专注编程领域,拥有多年开发经验 王小科 ¥168.00 立即订阅 扫码下载「CSDN程序员学院APP」,1000+技术好课免费看 APP订阅课程,领取优惠, ...

  9. 【组队学习】【34期】零基础学python编程思维

    零基础学python编程思维 航路开辟者:邓林权 领航员:沈一 航海士:覃嘉俊.马子阳.左凯文 基本信息 开源内容:https://linklearner.com/datawhale-homepage ...

  10. 0基础学python看什么书-零基础学python编程需要看什么书?

    原标题:零基础学python编程需要看什么书? 随着互联网迅速发展,python也呈现出水涨船高的态势.近年来,python在编程语言中一直名列前茅.编程初学者纷纷选择Python作为第一语言.Pyt ...

最新文章

  1. easyui-combobox的取值问题
  2. vue 添加全局组件_自定义vue2.0全局组件(下篇)
  3. Java高级语法笔记-向上层抛出异常
  4. unix c线程同步的三种方法:互斥量、读写锁以及条件变-xhb8413-ChinaUnix博客
  5. 让你更中立!腾讯微信进行灰度测试 “好看”变为“在看”
  6. ORACLE中Like与Instr模糊查询性能大比拼
  7. Ninject学习(一) - Dependency Injection By Hand
  8. 面试:Synchronized知识点
  9. alidoing --使用JS实现多语言框架、喜欢的请进、、瓦特平台!
  10. 蚂蚁庄园 php源码,求一个基于Auto.js的蚂蚁庄园脚本
  11. linux u盘 引导修复工具下载,全能u盘恢复工具
  12. 【分子动力学模拟】centos7使用gmx_MMPBSA时使用gmx_MMPBSA_ana时无法调用pyqt5
  13. Mysql 分组查询取max 那条记录其他字段
  14. 图像和base64的转换 uniapp开发
  15. java8高级应用与开发课件和贯穿案例(全)分享
  16. Matlab--蒙特卡洛方法求pi值
  17. java中一个有意思的字符串intern问题
  18. 宽度优先搜索python_宽的解释|宽的意思|汉典“宽”字的基本解释
  19. 分区放映,实现互联网电影院新增量
  20. 【架构】电商微服务架构图 -来源网络(非原创)

热门文章

  1. 关闭linux系统命令是什么,linux shutdown关闭系统命令使用介绍
  2. ssk 2g安国6981量产xp
  3. 在计算机上配置超级终端,电脑中如何添加超级终端?添加超级终端的方法
  4. UART串口驱动代码编写及总结
  5. Thymeleaf 生成静态化模板
  6. MSNMessenger忌讳用法大全(转)
  7. 卓有成效的管理者(笔记)——我能贡献什么
  8. 百度地图只显示行政区
  9. linux没有telnet命令
  10. unity 简易游戏打飞碟V2