录制宏不够用,需要判断、循环、批量处理多个工作表或工作簿。VBA 代码写在 Excel 文件里,随 .xlsm 分发;这一页覆盖最小可用的语法和对象模型,不追求完整语言手册。
Alt+F11 打开 VBA 编辑器;Ctrl+R 显示工程资源管理器;F4 显示属性窗口;Ctrl+G 显示“立即窗口”,可以输入 ?Range("A1").Value 查看结果;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
Option Explicit 强制声明变量,放在模块最上面;Sub 是没有返回值的过程,Function 有返回值;Dim 声明变量,对象变量要用 Set 赋值;Long 是 32 位整数,行号用它,不要用 Integer(最大 32767);ThisWorkbook 指代码所在的工作簿,ActiveWorkbook 指当前激活的工作簿。| 类型 | 用途 | 示例 |
|---|---|---|
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 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 逐步看哪一行出错。不要靠猜。
Set:Dim ws As Worksheet 后直接 ws = ... 会报错,必须 Set ws = ...。Integer 溢出:行号超过 32767 时 Integer 会溢出,统一用 Long。ThisWorkbook 和 ActiveWorkbook 混用:宏运行时用户可能切换了工作簿,ActiveWorkbook 会指向别处;固定用 ThisWorkbook。Worksheets 和 Sheets 混用:Sheets 还包含图表工作表,按名称取工作表时优先 Worksheets。Date、Name、Range 等作为变量名,容易和内置对象冲突。Option Explicit:拼错变量名不会报错,会悄悄创建一个新变量;每个模块都加 Option Explicit。Worksheet_Change)。.xlsm 打开时可能被禁用,代码不运行;先确认“启用内容”。合上页面,先回答,再展开对照。
Set 赋值?Long 而不是 Integer?ThisWorkbook 和 ActiveWorkbook 有什么区别?Set 把对象引用赋给变量;直接 = 会当成值赋值。Integer 最大 32767,行号可能超过;Long 范围更大。ThisWorkbook 是代码所在的工作簿;ActiveWorkbook 是当前激活的工作簿,可能被用户切换。
小程序版
微信扫码,随时查命令