VBA学习笔记二:常用语句

第2部分  常用语句


2.1  基础语句

2.1.1  定义子过程

  • 语法:Sub SubName

                  End Sub

  • 组成部分:SubName是自定义的过程名称,Sub用于声明子过程的开始,End Sub则标记子过程的结束
  • 作用:在VBA中通常会将代码分解成小的、独立的功能单元,写在Sub子过程中,便于模块化管理、调用和维护
  • 写入位置:
    位置写入代码调用方式作用范围
    模块函数、子过程和其他代码可以直接调用整个工作簿
    WorkSheet通常用于响应工作表事件,例如单元格值的更改、工作表的激活工作表事件触发当前工作表
    ThisWorkbook通常用于处理工作簿级别的事件,如工作簿的打开、关闭等工作簿事件触发整个工作簿
    用户窗体UserForm通常与该用户窗体相关联用户交互触发当前用户窗体
  •  示例:工作簿打开事件;在ThisWorkbook中左边下拉选Workbook,右边下拉选Open
  • 注意事项:在后面的练习中,除特殊情况,代码一般都写在标准模块里

2.1.2  调用子过程

  • 直接调用:Call(可省略)+子过程名称
    • 适用于:标准模块中的子过程
    • 示例:
      Call MySubroutine  ' 显式调用名为 MySubroutine 的子过程
      
  • 通过对象调用:对象.子过程名称 
    • 适用于:工作表和工作簿中写入的的通用的子过程
    • 特别说明:工作表和工作簿中除了写入处理工作表或工作簿事件的代码,也可以写入通用的子过程,只是不常用;因为对于与工作表和工作簿无关的任务代码,写在其中会使代码变得难以维护和理解
    • 示例:
      ThisWorkbook.MyMacro  ' 调用名为 MyMacro 的工作簿级宏
      Sheet1.MySubroutine  ' 调用名为 MySubroutine 的 Sheet1 工作表上的子过程
      

2.1.3  赋值语句

  • 语法:赋值运算符“=” 或 Set
  • 功能:用于给变量赋值
  • 赋值方法:
  1. 数据类型:直接赋值,例如:x = 10 将整数值10赋给变量 x
  2. 对象类型:必须使用 Set 关键字,例如:Set ss = range("a1")将a1单元格赋给变量ss

判断变量是数据类型还是对象在【VBA学习笔记一 :变量】中,链接:https://blog.csdn.net/gogoel/article/details/137739474?spm=1001.2014.3001.5501


2.1.4  Debug.Print 语句

  • 语法:Debug.Print expression
    • expression:要输出的表达式,可以是文本、变量、函数的返回值等
  • 功能:把需要的调试信息输出在Immediate 窗口,方便查看和测试
    • Immediate 窗口位置:视图——立即窗口,快捷键为 Ctrl + G
    • Immediate 窗口的输出信息会保留一定数量的历史记录,如果需要清除,只能手动清空
  • 示例:
    Sub test()
    Dim num As Integer
    num = 10
    Debug.Print "The value of num is: " & num
    End Sub
    


2.2  条件语句

2.2.1  IF语句

  • 语法:If...Then...ElseIf/Else(可省略)...End If
If 条件 Then
    ' 条件为真时执行的代码
ElseIf 条件 Then
    ' 上一个条件为假且当前条件为真时执行的代码
Else
    ' 所有条件均为假时执行的代码
End If
  • 功能:用于根据条件执行不同的代码块
  • 示例:先把x分别赋值为正数、负数和零, 消息框会出现不同的提示
If x > 0 Then
    MsgBox "x 是正数"
ElseIf x = 0 Then
    MsgBox "x 是零"
Else
    MsgBox "x 是负数"
End If
  •  省略End If在VBA中,If 语句通常需要使用 End If 来标识语句块的结束。然而,有一种情况下可以省略 End If,那就是当 If 的条件和 Then对应的执行语句合并在同一行
If x > 0 Then MsgBox "x 是正数"

2.2.2  IF语句和函数配合使用

1)AND 函数:

  • 语法:If...AND...Then...End If
  • 功能:用于判断多个条件是否同时成立,只有当所有条件都为真时,才返回真(True)

2)OR 函数:

  • 语法:If...OR...Then...End If
  • 功能:用于判断多个条件中是否至少有一个条件成立,只要有一个条件为真,就返回True

3)NOT 函数:

  • 语法:If Not...Then...End If
  • 功能:用于对单个条件取反,当条件不成立时,就返回True

示例:

Sub CheckConditions()
    Dim x As Integer
    x = 10

    ' 如果 x 大于 5 并且小于 15,则显示消息框 "条件成立"
    If x > 5 And x < 15 Then
        MsgBox "条件成立"
    End If

    ' 如果 x 小于 5 或者大于 15,则显示消息框 "条件成立"
    If x < 5 Or x > 15 Then
        MsgBox "条件成立"
    End If

    ' 如果 x 不等于 5,则显示消息框 "条件成立"
    If Not x = 5 Then
        MsgBox "条件成立"
    End If
End Sub

2.2.3  Select Case 语句

  • 语法:Select Case...Case...Case Else(可省略)...End Select
    Select Case expression
        Case value1
            ' 当 expression 等于 value1 时执行的代码块
        Case value2
            ' 当 expression 等于 value2 时执行的代码块
        Case Else
            ' 当 expression 不等于任何已经列出的 value 时执行的代码块
    End Select
    
  • 组成部分:

        1)expression:必填,是一个表达式  ,通常是变量或者函数的返回值

        2)Case子句:

语法说明
Case value1, value2, ...匹配一个或者多个表达式/值
Case value To value2

匹配范围内的值(包括两端值),如果value为字符串,

取值范围为按字母顺序排列的 value 到 value2 的范围

Case 表达式

指定表达式的范围,可以与比较运算符或者like一起使用

例如:Is > MaxNumber为匹配大于最大值的数值

           like "*apple*"为匹配包含apple的字符串

注:* 是通配符,表示任意数量的任意字符

  • 功能:根据不同条件执行不同代码块
  • 优点:比if语句更清晰地看到条件的取值范围 
  • 示例:
    Sub TestStringAndNumber(value As Variant)
        Select Case value
            Case "apple", "banana"
                MsgBox "水果名称为 apple 或 banana"
            Case "N" To "S"
                MsgBox "字符串的首字母在N-S的范围内"
            Case Is > 10
                MsgBox "数值大于 10"
            Case 6 To 8, 15
                MsgBox "数值在 6 到 8 之间,或者为 15"
            Case Else
                MsgBox "其他情况"
        End Select
    End Sub
    
    Sub Demo()
        TestStringAndNumber "apple" ' 执行 Case "apple", "banana"
        TestStringAndNumber "OK" ' 执行 Case "N" To "S"
        TestStringAndNumber 5 ' 执行 Case Else
        TestStringAndNumber 12 ' 执行 Case Is > 10
        TestStringAndNumber 7 ' 执行 Case 6 To 8, 15
    End Sub


2.3  循环语句

2.3.1  For...Next 语句

  • 语法:For counter = start To end [Step stepvalue]

                   Next counter

  • 组成部分:
    参数说明
    counter计数器变量,用于迭代循环次数
    start循环开始的值
    end循环结束的值
    stepvalue可选参数,指定计数器变量每次增加的步长,可正可负,默认为 1
  • 功能:按照指定的步长从起始值开始递增或递减执行循环,直到达到结束值
  • 示例:让 i 从4循环到36,每次循环增加4
    For i = 4 To 36 Step 4
        MsgBox i
    Next i

    注:Next i 中的i可以不写,但是循环嵌套的时候,写上可以清楚的看到这个next是第几层循环


2.3.2  For Each...Next 语句

  • 语法:For Each element In group

                     Next element

  • 组成部分:
    参数说明
    element循环变量,指集合中的每个元素
    group对象集合或者数组
  • 变量声明element
  1. 在使用 For Each 循环遍历数组时,循环变量element通常声明为 Variant 类型,因为数组中的元素可以是任何类型的数据
  2. 在遍历对象集合时,循环变量element通常声明为集合中对象的具体类型或者 Object 类型
  • 功能:用于遍历集合对象中的每个元素
  • 示例:
    Dim num As Variant, arr() As Variant
    arr = Array(1, 2, 3, 4, 5)
    For Each num In arr
        MsgBox num
    Next num


2.3.3  Do...Loop  语句

  • 语法和功能:
    表达式说明
    Do Loop无限循环,中间需插Exit Do,不然会死机
    Do While…Loop满足条件进入循环
    Do Until…Loop直到满足某个条件才退出循环
    注:While或Until也可以放在Loop的后面
  • 组成部分:
    1. While或Until后面加 condition,condition为循环的终止条件
    2. Exit Do:可选参数,用于提前退出循环

示例:

Sub TestDoLoops()
    Dim i As Integer
    i = 1
    
    ' Do While...Loop 循环
    Do While i <= 5
        MsgBox "Do While: " & i
        i = i + 1
    Loop
    
    i = 1 ' 重置计数器
    
    ' Do Until...Loop 循环
    Do Until i > 5
        MsgBox "Do Until: " & i
        i = i + 1
    Loop
    
    i = 1 ' 重置计数器
    
    ' Do...Loop While 循环
    Do
        MsgBox "Do...Loop While: " & i
        i = i + 1
    Loop While i <= 5
End Sub


2.4  流程控制语句

2.4.1  GoTo 语句

  • 语法:GoTo label

                  label:

  • 组成部分:label是自定义的标签,当指定条件发生时,会跳过中间部分直接运行到标签代码
  • 功能:跳转,可以使程序在不同的条件下执行不同的代码块,或者在特定情况下跳出循环
  • 注意事项:建议尽量避免过多使用GoTo语句,过度使用可能会导致代码难以理解和维护
  • 示例:
    Sub Example()
        Dim x As Integer
    
        x = InputBox("Enter a number:")
        
        If x > 10 Then
            GoTo GreaterThanTen
        ElseIf x < 10 Then
            GoTo LessThanTen
        Else
            GoTo EqualToTen
        End If
    
    GreaterThanTen:
        MsgBox "The number is greater than 10"
        Exit Sub
    
    LessThanTen:
        MsgBox "The number is less than 10"
        Exit Sub
    
    EqualToTen:
        MsgBox "The number is equal to 10"
        Exit Sub
    End Sub
    

2.4.2  Exit 语句

  • 语法和功能:
    语法功能
    Exit For提前退出For循环
    Exit Do提前退出Do循环
    Exit Sub提前退出子过程
    • 使用说明:
      • Exit 语句通常跟在If 语句后面,在满足某个条件的情况下退出循环或者子过程
      • 在使用Exit 时尽量让代码运行到想要的次数刚好退出,不要运行多余的部分

    示例:当循环到达 5 时,用Exit For 提前退出循环

    Sub ExampleExitFor()
        Dim i As Integer
        For i = 1 To 10
            If i = 5 Then
                MsgBox "Reached 5, exiting the loop."
                Exit For ' 提前退出循环
            End If
            ' 在此处执行其他操作
        Next i
    End Sub
    


2.5  错误处理语句

2.5.1  On Error 语句

  • 语法和功能:
表达式说明
On Error Resume Next忽略错误并继续执行代码
On Error GoTo 0用于错误处理完成后立即停止执行代码,恢复默认模式
On Error GoTo label发生错误时跳转到指定的标签处执行代码

2.5.2  Err 对象及其方法、属性

  • 说明:用于访问代码运行错误时的报错信息,默认属性是Number
  • 方法:
    1. Err.Clear:清除 Err 对象中的错误信息,使其恢复到无错误状态,以便程序可以继续执行后续的代码而不受之前错误的影响
    2. Err.Raise:手动引发一个错误,可以指定错误代码、错误描述和错误类型,使用方法:Err.Raise vbObjectError + 错误代码
  • 属性:
    属性说明
    Err.Number错误代码,运行无误为0,用于识别不同的错误类型
    Err.Description错误描述,提供关于错误的详细信息
    Err.Source错误源,指示引发错误的对象
    Err.HelpFile提供关于错误的帮助信息,需要指定正确的帮助文件路径
    Err.HelpContext设置为帮助文件中与错误相关的上下文
  • 示例:我们使用 InputBox 要求用户输入一个负数。如果用户输入的是非负数,则手动引发一个错误,错误代码为 vbObjectError + 1000,错误描述为 "输入的不是负数"。然后程序会进入错误处理部分,在其中显示错误信息,并清除错误信息以便程序继续执行
Sub TestErrRaise()
    On Error GoTo ErrorHandler
    
    ' 模拟发生错误
    Dim userInput As Integer
    userInput = InputBox("请输入一个负数:")
    
    If userInput >= 0 Then
        ' 如果用户输入的不是负数,则手动引发错误
        Err.Raise vbObjectError + 1000, , "输入的不是负数"
    Else
        MsgBox "输入的是负数:" & userInput
    End If
    
    Exit Sub
    
ErrorHandler:
    MsgBox "发生错误:" & Err.Number & vbCrLf & "错误描述:" & Err.Description
    Err.Clear
End Sub


2.6  With语句

  • 语法:With object

                           .+对 object 的操作1

                           .+对 object 的操作2

        ·                   ...

                           .+对 object 的操作n

                   End With

  • 组成部分:object 是在VBA中要操作的对象,用with先指定要操作的对象,再通过点(也就是“.”)+具体的运行代码 对object进行操作
  • 功能:简化对同一个对象的多个属性或方法的操作,避免重复输入
  • 示例:通过 With 语句连续操作Sheet1的工作表名称和单元格的值
    Sub TestWithStatement()
        Dim ws As Worksheet
        Set ws = ThisWorkbook.Worksheets("Sheet1")
        
        ' 使用 With 语句设置工作表的属性和操作其范围
        With ws
            .Name = "NewName" ' Sheet1工作表重命名
            .Cells(1, 1).Value = "Hello" ' 改变Sheet1单元格A1的值
            .Cells(1, 2).Value = "World" ' 改变Sheet1单元格B1的值
            ' 更多对工作表的操作
        End With
    End Sub
    

  • 41
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是的,这是VBA学习笔记的第一篇文章,涵盖两个主题:自动添加代码和VBA修改注册表。下面是更详细的介绍: ## 自动添加代码 在VBA中,我们可以使用代码自动添加代码。这通常用于在编写宏时自动添加模板代码或辅助代码。下面是一个简单的示例,演示如何使用VBA自动添加代码: ```vb Sub AddCode() '获取当前文档中的VBProject对象 Dim vbProj As VBIDE.VBProject Set vbProj = ActiveWorkbook.VBProject '获取当前文档中的Sheet1模块 Dim sheetMod As VBIDE.CodeModule Set sheetMod = vbProj.VBComponents("Sheet1").CodeModule '添加VBA代码 sheetMod.InsertLines 1, "Sub HelloWorld()" & vbCrLf & _ " MsgBox ""Hello, World!""" & vbCrLf & _ "End Sub" End Sub ``` 上述代码将在当前文档的Sheet1模块中添加一个名为"HelloWorld"的子例程,并在调用该例程时显示一个消息框。 ## VBA修改注册表 VBA可以使用Windows API函数来修改Windows注册表。这对于配置或自定义Windows系统非常有用。下面是一个简单的示例,演示如何使用VBA修改注册表中的一个键值: ```vb Option Explicit Private Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" ( _ ByVal hKey As Long, _ ByVal lpSubKey As String, _ ByVal ulOptions As Long, _ ByVal samDesired As Long, _ ByRef phkResult As Long) As Long Private Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" ( _ ByVal hKey As Long, _ ByVal lpValueName As String, _ ByVal Reserved As Long, _ ByVal dwType As Long, _ ByVal lpData As Any, _ ByVal cbData As Long) As Long Private Declare Function RegCloseKey Lib "advapi32.dll" ( _ ByVal hKey As Long) As Long Private Const HKEY_CURRENT_USER = &H80000001 Private Const KEY_SET_VALUE = &H2 Private Const REG_SZ = 1 Sub ModifyRegistryKey() Dim hKey As Long Dim result As Long '打开注册表键 result = RegOpenKeyEx(HKEY_CURRENT_USER, "Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced", 0, KEY_SET_VALUE, hKey) If result = 0 Then '设置键值的值 result = RegSetValueEx(hKey, "Hidden", 0, REG_SZ, "2", 2) '关闭注册表键 result = RegCloseKey(hKey) End If End Sub ``` 上述代码演示了如何将 "Hidden" 键的值设置为 "2",这将隐藏文件资源管理器中的隐藏文件和文件夹。请注意,修改注册表可能会导致系统不稳定,因此在进行任何修改之前,请备份您的注册表。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值