首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Excel VBA宏的使用

Excel VBA宏的使用

原创
作者头像
爱上电路设计
发布2025-08-10 08:21:59
发布2025-08-10 08:21:59
7180
举报

一、什么是VBA

VBA(Visual Basic for Applications)是一种面向对象的语言,也就是说,在 VBA 的世界里,几乎所有可以被操作的东西,都是“对象”。你可以把“对象”理解为 Excel 中具体的实体,比如:

  • 一个工作簿(Workbook)
  • 一张工作表(Worksheet)
  • 某个单元格区域(Range)
  • 图表、按钮、形状等控件

每个对象都有自己的属性(它的状态)和方法(它能做的动作)。理解对象、掌握它的属性和方法,就是写好 VBA 宏的第一步。

二、VBA编辑器

文件→选项,即可打开“Excel选项”对话框。

自定义功能区→勾选「开发工具」,如下图所示。

在工具栏「开发工具」「Visual Basic」→双击 6处的“ThisWorkbook”,即可弹出编程区域。

Alt+F11 可快速打开 VBA编辑器,可见其就是一个类 VB 的编程环境,学过 VB语言的很好上手。

三、属性与方法

属性 = 对象的状态,方法 = 对象的动作

1、属性Property:对象的状态

属性用于描述对象的状态或特征,可以看作是对象的“形容词”。比如,字体是否加粗、背景色是什么、单元格的值是多少,都是属性。

代码语言:javascript
复制
Range("A1").Font.Bold = True  '设置字体加粗
Range("A1").Interior.Color = vbYellow  '设置背景色为黄色

属性通常可以被读取(看一下状态),也可以被设置(改变状态),只要它是可读写的。

当你要连续修改同一个对象的多个属性时,建议使用 With 语句,写法更简洁,逻辑也更清晰:

代码语言:javascript
复制
With Range("A1")
    .Font.Bold = True
    .Font.Color = RGB(255, 0, 0)
End With

2、方法Method:对象能做的事

方法代表对象可以执行的操作,类似于对象的“动词”。比如“选择”、“复制”、“保存”这些行为,都是方法。

代码语言:javascript
复制
Range("A1").Select   '选中A1单元格
Range("A1").Copy     '复制A1单元格
ActiveWorkbook.Save  '保存当前工作簿

大多数方法支持传入参数,用来控制行为的细节。这些参数有的必须提供,有的则是可选的。有些方法还支持命名参数语法,让代码更清晰:

代码语言:javascript
复制
Range("A1:A10").Sort _
    Key1:=Range("A1"), _
    Order1:=xlAscending, _
    Header:=xlYes

这个例子就是使用 Sort 方法对 A1:A10 区域进行升序排序,并指定首行为标题。

3、属性与方法的区分

下面这张对比表可以帮你理清两者的区别:

比较项

属性/Property

方法/Method

本质

描述对象的状态或特征

执行对象的动作或操作

使用格式

对象.属性名

对象.方法名(参数)

是否有返回值

通常有

不一定全有

是否会改变对象状态

一般不会直接改变

通常会改变

代码语言:javascript
复制
'获取当前工作表名称(属性)
MsgBox ActiveSheet.Name
 
'删除名为 Sheet2 的工作表(方法)
ThisWorkbook.Sheets("Sheet2").Delete

4、查找对象的属性与方法

1)代码自动提示

在 VBA 编辑器中,输入对象名称后加上 .(点号),就会自动弹出该对象所有可用的属性和方法。你会看到:

  • 灰色小手图标代表属性
  • 绿色小闪电图标代表方法

在编辑环境中,按下键盘上的 F1,即可跳转到该对象的详细帮助文档。

文档中通常包含:

  • 对象的层级结构(所属对象是谁)
  • 所有可用属性和方法
  • 每个属性/方法的用法、参数说明、代码示例

搜索相应的对象,比如Range,如下图所示。

5、常用对象的表示方法

1)工作簿

Workbooks 代表工作集合,所有的工作簿;Workbooks(n),表示已打开的第n个工作簿

Workbooks(“工作簿名称”)

ActiveWorkbook 正在操作的工作簿

ThisWorlBook 代码所在的工作薄

2)工作表

Sheets(“工作表名称”)

Sheet1 表示第一个插入的工作表,Sheet2 表示第二个插入的工作表

Sheets(n) 表示按排列顺序,第n个工作表

Activesheet 表示活动工作表,光标所在工作表

Worksheet 也表示工作表,但不包括图表工作表、宏工作表等。

3)单元格

Cells 所有单元格

Range(“单元格地址”),比如Range(“A1,C8,D0:D10”)

Cells(行数,列数)

ActiveCell 正在选中或编辑的单元格

Selection 正被选中或选取的单元格或单元格区域

四、什么是变量

1、什么是变量

所谓变量,就是可变的量。就好象在内存中临时存放的一个小盒子,这个小盒子放的什么物体不固定。

代码语言:javascript
复制
'1 放数字与文本
Sub test2()
    Dim st As String
    Dim X As Integer
 
    For X = 1 To 10
      st = st & "爱上电路设计"
    Next X
 
End Sub
    
'2 放对象
Sub test3()
 
    Dim rg As Range
    Set rg = Range("a1")
    rg = 100
 
End Sub
      
'3 放数组
Sub test4()
       
    Dim arr(1 To 10) As Integer, X As Integer
 
    For X = 1 To 10
        arr(X) = X
    Next X
 
End Sub

2、类型和声明

一般情况下,过程级变量在过程运行结束后就会自动从内存中释放,而只有一些从外部借用的对象变量才需要使用set 变量=nothing进行释放。

五、VBA语句

1、VBA语句概述

1)宏语句

代码语言:javascript
复制
Sub 按钮1_Click()
 
    ' 给名为 "Sheet2" 的工作表 A1 单元格赋值
    ' ThisWorkbook.Worksheets("Sheet2").Range("A1").Value = 10'
    ' 若工作表名称被修改会报“下标越界”,可采用“索引号”写法
    ThisWorkbook.Worksheets(2).Range("A1").Value = 10
    
    ' 如果要在活动工作表操作(当前显示的工作表)
    ' ActiveSheet.Range("A1").Value = 10
 
End Sub

2)函数语句

代码语言:javascript
复制
Function SheetCount()
    SheetCount = Sheets.Count
End Function

3)程序中应用语句

代码语言:javascript
复制
Sub 按钮1_Click()
    Range("A1") = 10  ' 给A1单元格赋值10
End Sub
 
Function SheetCount()
    SheetCount = Sheets.Count
End Function
 
Sub InputNumber()
    Call 按钮1_Click  ' 调用“按钮1_Click”子函数
    
    For x = 1 To 100  ' 循环语句
        Cells(x, 1) = x
    Next x
End Sub

2、判断语句

代码语言:javascript
复制
Sub 判断2() '多条件判断
 
  Select Case Range("a1").Value
  Case Is > 0
     Range("b1") = "正数"
  Case Is = 0
     Range("b1") = "0"
  Case Else
     Range("b1") = "负数"
  End Select
 
End Sub
代码语言:javascript
复制
Sub select区间判断()
 
 Select Case Range("a2").Value
 Case 0 To 1000
   Range("b2") = 0.01
 Case 1001 To 3000
   Range("b2") = 0.03
 Case Is > 3000
   Range("b2") = 0.05
 End Select
 
End Sub

3、循环语句

代码语言:javascript
复制
Sub test1()
  Range("d2") = Range("b2") * Range("c2")
  Range("d3") = Range("b3") * Range("c3")
  Range("d4") = Range("b4") * Range("c4")
  Range("d5") = Range("b5") * Range("c5")
  Range("d6") = Range("b6") * Range("c6")
End Sub
 
Sub test2()
Dim x As Integer
 For x = 10000 To 2 Step -3
  Range("d" & x) = Range("b" & x) * Range("c" & x)
 Next x
End Sub
 
 
Sub test3()
Dim rg As Range
 For Each rg In Range("d2:d18")
  rg = rg.Offset(0, -1) * rg.Offset(0, -2)
 Next rg
End Sub
 
 
Sub test4()
Dim x As Integer
 x = 1
 Do
   x = x + 1
   Cells(x, 4) = Cells(x, 2) * Cells(x, 3)
 Loop Until x = 18
End Sub
 
Sub t5()
 x = 1
 Do While x < 18
   x = x + 1
   Cells(x, 4) = Cells(x, 2) * Cells(x, 3)
 Loop
End Sub

4、分支与END语句

END语句作用:强制退出所有正在运行的程序

Exit语句作用:退出指定的语句

示例代码:

代码语言:javascript
复制
Option Explicit
 
'1、Exit Sub
Sub exitsub()
 
   Dim x As Integer
   For x = 1 To 100
      Cells(1, 1) = x
      If x = 5 Then
         Exit Sub
      End If
   Next x
   Range("b1") = 100
 
End Sub
 
'2、Exit function
Function exitfun()
 
   Dim x As Integer
   For x = 1 To 100
      If x = 5 Then
         Exit Function
      End If
   Next x
   ff = 100
 
End Function
 
'3、Exit for
Sub exitfor()
 
   Dim x As Integer
   For x = 1 To 100
      Cells(1, 1) = x
      If x = 5 Then
         Exit For
      End If
   Next x
   Range("b1") = 100
 
End Sub
 
'4、Exit do
Sub exitdo()
    Dim x As Integer
    Do
        x = x + 1
        Cells(1, 1) = x
        If x = 5 Then
            Exit Do
        End If
     Loop Until x = 100
     Range("b1") = 100
 
End Sub

goto语句作用:跳转到指定的地方

示例代码:

代码语言:javascript
复制
Option Explicit
 
'Goto语句,跳转到指定的地方
Sub t1()
 
    Dim x As Integer
    Dim sr
    100:
        sr = Application.InputBox("请输入数字", "输入提示")
    If Len(sr) = 0 Or Len(sr) = 5 Then GoTo 100
 
End Sub
 
'gosub..return ,跳过去,再跳回来
Sub t2()
    Dim x As Integer
    For x = 1 To 10
        If Cells(x, 1) Mod 2 = 0 Then GoSub 100
    Next x
Exit Sub
100:
    Cells(x, 1) = "偶数"
    Return          '跳到gosub 100 这一句
End Sub
 
'on error resume next '遇到错误,跳过继续执行下一句
Sub t3()
    On Error Resume Next
    Dim x As Integer
    For x = 1 To 10
        Cells(x, 3) = Cells(x, 2) * Cells(x, 1)
    Next x
End Sub
 
'on error goto  '出错时跳到指定的行数
Sub t4()
    On Error GoTo 100
    Dim x As Integer
    For x = 1 To 10
        Cells(x, 3) = Cells(x, 2) * Cells(x, 1)
    Next x
Exit Sub
100:
    MsgBox "在第" & x & "行出错了"
End Sub
 
'on error goto 0 '取消错误跳转
Sub t5()
    On Error Resume Next
    Dim x As Integer
    For x = 1 To 10
        If x > 5 Then On Error GoTo 0
        Cells(x, 3) = Cells(x, 2) * Cells(x, 1)
    Next x
    Exit Sub
 
End Sub

十、示例代码

1、隐藏/显示单元格

本示例用来实现点击按钮隐藏/显示特定单元格区域,如下面的 gif动图所示。

示例文件移步:ExcelVBA宏的使用示例资源-CSDN下载

1)创建按钮

打开Excel → 顶部菜单栏选择 「开发工具」 选项卡,点击「插入」→ 在「表单控件」中选择「按钮」,在工作表空白处拖动鼠标绘制按钮。

松开鼠标自动弹出「指定宏」窗口,如下图所示。

2)编写VBA宏

「指定宏」 窗口点击 「新建」

​打开 VBA编辑器,如下图所示。

​完整代码:

代码语言:javascript
复制
Sub 按钮1_Click()
 
    On Error Resume Next  '开始错误处理
    
    Dim btnName As String
    btnName = Application.Caller  '获取触发宏的按钮名称
    
    Dim btn As Button
    Set btn = ActiveSheet.Buttons(btnName)
    
    '改变按钮上的文字
    If btn.Text = "隐藏" Then
        btn.Text = "显示"
    Else
        btn.Text = "隐藏"
    End If
    
    If Rows("3").Hidden Or Rows("6").Hidden Or Rows("8").Hidden Then
        Rows("3").Hidden = False '显示行
        Rows("6").Hidden = False '显示行
        Rows("8").Hidden = False '显示行
    Else
        Rows("3").Hidden = True  '隐藏行
        Rows("6").Hidden = True  '隐藏行
        Rows("8").Hidden = True  '隐藏行
    End If
 
End Sub

连续多行显隐与背景颜色的处理代码:

代码语言:javascript
复制
Sub 按钮1_Click()
 
    On Error Resume Next  '开始错误处理
    
    Dim btnName As String
    btnName = Application.Caller  '获取触发宏的按钮名称
    
    Dim btn As Button
    Set btn = ActiveSheet.Buttons(btnName)
    
    '改变按钮上的文字
    If btn.Caption = "隐藏" Then
        btn.Caption = "显示"
    Else
        btn.Caption = "隐藏"
    End If
    
    If Rows("7:11").Hidden Or Rows("17:21").Hidden Or Rows("27:32").Hidden Or Rows("36:40").Hidden _
    Or Rows("44:48").Hidden Or Rows("52:56").Hidden Or Rows("60:64").Hidden Then
        Rows("7:11").Hidden = False '显示行
        Rows("17:21").Hidden = False '显示行
        Rows("27:32").Hidden = False '显示行
        Rows("36:40").Hidden = False '显示行
        Rows("44:48").Hidden = False '显示行
        Rows("52:56").Hidden = False '显示行
        Rows("60:64").Hidden = False '显示行
        
        Range("A12:L16").Interior.Color = vbYellow
        Range("A33:L43").Interior.Color = vbYellow
        Range("A57:L59").Interior.Color = vbYellow
    Else
        Rows("7:11").Hidden = True  '隐藏行
        Rows("17:21").Hidden = True  '隐藏行
        Rows("27:32").Hidden = True  '隐藏行
        Rows("36:40").Hidden = True '显示行
        Rows("44:48").Hidden = True '显示行
        Rows("52:56").Hidden = True '显示行
        Rows("60:64").Hidden = True '显示行
        
        Range("A12:L16").Interior.Color = vbRed
        Range("A33:L43").Interior.Color = vbRed
        Range("A57:L59").Interior.Color = vbRed
    End If
 
End Sub

3)注意事项

(1)保存文件:需保存为 .xlsm 格式(启用宏的工作簿)

(2)安全设置:首次运行宏时需在 文件→选项→信任中心→启用所有宏

(3)修改按钮:右键按钮可调整大小/文字/位置

右键 → 「指定宏」 可更换宏

2、实现智能数据验证

本示例用以确保A列只接受数字输入(包括整数、小数、负数和科学计数法),并在输入非数字内容时给出提示并清空单元格。

1)使用说明

  • 按 Alt+F11 打开VBA编辑器
  • 在左侧项目窗口中双击对应的工作表(如 Sheet1)
  • 将上述代码粘贴到代码窗口中

2)完整代码

代码语言:javascript
复制
Private Sub Worksheet_Change(ByVal Target As Range)
 
    On Error GoTo CleanExit  ' 错误处理
    
    ' 只处理A列的更改
    Dim changedCells As Range
    Set changedCells = Intersect(Target, Me.Columns("A"))
    If changedCells Is Nothing Then Exit Sub
    
    Application.EnableEvents = False  ' 禁用事件防止循环触发
    Application.ScreenUpdating = False  ' 禁用屏幕更新
    
    Dim cell As Range
    For Each cell In changedCells
        ' 跳过空单元格
        If Not IsEmpty(cell) And cell.Value <> "" Then
            ' 检查是否为有效数字
            If Not IsNumeric(cell.Value) Then
                ' 非数字处理
                MsgBox "A列只接受数字输入!" & vbCrLf & _
                       "单元格 " & cell.Address & " 输入了无效内容: " & cell.Value, _
                       vbExclamation, "输入错误"
                cell.ClearContents
            ' 检查文本型数字(如'123)
            ElseIf VarType(cell.Value) = vbString Then
                MsgBox "请勿输入文本格式的数字!" & vbCrLf & _
                       "单元格 " & cell.Address & " 的内容将被转换为数字", _
                       vbInformation, "格式修正"
                cell.Value = Val(cell.Value)  ' 转换为数值
            End If
        End If
    Next cell
 
CleanExit:
    Application.EnableEvents = True  ' 确保事件重新启用
    Application.ScreenUpdating = True
 
End Sub

附录

1、学习资源

VBA常用技巧资源:非常详实的VBA常用技巧,本内容来自于:ExcelHome

2、问题总结

1)Microsoft已阻止宏运行

右键 → 「属性」「解除锁定」即可


路,还得一个人走,任谁也帮不了谁。远方再远,慢慢走,总会到…… 觉得不错,动动发财的小手点个赞哦!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、什么是VBA
  • 二、VBA编辑器
  • 三、属性与方法
    • 1、属性Property:对象的状态
    • 2、方法Method:对象能做的事
    • 3、属性与方法的区分
    • 4、查找对象的属性与方法
    • 5、常用对象的表示方法
  • 四、什么是变量
    • 1、什么是变量
    • 2、类型和声明
  • 五、VBA语句
    • 1、VBA语句概述
    • 2、判断语句
    • 3、循环语句
    • 4、分支与END语句
  • 十、示例代码
    • 1、隐藏/显示单元格
    • 2、实现智能数据验证
  • 附录
    • 1、学习资源
    • 2、问题总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档