2.5.1-Sub过程
2.5.2-工作簿-工作表-单元格
2.5.3-工作表某列最大行
2.5.4-顺序-循环-判断
2.5.5-数据类型
这是第一个项目,所以先介绍一下基本VBA知识概念,然后再针对当前项目说说编写细节。
写代码的一般步骤,先创建一个模块,一个复杂的项目工作可能需要多个模块,本项目很简单,只需要一个模块。在模块中写入代码,一个模块可能包含有多个过程或者函数构成,过程或者函数都可以理解成一个代码块,写代码有的时候就像拼装积木,每一个过程或者函数就是一种类型的积木,可以重复使用。简单的理解项目中的代码结构如图2-9所示,对于一般用户来说这个结构已经够用了。
过程指的是Sub…End Sub
函数指的是Function…End Function
本项目只涉及到1个模块1个过程,具体代码如2.4节所示,Sub过程的结构如下图所示。
Sub 过程名称() 业务逻辑写在这里 End Sub
每一个过程有一个唯一的名称,区别于其它过程或者函数,Sub 过程名称()。注意()不能省略,Sub过程名称支持中文,也可以使用英文。VBA中很多代码结构都是显式的闭环结构,例如Sub …End Sub,就是能够明显看出来哪里开始哪里结束,后续也会介绍其它闭环结构
回顾之前的逻辑思路,本质上来讲,就是从某一个工作表的单元格中获取需要的信息写入另外一个工作表。那么怎么用VBA来获取呢?
首先说说在2.2节提到的3个基本概念在VBA的表达:
工作簿:先说说当前工作簿,ThisWorkbook,那么如果操作其它Excel文件呢?这个后续会介绍,会有不同的表达方式
工作表:Worksheets(“工作表名”)
单元格:Range(“单元格位置”),Cells(行号, 列号)
我们想要获取某个单元格的内容,必须先定位该单元格,这个有点像快递地址,省-市-区-小区,必须唯一明确。定位单元格的方式为:工作簿.工作表.单元格。如想获取成绩查询界面工作表中B1单元格拟查询学员的姓名,可以采用以下方式:
Set shtUI = ThisWorkbook.Worksheets("成绩查询界面")
searchName = shtUI.Range("B1")
上面两行代码对于完全不懂编程的人来说,可能还是比较懵,VBA代码其实就是一行一行的语句,代码的执行主体也是一行一行往下执行的(后续介绍循环和判断结构会不同)。以上两行代码每一行代码可以理解成两部分:等号左边和等号右边。等号左边称为变量,等号右边称为该变量的取值。
变量:矩形的面积为s = a × b,其中a为长度,b为宽度。这里的s,a,b都可以称为变量,对于每一个不同的矩形,a和b即长和宽都可能不同,计算得出的面积s也不同,但他们之间的规律是固定的,即s = a × b。
VBA代码是不区分大小写的,也就是变量a和变量A表示的为同一个变量
在以上两行代码中,等号的右边可以理解为一个常量,它是固定不变的,等号的右边也可以是一个变量,后续会介绍到。本质上就是将等号右边的取值赋值给等号左边的变量。回归到本示例:
第1行定义一个变量来表示成绩查询界面工作表,是通过工作簿.工作表来定义的,这里注意前面有一个Set。在某些情况下我们需要使用Set,某些情况不需要,如第2行就不需要。记住定义工作表对象时需要提供Set,后续哪些场景需要也会逐一给出,默认都是不需要Set来进行赋值操作。
第2行定义一个变量来表示成绩查询界面工作表中单元格B1中的取值,是通过工作表.单元格来定义的,注意这里单元格的位置通过Range(“列号行号”)构成,与Cells是有区别的。
我们在查询某个学员的成绩时,需要对每一个成绩表进行逐行判断,代码其实是对其每一行与拟查询人员进行比较。那么就有一个问题,Excel2016工作表有1048576行,不可能需要对每一行都需要判断,太低效了。我们只关注那些有信息的行,通过以下方式我们就可以获取到所选列有信息(非空白)的最大行。
maxRow = shtYuwen.Cells(Rows.Count, "B").End(xlUp).Row
以上代码翻译成汉语: B列最大行 = 工作表.单元格(最大行,B列).从最大行向上数到最后一行有信息的行.行号
之前介绍了代码的基本存放结构,最小单元可以理解为一个Sub或者Function,那么在Sub内代码是如何组织的呢?
如上文所说,VBA代码本质上就是一行一行的字符串,默认代码执行是在按顺序往下执行,也就是我们所说的顺序结构。
另外还有2种常用的结构,循环和判断。在本示例中就有比对姓名,这个就是判断,常用的判断结构如下所示,根据条件数目的不同,可以增加Elseif的数量,或者只有Else。
If 判断条件1 Then
满足条件1执行代码
ElseIf 判断条件2 Then
满足条件2执行代码
Else
以上条件都不满足执行代码
End If
另外在本示例中需要一行一行的比对姓名,在每一个工作表中找到拟查询姓名,存在大量的重复工作,这里就需要使用循环结构,减少代码量。循环是代码中一个比较神奇的地方,我们日常在Excel中的一些重复的工作,往往一个循环就可以了,是不是感觉效率在向你招手。以下代码中Step表示步长,每次循环可以增长1,也可以增长2,根据需求自由设置。
For i = 开始 To 结束 Step 1
执行代码
Next i
数据类型,在数学中我们也有类似的概念,整数、实数等。在代码的世界中,会有些不同。常用的数据类型有:整数、浮点数、字符串、布尔数、日期等。
整数:1,2,3,4,5。一般可以用来循环
浮点数:0.1,1.5,2.8。可以简单理解为小数
字符串:一个由双引号包围起来字符,如”abcd1234”
布尔数:只包括2个值,True和False,一般用在判断中
日期:表示日期或者时间
VBA中如果没有强制设置所有变量在使用前必须声明时,那么变量是不需要提前声明的。对于没有提前声明变量数据类型的变量,该变量对应的数据类型是可以变化的。如下面的示例中,变量a赋值不同时,对应的数据类型也是不同的。
Sub test()
a = "test"
Debug.Print ("位置1:")
Debug.Print (TypeName(a))
a = 2
Debug.Print ("位置2:")
Debug.Print (TypeName(a))
a = True
Debug.Print ("位置3:")
Debug.Print (TypeName(a))
a = 1.3
Debug.Print ("位置4:")
Debug.Print (TypeName(a))
End Sub
运行结果:其中String表示字符串;Integer表示整数;Boolean表示布尔数;Double为浮点数
位置1:
String
位置2:
Integer
位置3:
Boolean
位置4:
Double
联系客服