VBA 控制结构:If-Else、For、Do-While
理解 控制结构是编程的核心,它们决定了代码执行的流程和逻辑。在VBA中,掌握控制结构能够让你编写更高效、更灵活的宏。
1. If-Else 条件语句
条件语句 让程序能够基于不同条件执行不同的代码块。
1.1 基本 If-Else 结构
输入 以下代码到VBA编辑器:
If 条件 Then
' 条件为真时执行的代码
Else
' 条件为假时执行的代码
End If
使用 示例,判断数字是否大于10:
Dim num As Integer
num = 15
If num > 10 Then
MsgBox "数字大于10"
Else
MsgBox "数字小于或等于10"
End If
1.2 多条件判断
使用 ElseIf 处理多个条件:
If 条件1 Then
' 条件1为真时执行的代码
ElseIf 条件2 Then
' 条件2为真时执行的代码
ElseIf 条件3 Then
' 条件3为真时执行的代码
Else
' 所有条件都为假时执行的代码
End If
应用 示例,根据成绩评定等级:
Dim score As Integer
score = 85
If score >= 90 Then
MsgBox "优秀"
ElseIf score >= 80 Then
MsgBox "良好"
ElseIf score >= 70 Then
MsgBox "中等"
ElseIf score >= 60 Then
MsgBox "及格"
Else
MsgBox "不及格"
End If
1.3 嵌套If语句
构建 复杂判断逻辑时,可以将If语句嵌套使用:
If 条件1 Then
' 条件1为真时执行的代码
If 条件2 Then
' 条件1和条件2都为真时执行的代码
End If
Else
' 条件1为假时执行的代码
End If
1.4 If函数简写形式
使用 单行If语句简化代码:
If 条件 Then [语句1] Else [语句2]
应用 示例:
Dim result As String
result = If(10 > 5, "大于", "不大于")
MsgBox result ' 输出"大于"
2. For 循环结构
循环结构 允许重复执行代码块,对于处理大量数据特别有用。
2.1 For Next 循环
输入 基本语法:
For 计数器 = 起始值 To 结束值 [Step 步长]
' 循环体
Next 计数器
使用 示例,打印1到5的数字:
Dim i As Integer
For i = 1 To 5
Debug.Print i
Next i
指定 步长,每次增加2:
For i = 1 To 10 Step 2
Debug.Print i ' 输出1, 3, 5, 7, 9
Next i
2.2 For Each 循环
遍历 集合中的每个元素:
For Each 元素 In 集合
' 处理每个元素的代码
Next 元素
应用 示例,遍历工作表中的单元格:
Dim cell As Range
For Each cell In Range("A1:A10")
cell.Value = cell.Value * 2
Next cell
2.3 循环控制(Exit For)
中断 循环执行:
For i = 1 To 100
If 条件 Then
Exit For ' 当条件满足时退出循环
End If
' 循环体
Next i
应用 示例,查找第一个空白单元格:
Dim rng As Range
For Each rng In Range("A1:A100")
If rng.Value = "" Then
MsgBox "找到空白单元格:" & rng.Address
Exit For
End If
Next rng
2.4 循环优化技巧
避免 在循环中使用可能改变集合大小的操作:
' 不推荐的做法
For i = 1 To Sheet1.UsedRange.Rows.Count
If Sheet1.Cells(i, 1).Value = "删除" Then
Sheet1.Rows(i).Delete ' 这会改变行数,导致后续索引错误
End If
Next i
改用 逆序循环:
' 推荐的做法
For i = Sheet1.UsedRange.Rows.Count To 1 Step -1
If Sheet1.Cells(i, 1).Value = "删除" Then
Sheet1.Rows(i).Delete
End If
Next i
3. Do-While 循环结构
Do循环 适用于不确定循环次数的情况,可以根据条件继续或终止循环。
3.1 Do While...Loop 循环
使用 语法:
Do While 条件
' 循环体
Loop
应用 示例,累计数字直到超过100:
Dim total As Integer
Dim num As Integer
total = 0
num = 1
Do While total <= 100
total = total + num
num = num + 1
Loop
MsgBox "总和为:" & total & ",最后一个添加的数字是:" & (num - 1)
3.2 Do...Loop While 循环
使用 语法,确保循环至少执行一次:
Do
' 循环体
Loop While 条件
应用 示例,要求用户输入有效数据:
Dim userInput As String
Do
userInput = InputBox("请输入1-100之间的数字:")
Loop While IsEmpty(userInput) Or Not IsNumeric(userInput) Or _
CInt(userInput) < 1 Or CInt(userInput) > 100
MsgBox "您输入的数字是:" & userInput
3.3 Do Until...Loop 循环
使用 语法,循环直到条件为真:
Do Until 条件
' 循环体
Loop
应用 示例,生成随机数直到得到特定值:
Dim randomNum As Integer
Do
randomNum = Int((100 * Rnd) + 1)
Debug.Print "生成的随机数:" & randomNum
Loop Until randomNum = 42
MsgBox "找到了42!"
3.4 Do...Loop Until 循环
使用 语法,确保循环至少执行一次:
Do
' 循环体
Loop Until 条件
应用 示例,检查用户是否要继续:
Dim continue As String
Do
' 这里执行你的主要任务
MsgBox "执行任务..."
continue = InputBox("是否继续?(y/n)")
Loop Until LCase(continue) = "n"
3.5 循环控制(Exit Do)
跳出 Do循环:
Do While 条件1
' 循环体
If 条件2 Then
Exit Do ' 当条件2满足时退出循环
End If
Loop
应用 示例,处理数据直到找到特定值或处理完所有数据:
Dim cell As Range
Dim found As Boolean
found = False
Do While Not found And Not IsEmpty(ActiveCell)
If ActiveCell.Value = "停止" Then
found = True
Exit Do
End If
' 处理当前单元格的代码
ActiveCell.Offset(1, 0).Activate
Loop
4. 实际应用案例
4.1 数据处理应用
创建 宏,统计工作表中特定列的数据:
Sub 数据统计()
Dim lastRow As Long
Dim i As Long
Dim count As Long
Dim sum As Double
Dim avg As Double
' 获取最后一行
lastRow = Cells(Rows.Count, "A").End(xlUp).Row
' 初始化变量
count = 0
sum = 0
' 遍历数据
For i = 1 To lastRow
If IsNumeric(Cells(i, 1).Value) Then
' 如果是数字,增加计数并添加到总和
count = count + 1
sum = sum + Cells(i, 1).Value
End If
Next i
' 计算平均值
If count > 0 Then
avg = sum / count
Else
avg = 0
End If
' 输出结果
Cells(1, 3).Value = "数据个数"
Cells(1, 4).Value = count
Cells(2, 3).Value = "总和"
Cells(2, 4).Value = sum
Cells(3, 3).Value = "平均值"
Cells(3, 4).Value = avg
End Sub
4.2 文件操作应用
创建 宏,批量处理Excel文件:
Sub 批量处理文件()
Dim folderPath As String
Dim fileName As String
Dim wb As Workbook
Dim ws As Worksheet
' 选择文件夹
folderPath = BrowseForFolder("请选择包含Excel文件的文件夹")
If folderPath = "" Then Exit Sub
' 获取第一个Excel文件
fileName = Dir(folderPath & "\*.xls*")
' 处理每个文件
Do While fileName <> ""
' 打开工作簿
Set wb = Workbooks.Open(folderPath & "\" & fileName)
' 对每个工作表进行处理
For Each ws In wb.Worksheets
' 假设我们要删除空行
删除空行 ws
Next ws
' 保存并关闭
wb.Close SaveChanges:=True
fileName = Dir() ' 获取下一个文件
Loop
MsgBox "文件处理完成!"
End Sub
Function 删除空行(ws As Worksheet)
Dim rng As Range
Dim i As Long
Dim lastRow As Long
' 获取最后一行
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
' 从下往上检查
For i = lastRow To 1 Step -1
If WorksheetFunction.CountA(ws.Rows(i)) = 0 Then
ws.Rows(i).Delete
End If
Next i
End Function
Function BrowseForFolder(title As String) As String
Dim folderDialog As FileDialog
Set folderDialog = Application.FileDialog(msoFileDialogFolderPicker)
With folderDialog
.Title = title
If .Show = -1 Then
BrowseForFolder = .SelectedItems(1)
Else
BrowseForFolder = ""
End If
End With
End Function
4.3 用户交互应用
创建 宏,根据用户输入执行不同操作:
Sub 用户交互菜单()
Dim choice As String
Dim validChoice As Boolean
' 显示菜单
choice = InputBox( _
"请选择操作:" & vbCrLf & _
"1 - 添加数据" & vbCrLf & _
"2 - 查询数据" & vbCrLf & _
"3 - 修改数据" & vbCrLf & _
"4 - 删除数据" & vbCrLf & _
"5 - 退出" & vbCrLf & _
"请输入1-5的数字")
' 验证输入
validChoice = False
Do While Not validChoice
If choice = "" Then
Exit Sub ' 用户取消
ElseIf Not IsNumeric(choice) Then
choice = InputBox("请输入有效的数字(1-5):")
ElseIf CInt(choice) < 1 Or CInt(choice) > 5 Then
choice = InputBox("请输入1-5之间的数字:")
Else
validChoice = True
End If
Loop
' 根据选择执行操作
Select Case CInt(choice)
Case 1
AddData
Case 2
QueryData
Case 3
ModifyData
Case 4
DeleteData
Case 5
Exit Sub
End Select
End Sub
Sub AddData()
' 添加数据的实现
MsgBox "添加数据功能"
End Sub
Sub QueryData()
' 查询数据的实现
MsgBox "查询数据功能"
End Sub
Sub ModifyData()
' 修改数据的实现
MsgBox "修改数据功能"
End Sub
Sub DeleteData()
' 删除数据的实现
MsgBox "删除数据功能"
End Sub
掌握 这些控制结构后,你可以编写出逻辑清晰、功能强大的VBA宏,提高工作效率和自动化程度。

暂无评论,快来抢沙发吧!