文章目录

VBA 控制结构:If-Else、For、Do-While

发布于 2026-04-10 10:26:23 · 浏览 7 次 · 评论 0 条

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宏,提高工作效率和自动化程度。

评论 (0)

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

扫一扫,手机查看

扫描上方二维码,在手机上查看本文