VBA自学日志

发布时间:2024年01月15日


前言

VBA自学成柴的第二周


一、循环语句

1.1 If 语句

  • 基本语法:
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
  • if 嵌套,如果有很多个条件,中间就用Elseif衔接,最后用else收尾:
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

1.2 For 循环语句

  • 基本语法:
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
  • for 循环步长,意思就是可以跳着循环,step 几,就可以跳几行循环。
    例子:将所有姓李的同学标成红色
    在这里插入图片描述
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循环嵌套
    用于多层循环。
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循环时,对于单元格的选择都是固定的,如果表改变了,就失效了,不能动态选择,所以我们需要学习动态选择。

2.1 End动态数据区域

通过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

2.2 UsedRange

用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。

2.3 CurrentRegion

为了弥补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结合,来判断数据是否符合条件。

  • 获取使用单元格:

方法获取格式优点缺点
EndRange(“a1”).End(xltoDown).Row
Range(“a1”).End(xltoRight).Column
代码简洁,容易理解
  • 对于大型数据集处理能力有限
  • 很难处理有空白格的数据集
EndCells(Rows.Count,“a”).End(xlUp).Row
Cells(1,Columns.Count).End(xltoLeft).Column
相比较于上一种方法能处理部分空白格的数据对于大型数据集的处理能力有限
UsedRangeActiveSheet.UsedRange.Rows.Count
ActiveSheet.UsedRange.Columns.Count
无论是否存在空白格,对于数据集的处理都比较有效
  • 由于Excel内部处理方式,UsedRange可能无法即时更新,需要手动更新
  • 对于庞大数据集,可能会包含一些无用单元格,导致效率低
CurrentRegionRange(“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

文章来源:https://blog.csdn.net/dkmaa/article/details/135442586
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。