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 中的顺序就是从上到下、从左到右的顺序。

在示例中,首先运行两个声明语句,然后运行循环结构,以此类推。值得注意的是,当程序有嵌套时,嵌套的部分也是按照顺序执行的。

VBA 顺序结构

2.循环结构

第二个基本结构是循环结构。当使用循环结构时,循环部分代码,按照指定的循环次数,循环重复执行。

在我们的示例中,For 至 Next i 之间的代码就是一个循环代码。

VBA 循环结构

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 程序了。

转载注明:文章转载自「懒人Excel - www.lanrenexcel.com
本文链接:VBA 程序结构入门
订阅评论
提醒
52 评论
最新
最旧 最多投票
内联反馈
查看所有评论
excel萌新
4 月 前

老师请问VBA有没有自动格式化(自动缩进)的功能呢?

xiaowang
4 月 前

给老师点赞一万个

cafin
8 月 前

我这段运行错误,不知道是哪里写错了
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

B&D&M
4 月 前
回复给  懒人Excel

为什么不是减号啊?不是i单元格内数值等于i-1单元格内的数值么?

echo
8 月 前

Sub gh()
    Workbooks(1).Sheet(1).Range("a50") = "你好"
    Workbooks(2).Sheet(1).Range("a50") = "回家"
    Workbooks(3).Sheet(1).Range("a50") = "挥洒s"
End Sub

请教一下为什么运行会提示对象不支持该属性或方法,只打开了3个工作簿,谢谢

公司附近的上
1 年 前

f5了半天我说咋没数据呢,原来a1单元格没有数据,所以后面都没有,这个循环相当于个填充0.0,我了勒个去

pan
1 年 前

笔记 单元格 cells 判断非空“” 引号里面不加空格

远东宾邦猫
1 年 前

 '存储单元格是否为空的结果
    isBlank = Cells(i, 1).Value = ""

这段代码把我卡了好久,
第一个等号理解了,
但是第二个等号,我一直理解为对Cells(i, 1)赋空值
后来网上搜,有个解释说等号也不一定代表赋值....
然后才悟了一下

14564
1 年 前
回复给  远东宾邦猫

=两边都是单元格可以是复制粘贴的作用

蜗牛不会走路
1 年 前

2.循环结构第二个基本结构是循环结构。当使用循环结构时,循环部分代码,按照指定的循环次数,循环重复执行。
在我们的示例中,For 至 Next i 之间的代码就是一个循环代码。 最后6个字,一个循环代码,换为:一段循环代码 好一些。希望作者大大采纳。非常赞的教程,每天学习一点点,跟着进步。

蜗牛不会走路
1 年 前

在示例中,首先运行两个声明语句,然后运行循环结构,以此类推。值得注意的事,当程序有嵌套时,嵌套的部分也是按照顺序指定的。
作者大大:这里面有2处,我想更换一下更好一些: 第一,值得注意的事,这个“事”应该换为“是”;第二,按照顺序指定的,这里的“指定”更换为“执行”或者“运行”是否更妥帖呢?

打怪一路
2 年 前

想问下为什么选择不到应该运行的宏名?

数据的奴隶
2 年 前

这篇写的很精彩,骨架一下就搭起来了

小白橙子
2 年 前

请问如果是文本类型的,应该怎么更改呢?把Dim i As Integer更改为 Dim i As String吗?

小白阿奇
2 年 前

如果不是第i行,第1列,而是第i行,第N列,是不是就是Cells(i,j) = Cells(i – 1,j-1) 这样表达可以吗?

胖虎1
2 年 前

啥时候更新啊

Ranger1222
2 年 前

麻烦问下,怎么判定是在A列运行的呢

川流不息
2 年 前

请问将数据用Excel文件计算后形成一个表格再转换到一个固定格式的word文件需要用到VBA吗还是用其他方法?

最后由川流不息编辑于2 年 前
Coral
3 年 前

可以设置回车后就自动缩进吗?为何选了’自动缩进‘,还是需要我用TAB键或选择’缩进‘按钮自己缩进?

Coral
3 年 前

写的很棒。‘End Sub 为结尾部分是一个过程的主题’,应该是主体吧?

xuyu
3 年 前

 isBlank = Cells(5, 1) = ""
这一句不太明白,将“”赋值给cells(5,1)这个单元格那么isblank不一定是“”吗

ag
1 年 前
回复给  xuyu

这个其实应该很好理解才对,isblank是变量,代指Cells(i, 1).value,第二个等号就是判断这个单元格是否为""

Roger Liu
3 年 前
回复给  懒人Excel

两个=号长得一样啊,程序根据什么判断的谁是谁,执行顺序和规则是什么呢?

落日橙
1 年 前
回复给  懒人Excel

能否用括号进行标识?

Hubert
3 年 前

不知道现在评论能不能得到作者回复。。超级牛逼的网站。。干净好用

Big C
3 年 前

小白想问
那个isBlank 是固定的规则吗?
Cells 代表的对象,像这种固定有说法的参数什么的要在哪去看啊
为什么每一行代码前面要空格啊?是手动打出来那些空格的吗?

最后由Big C编辑于3 年 前
Big C
3 年 前
回复给  懒人Excel

哦哦哦 谢谢
教程非常棒!!

Clementh
3 年 前

还是不什明白以下的逻辑.

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

Hubert
3 年 前
回复给  懒人Excel

感谢解答

small k
3 年 前

这个网站不错,值得推荐

cufu
4 年 前

今天的学习结束 加油!

52
0
希望看到您的想法,请您发表评论x