VBA 入门:编辑器、模块、变量、Sub/Function 与调试

适用场景

录制宏不够用,需要判断、循环、批量处理多个工作表或工作簿。VBA 代码写在 Excel 文件里,随 .xlsm 分发;这一页覆盖最小可用的语法和对象模型,不追求完整语言手册。

打开编辑器

最小示例

Option Explicit

Sub Hello()
    Dim ws As Worksheet
    Dim lastRow As Long

    Set ws = ThisWorkbook.Worksheets("Sheet1")
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
    ws.Range("B1").Value = "A 列最后一行:" & lastRow
End Sub

变量与数据类型

类型 用途 示例
Byte 0–255 小整数
Integer -32768–32767 小范围计数,行号不要用
Long 约 ±21 亿 行号、循环计数
Single / Double 浮点数 金额用 Currency 更稳
Currency 货币 金额计算
String 文本 Dim name As String
Boolean True/False Dim ok As Boolean
Date 日期时间 Dim d As Date
Variant 任意类型 不声明时的默认类型,灵活但慢
Object 任意对象 具体对象优先用 Worksheet、Range
Dim count As Long
Dim rate As Double
Dim name As String
Dim ws As Worksheet

count = 10
rate = 0.05
name = "张三"
Set ws = ThisWorkbook.Worksheets("Sheet1")

Const 定义常量:

Const SHEET_NAME As String = "报表"
Const TAX_RATE As Double = 0.13

Sub 与 Function

Sub WriteTitle()
    ThisWorkbook.Worksheets("报表").Range("A1").Value = "月度报表"
End Sub

Function AddTax(amount As Double) As Double
    AddTax = amount * 1.13
End Function

Function 通过给函数名赋值返回结果。调用:

Sub Demo()
    MsgBox AddTax(100)
End Sub

参数默认按引用传递(ByRef),需要按值传递时写 ByVal:

Function AddTax(ByVal amount As Double) As Double
    AddTax = amount * 1.13
End Function

对象模型

Excel VBA 的核心对象层级:

Application
  └─ Workbook
       └─ Worksheet
            └─ Range

常用写法:

Application.ScreenUpdating = False
ThisWorkbook.Worksheets("Sheet1").Range("A1").Value = 100
ActiveSheet.Range("A1").Interior.Color = RGB(255, 0, 0)

With 可以减少重复引用:

With ThisWorkbook.Worksheets("Sheet1").Range("A1:D10")
    .Font.Bold = True
    .Interior.Color = RGB(220, 230, 241)
    .Borders.LineStyle = xlContinuous
End With

调试

操作 作用
F5 运行整个过程
F8 单步执行
F9 设置/取消断点
Ctrl+Break 中断运行
Debug.Print 输出到立即窗口
MsgBox 弹窗显示值
Stop 暂停执行(调试用,发布前删除)

排查时先在关键位置 Debug.Print 变量值,或按 F8 逐步看哪一行出错。不要靠猜。

易错点

相关条目

参考链接

读完自测

合上页面,先回答,再展开对照。

  1. 对象变量为什么必须用 Set 赋值?
  2. 行号变量为什么推荐用 Long 而不是 Integer?
  3. ThisWorkbook 和 ActiveWorkbook 有什么区别?
答案
  1. 对象变量保存的是引用,VBA 用 Set 把对象引用赋给变量;直接 = 会当成值赋值。
  2. Integer 最大 32767,行号可能超过;Long 范围更大。
  3. ThisWorkbook 是代码所在的工作簿;ActiveWorkbook 是当前激活的工作簿,可能被用户切换。
微信小程序码:扫码打开命令速查小程序

小程序版

微信扫码,随时查命令