VBA自学成柴的第二周
if 条件 Then
返回内容
End If
例如:
Sub test()
If 2 > 1 Then MsgBox "大于"
'MsgBox是弹窗,如果条件成立会弹窗并且上面写大于。
'如果条件不成立,就会略过Then后面的语句,不运行,直接结束过程。
End sub
注意:上述代码并没有加Endif,是因为Then和后面语句在同一行,如果不在同一行是需要加Endif的:
Sub test()
If 2 > 1 Then
MsgBox "大于"
End If
End sub
那如果条件不成立,该怎么办呢,这里需要用到else:
Sub test()
If 2 > 1 Then
MsgBox"大于" '条件成立,运行这一句话
else '否则
MsgBox"小于" '运行这一句话
End If
End sub
Sub test()
Dim a As Byte '设置n为byte类型
a = InputBox("输入你的成绩:")
If a < 60 Then
MsgBox "不及格"
ElseIf a <= 80 Then
MsgBox "良"
ElseIf a <= 90 Then
MsgBox "好"
Else
MsgBox "卓越"
End If
End Sub
for 变量 = x to y
需要的操作
next
例如:将所有成绩大于90分以上的同学标成红色
Sub test()
Dim a As Byte
For a = 2 to 8 '从第2行循环到第8行,为什么从第二行开始循环呢,因为第一行是列名。
if Cells(a,2) > 90 Then '如果这个单元格里面的内容大于90。为什么是第二列呢,因为第一列是姓名,不是成绩。
Cells(a,2).Interior.ColorIndex = 3 '将这个单元格的颜色改成红色
End If
Next
End Sub
Sub test()
Dim a As Byte
For a = 2 To 9 Step 2
If Left(Cells(a, 1).Value, 1) = "李" Then 'Left用于获取单元格中文本的第一个字符,然后与 "李" 进行比较。
Cells(a, 1).Interior.ColorIndex = 3
End If
Next
End Sub
for a = 1 to 6 '外层循环6次
for b = 1 to 6 '内层循环10次,一共循环60次
next b
next a
例子:将所有85分及以上的同学标成红色
Sub test()
Dim a as Byte
Dim b as Byte
For a = 2 to 9 '循环行,从第二行到第九行
For b = 2 to 4 Step 2 '循环列,在循环行的基础下,循环列,这里只求分数那列,所以是2,4列,步长是2。
If Cells(a,b) >= 85 Then ' 如果单元格内成绩大于85
Cells(a,b).Interior.ColorIndex = 3 '将单元格颜色变成红色
End if
Next b
Next a
End Sub
我们可以看到我们进行for循环时,对于单元格的选择都是固定的,如果表改变了,就失效了,不能动态选择,所以我们需要学习动态选择。
通过End函数获取数据的边界
函数名 | 功能 |
---|---|
End(xlUp) | 上 |
End(xlDown) | 下 |
End(xlToLeft) | 左 |
End(xlToRight) | 右 |
基本原理:定义一个初始单元格,Range(“”),从这单元格四散开来。
Sub test()
Range("a1").End(xlToRight) '以a1单元格为基础,定位到它的最右边有数据的列。
Range("a1").End(xlDown) '以a1单元格为基础,定位到它的最下边有数据的列。
End Sub
如果想获取表格的行号和列号,可以通过Row和Column函数。
Sub test()
Range("a1").End(xlToRight).Column '获取列号
Range("a1").End(xlDown).Row '获取行号
End Sub
那么这里就可以通过动态获取表来完善上面的例子。将所有85分及以上的同学标成红色。
Sub test()
dim a as byte
dim b as byte
y= Range("a1").End(xltoRight).Column '获取到列的边界
x=Range("a1").End(xlDown).Row '获取到行的边界
for a = 2 to x '将9换成x,直接用函数动态获取的值,而不是固定的值
for b = 2 to y Step 2 '将4换成y,使用函数动态获取的值,而不是固定的值
If Cells(a,b) > 85 Then
Cells(a,b).Interior.ColorIndex = 3
End If
Next b
Next a
End Sub
有的时候,数据中间要是有空缺的话,从第一格开始定位的为,定位位置就会在空格前停下,所以我们可以从单元格最后一列或者是一行开始定位,这里就需要用到rows和columns函数。rows代表行的集合,返回range对象,例如rows()就是代表这个工作簿的所有行,而columns就是代表这个工作簿所有的列。
那么继续完善上述例子。将所有85分及以上的同学标成红色。
Sub test()
Dim a As Byte
Dim b As Byte
x = Cells(Rows.Count, "a").End(xlUp).Row
y = Cells(1, Columns.Count).End(xlToLeft).Column
For a = 2 To x
For b = 2 To y Step 2
If Cells(a, b) > 85 Then
Cells(a, b).Interior.ColorIndex = 3
End If
Next b
Next a
End Sub
用end来定位边界,可能会遇到各种错误,有的值的空缺会导致结果不准,而UsedRange是一种更智能的选择方式。
UsedRange是工作表的一个属性,代表指定工作表上的所用区域。
那么通过UsedRange完善以上例子就是这样的。
Sub test()
Dim a,b as Byte
x = ActiveSheet.UsedRange.Rows.Count
y = ActiveSheet.UsedRange.Columns.Count
For a = 2 to x
For b = 2 to y Step 2
If Cells(a,b) > 85 Then
Cells(a,b).Interior.ColorIndex = 3
End if
Next b
Next a
End Sub
UsedRange缺点:由于是指定所有所用区域,但是有的时候可能工作表里面不止一组数据,或者说有其他注释或者杂乱的数据,这个时候使用UsedRange会把这些数据也全部包括进去,所以这种情况下不能使用UsedRange。
为了弥补UsedRange的局限性,我们使用CurrentRegion属性来定位所使用的区域,CurrentRegion是单元格的一个属性,代表单元格所在的区域。但是如果单元格周围没有数据,就连接不上,无法扩展到全部的区域。
同样的我们使用CurrentRegion来完成上面的例子。
Sub test()
Dim a,b as Byte
x = Range("a1").CurrentRegion.Rows.Count
y = Range("a1").CurrentRegion.Columns.Count
For a = 2 to x
For b = 2 to y Step 2
If Cells(a,b) > 85 Then
Cells(a,b).Interior.ColorIndex = 3
End if
Next b
Next a
End Sub
If:用于判断单元格的数据是否满足条件。
For:用于按次数重复执行的代码,可以和if结合,来判断数据是否符合条件。
获取使用单元格:
方法 | 获取格式 | 优点 | 缺点 |
---|---|---|---|
End | Range(“a1”).End(xltoDown).Row Range(“a1”).End(xltoRight).Column | 代码简洁,容易理解 |
|
End | Cells(Rows.Count,“a”).End(xlUp).Row Cells(1,Columns.Count).End(xltoLeft).Column | 相比较于上一种方法能处理部分空白格的数据 | 对于大型数据集的处理能力有限 |
UsedRange | ActiveSheet.UsedRange.Rows.Count ActiveSheet.UsedRange.Columns.Count | 无论是否存在空白格,对于数据集的处理都比较有效 |
|
CurrentRegion | Range(“a1”).CurrentRegion.Rows.Count Range(“a1”).CurrentRegion.Columns.Count | 相比较其他方式是较为准确的一种 |
|
https://www.bilibili.com/video/BV1m14y167as/?spm_id_from=333.999.0.0&vd_source=954e393a44ae646af7e21518b8aabc12