VBA 程序结构入门
从本篇开始,我们进入 VBA 语法的另外一个重要概念,程序结构。
上一章学习的变量、数据类型、运算符等概念,是 VBA 中"静态"
的部分。相对的,程序结构是 VBA 中 "动态"
的部分。学习完程序结构,才能真正写出可以运行的 VBA 程序。
本篇我们先介绍程序结构最常用的部分,深入学习前有一个基本概念。本章余下的教程中,将详细介绍每一个程序结构。
程序结构示例
首先,本篇将使用以下代码,介绍各种程序结构,大家可以先看一下。
Sub MyCode()
'声明循环变量和是否为空变量
Dim i As Integer
Dim isBlank As Boolean
'循环 A2-A10 单元格
For i = 2 To 10
'存储单元格是否为空的结果
isBlank = Cells(i, 1).Value = ""
'如果为空,则用上方的单元格的值填充当前单元格
If isBlank Then
Cells(i, 1) = Cells(i - 1, 1)
End If
Next i
End Sub
以上代码运行后,在 A2:A10 单元格区域,依次判断每一个单元格是否为空,如果是空,则用上一个单元格的值填充。
过程
过程是 VBA 中,程序实际运行的最小结构。单独的一行或多行代码无法运行,必须把它们放置在一个过程里,才能运行。
在示例中,Sub 过程名()
开头,End Sub
为结尾部分是一个过程的主体,其余代码需要放置在两者之间。
Sub MyCode()
End Sub
程序语句
语句,是表示一个完整意思的一行代码。
例如,示例中第一行,声明变量就是一条语句。它表示,声明一个整型变量。同理,第二行、第三行和其余的每一行都是语句。VBA 中的过程,就是由这样一条条语句构成的。
Dim i As Integer
Dim isBlank As Boolean
通常,一行就是一个语句,除非它用换行符或合并符号,具体可以阅读「VBA 运算符入门」。
Excel VBA 对象
我们学习 VBA 的最终目的是操纵 Excel,完成一些特定的目标。其中,操纵 Excel 就是通过 Excel VBA 对象完成的。
在示例中,Cells()
就是一个 Excel VBA 对象,表示一个单元格,提供行号和列号指定单元格。
程序运行结构
接下来是程序结构中最核心的部分,也是最有意思的部分,程序运行结构。大部分编程语言都具备基本的三种程序运行结构,分别是顺序结构、循环结构、判断结构。各种简单到复杂的算法,都是由这三种基本的结构,相互组合而完成。
1.顺序结构
首先是基本的顺序结构。顺序结构,顾名思义就是按照顺序依次执行。VBA 中的顺序就是从上到下、从左到右的顺序。
在示例中,首先运行两个声明语句,然后运行循环结构,以此类推。值得注意的是,当程序有嵌套时,嵌套的部分也是按照顺序执行的。
2.循环结构
第二个基本结构是循环结构。当使用循环结构时,循环部分代码,按照指定的循环次数,循环重复执行。
在我们的示例中,For 至 Next i 之间的代码就是一个循环代码。
VBA 中,有多种循环结构,本例中是 For 循环结构。For 循环结构中,第一行指定循环次数,最后一行表示开始下一个循环。
'循环开始
For i = 2 To 10
'这里是循环的代码
Next i
3.判断结构
最后一种基本结构是,判断结构。简单来说,该结构中,当提供的表达式为真(True)时,判断结构的主体部分才会被执行,否则跳过。
在示例代码中,If 开头和 End If 结尾处是典型的判断结构。第一行,判断 isBlank 变量是否为真,如果是,则执行判断结构主体部分,否则跳过。
'如果为空,则用上方的单元格的值填充当前单元格
If isBlank Then
Cells(i, 1) = Cells(i - 1, 1)
End If
注释
通常,一段代码写完后,不会完全没问题。在实际使用过程中可能需要修改,符合最新的需求。过一段时间再打开查看时,可能已经忘记了当时的思路,不能很快想起来有些代码实际的用途,更不用说让别人查看了。这时,就需要注释出场了。
注释是对代码的一种解释,不影响代码的运行。VBA 中的注释语句是,以英文单引号 (')
开头,后接需要解释说明的内容。
注释可以让代码更容易理解,建议从一开始就养成写注释的习惯。
运行
下面,我们实际运行我们的示例代码,看一看它具体的效果。
总结
现在你学会了基本的 VBA 程序结构。可以运行的最小单位是 VBA 过程,一个 VBA 过程由一个或多个语句组成,每一个语句表示一个完整的含义。VBA 是按顺序结构执行,遇到循环结构和判断结构时,根据提供的参数循环重复执行,或跳过某一段代码。
本章余下教程,将详细介绍以上每一部分。学完本章后,你就可以写出一个完整可运行的 VBA 程序了。
老师请问VBA有没有自动格式化(自动缩进)的功能呢?
没有的,需要借助插件实现自动缩进功能。
给老师点赞一万个
我这段运行错误,不知道是哪里写错了
Sub 宏5()
Dim i As Integer
Dim ist As Boolean
For i = 1 To 10
ist = Cells(i, 1).vlaue = “”
If ist Then
Cells(i, 1) = Cells(i – 1, 1)
End If
Next i
End Sub
Cells(i, 1) = Cells(i – 1, 1) 这个语句中,i – 1这里的横杠,不是减号,需要改一下。
为什么不是减号啊?不是i单元格内数值等于i-1单元格内的数值么?
是要写减号,但是一级评论里的不是减号,是看起来像减号的其他横杠符号,所以需要改一下。
Sub gh()
Workbooks(1).Sheet(1).Range(“a50”) = “你好”
Workbooks(2).Sheet(1).Range(“a50”) = “回家”
Workbooks(3).Sheet(1).Range(“a50”) = “挥洒s”
End Sub
请教一下为什么运行会提示对象不支持该属性或方法,只打开了3个工作簿,谢谢
Sheet用错了,应该是Sheets或者Worksheets
f5了半天我说咋没数据呢,原来a1单元格没有数据,所以后面都没有,这个循环相当于个填充0.0,我了勒个去
是的,初始数据从A1单元格读取的
笔记 单元格 cells 判断非空“” 引号里面不加空格
‘存储单元格是否为空的结果
isBlank = Cells(i, 1).Value = “”
这段代码把我卡了好久,
第一个等号理解了,
但是第二个等号,我一直理解为对Cells(i, 1)赋空值
后来网上搜,有个解释说等号也不一定代表赋值….
然后才悟了一下
=两边都是单元格可以是复制粘贴的作用
赞!自己悟了,很难再忘记
2.循环结构第二个基本结构是循环结构。当使用循环结构时,循环部分代码,按照指定的循环次数,循环重复执行。
在我们的示例中,For 至 Next i 之间的代码就是一个循环代码。 最后6个字,一个循环代码,换为:一段循环代码 好一些。希望作者大大采纳。非常赞的教程,每天学习一点点,跟着进步。
在示例中,首先运行两个声明语句,然后运行循环结构,以此类推。值得注意的事,当程序有嵌套时,嵌套的部分也是按照顺序指定的。
作者大大:这里面有2处,我想更换一下更好一些: 第一,值得注意的事,这个“事”应该换为“是”;第二,按照顺序指定的,这里的“指定”更换为“执行”或者“运行”是否更妥帖呢?
感谢反馈,两处均已修改
想问下为什么选择不到应该运行的宏名?
查看以下情况:
1、编写的宏是否待参数了?带参数的宏无法通过宏列表运行。
2、代码模块顶部是否启用了option private module修饰语?如果是,表示对外不可见。
这篇写的很精彩,骨架一下就搭起来了
请问如果是文本类型的,应该怎么更改呢?把Dim i As Integer更改为 Dim i As String吗?
是的,目标数据什么类型,就先定义为什么类型。
如果变量类型和数据的实际类型不一致,VBA将提示【类型不匹配】运行时错误。
如果不是第i行,第1列,而是第i行,第N列,是不是就是Cells(i,j) = Cells(i – 1,j-1) 这样表达可以吗?
对的,列也是使用变量替代的。
啥时候更新啊
近期开始更新,感谢灯等待
麻烦问下,怎么判定是在A列运行的呢
通过Cells属性的第二个参数,即列参数,指定1,就是A列
请问将数据用Excel文件计算后形成一个表格再转换到一个固定格式的word文件需要用到VBA吗还是用其他方法?
如果要求以自动化的形式转换,除了VBA,还可以使用Word的邮件合并功能,也可以达到自动转换的目标。
这块内容本站还没有发布,感兴趣在网上搜一下相关的用法。
可以设置回车后就自动缩进吗?为何选了’自动缩进‘,还是需要我用TAB键或选择’缩进‘按钮自己缩进?
勾选自动缩进选项,保证每次回车,下一行与上一行垂直对齐。不知道你的需求是这个吗?
写的很棒。‘
End Sub
为结尾部分是一个过程的主题’,应该是主体吧?感谢反馈,已修正
isBlank = Cells(5, 1) = “”
这一句不太明白,将“”赋值给cells(5,1)这个单元格那么isblank不一定是“”吗
这个其实应该很好理解才对,isblank是变量,代指Cells(i, 1).value,第二个等号就是判断这个单元格是否为””
这个语句中,第一个 = 号是赋值符号,第二个 = 号是判断符号。
先运行Cells(5, 1) = “”,因为第五行单元格是空的,因此就是 “” = “”,结果为 true。然后将 true 赋值给 isBlank 变量中
两个=号长得一样啊,程序根据什么判断的谁是谁,执行顺序和规则是什么呢?
根据结果以及语句性质判断,程序是从左向右解析一个语句。当遇到第一个 = 时,认为这是一个赋值语句;那么后面就是一个表达式。在这个例子中,后面是一个比较表达式。
能否用括号进行标识?
可以的,这样意思就更清晰
不知道现在评论能不能得到作者回复。。超级牛逼的网站。。干净好用
当然可以!感谢肯定,欢迎多评论、反馈、建议
小白想问
那个isBlank 是固定的规则吗?
Cells 代表的对象,像这种固定有说法的参数什么的要在哪去看啊
为什么每一行代码前面要空格啊?是手动打出来那些空格的吗?
isBlank是变量,每次循环时判断对应单元格是否空,然后再进一步填充空单元格。
每行代码的缩进和缩进量,是VBA编辑器自动调整的,也可以手动调整。
哦哦哦 谢谢
教程非常棒!!
还是不什明白以下的逻辑.
isBlank=Cells(i,1).Value=”” Cells(i,1) 的1代表是什么?
If isBlank Then
Cells(i,1) = Cells(i – 1,1) 如果是空,i-1是什么,1又是什么呢?
End If
Next i
Cells 对象的参数分别是行号和列号。
Cells(i,1)里,表示第 i 行,第 1 列。
感谢解答
这个网站不错,值得推荐
今天的学习结束 加油!