今日学习目标

  • 理解VBA中的对象概念
  • 掌握对象属性和方法的访问
  • 了解Excel对象模型层次

知识点

1. Excel对象模型

Application(应用程序)
  └─ Workbooks(工作簿集合)
      └─ Workbook
          └─ Worksheets(工作表集合)
              └─ Worksheet
                  └─ Range(单元格区域)

VBA 对象模型怎么理解?把 Excel 想象成一家公司:Application 是公司本身,Workbook 是项目文件夹,Worksheet 是表格页,Range 是页上的格子。操作格子要沿层级链逐级定位,这就是 Workbooks(...).Worksheets(...).Range(...) 长引用的由来。

2. 访问对象

  • 点号.操作符:对象.属性 或 对象.方法
  • 属性是对象的数据(如 Range.Value),方法是对象的动作(如 Worksheets.Add)
  • 集合可按名称 Worksheets("Sheet1") 或序号 Worksheets(1) 索引

3. 常用对象

  • Application:代表整个Excel应用程序
  • Workbook:代表一个工作簿
  • Worksheet:代表一个工作表
  • Range:代表单元格或区域

注意:ThisWorkbook 指代码所在的工作簿,ActiveWorkbook 指当前激活的,用户随时可能切换。正式脚本优先用 ThisWorkbook 加明确表名。

4. Range与Cells

Range("A1") 适合写死地址;Cells(行号, 列号) 接受变量,适合循环。

今日代码

vba
Sub 对象示例() ' 访问Application对象 Application.Name Application.Visible = True ' 访问Workbook对象 ThisWorkbook.Name ActiveWorkbook.Path ' 访问Worksheet对象 Worksheets("Sheet1").Name ActiveSheet.Range("A1").Value = "Hello" ' 访问Range对象 Range("A1").Value = "Hello" Cells(1, 1).Value = "Hello" End Sub

对同一对象连续设置多个属性时,可用 With ... End With:把对象提出来,内部以点号开头,下面实战场景一节即用到。

实战场景

要把所有工作表的 A1 统一改成标题格式:

vba
Sub 批量设置标题() Dim ws As Worksheet For Each ws In Worksheets With ws.Range("A1") .Value = "月度报表" .Font.Bold = True .Font.Size = 14 .Interior.Color = RGB(255, 200, 200) End With Next ws End Sub

ws 持有每张表的引用,.Range("A1") 都作用在这张表上,与激活状态无关。

练习题

  1. 打开指定工作簿
  2. 新建工作表并命名
  3. 设置A1单元格的值和格式

参考解答

1. 使用Workbooks.Open "文件路径"打开指定工作簿。 2. 使用Worksheets.Add创建新表,Sheets(1).Name = "新名称"命名。 3. Range("A1").Value = "内容"设置值,Range("A1").Font.Bold = True设置格式。

常见错误与排查

  1. Run-time error '9': Subscript out of range——表名不存在或有空格差异,用 ?Worksheets(1).Name 在立即窗口确认真实表名。
  2. Run-time error '424': Object required——对象变量赋值漏了 Set:ws = Worksheets("Sheet1") 应改为 Set ws = ...。
  3. Run-time error '1004': Application-defined or object-defined error——Range 地址非法,如 Range("A0"),动态位置改用 Cells。
  4. 数据写到了别的表——不带限定的 Range("A1") 默认指向活动表,引用链写全。

延伸练习

  1. 遍历 Workbooks 集合,用 MsgBox 列出当前打开的工作簿名称。
  2. 用双重循环 + Cells 在 A1:E5 填入"行号×列号"的乘积,对角线加粗。
  3. 改造实战场景:只处理名称以"报表"开头的表(提示:Left(ws.Name, 2))。

由在线工具箱(www.vba.net)整理制作