VBA自学日志

文章目录

  • 前言
  • 一、循环语句
    • 1.1 If 语句
    • 1.2 For 循环语句
  • 二、区域选择
    • 2.1 End动态数据区域
    • 2.2 UsedRange
    • 2.3 CurrentRegion
  • 总结
  • 引用


前言

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分以上的同学标成红色

VBA自学日志_第1张图片

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 几,就可以跳几行循环。
    例子:将所有姓李的同学标成红色
    VBA自学日志_第2张图片
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分及以上的同学标成红色
VBA自学日志_第3张图片

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分及以上的同学标成红色。
VBA自学日志_第4张图片

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分及以上的同学标成红色。
VBA自学日志_第5张图片

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完善以上例子就是这样的。
VBA自学日志_第6张图片

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来完成上面的例子。
VBA自学日志_第7张图片

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
无论是否存在空白格,对于数据集的处理都比较有效
  • 由于Excel内部处理方式,UsedRange可能无法即时更新,需要手动更新
  • 对于庞大数据集,可能会包含一些无用单元格,导致效率低
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

你可能感兴趣的:(VBA自学日志,excel)