)
VBA 常用对象Range、Cells、Worksheet、Workbook适用Excel 2016 / 2019 / 2021 / Microsoft 365VBA 通用痛点语法会了一碰单元格就懵录过宏、也搞懂了变量/循环/条件的人写操作单元格时却常卡住Range和Cells到底有啥区别Worksheet、Workbook怎么引用对象层级搞不清代码就到处报对象不支持该属性或方法。VBA 操作 Excel 的本质就是操作对象。最常用就四个Workbook工作簿、Worksheet工作表、Range一块区域、Cells一个单元格。把它们的关系理顺你就拿到了操作 Excel 的总开关。一、对象层级谁管着谁四个对象是层层包含的从大到小是层级对象代表什么最大Workbook一个 Excel 文件工作簿↓Worksheet工作簿里的一张表Sheet↓Range/Cells表里的一块区域 / 一个单元格口诀工作簿包工作表工作表包单元格。想操作某个单元格先想清楚它在哪个工作簿的哪张表。二、Range按地址操作一块区域Range用 Excel 的地址字符串来定位适合我知道具体位置的场景Range(A1).Value 100 给 A1 写值 Dim v: v Range(A1).Value 读 A1 的值 Range(A1:B10).Font.Bold True 整块区域设加粗 Range(A:A).EntireColumn.AutoFit 整列宽度自适应 Range(A1:A3,C1:C3).Select 不连续区域逗号分隔 也可以是别处的表 Worksheets(汇总).Range(A1).Value 标题要点Range不写工作表时默认指向当前激活表跨表操作要带上表名见第四节。三、Cells按行列号定位单元格Cells(行, 列)用数字行列号定位Cells(1,1)就是 A1、Cells(2,3)是 C2。它是循环的好搭档Cells(1, 1).Value 姓名 第1行第1列 A1 Cells(2, 3).Value 90 第2行第3列 C2 循环里逐个填第1列写 1~10 Dim r As Long For r 1 To 10 Cells(r, 1).Value r Next rRange 还是 Cells一句话按具体地址整块处理用Range要用数字在循环里逐格定位用Cells。两者还能组合Range(A r)或Cells(r,1)推荐后者拼字符串更直观也更快。四、Worksheet操作工作表引用一张表有三种常见方式Dim ws As Worksheet Set ws ThisWorkbook.Worksheets(Sheet1) ① 按名称最稳 Set ws ThisWorkbook.Sheets(1) ② 按下标第1张表 Set ws ActiveSheet ③ 当前激活的表 ws.Range(A1).Value 标题 在指定表上操作 ws.Name 汇总 改名 ws.Activate 激活该表 新增 / 复制 / 删除 Worksheets.Add After:Worksheets(Worksheets.Count) 末尾新增一张表 ws.Copy After:Worksheets(Worksheets.Count) 复制表到末尾 Application.DisplayAlerts False 删表会弹确认框先关掉 ws.Delete Application.DisplayAlerts True 记得恢复注意给对象赋值必须用Set给普通数字/文本赋值不用。漏写Set是新手第二大坑。五、Workbook操作工作簿工作簿层面最常用打开 / 保存 / 关闭 / 引用Dim wb As Workbook Set wb ThisWorkbook 代码所在的工作簿 Set wb ActiveWorkbook 当前激活的工作簿 Set wb Workbooks(数据.xlsx) 已打开的按文件名引用 Set wb Workbooks.Open(C:\数据.xlsx) 打开指定路径的文件 wb.Worksheets(Sheet1).Range(A1).Value 1 链式操作 wb.Save 保存 wb.SaveAs C:\新文件.xlsx 另存为 wb.Close 关闭 Workbooks.Add 新建一个空工作簿ThisWorkbookvsActiveWorkbook代码写在哪个文件就用ThisWorkbook指我自己用户手动点开的那个用ActiveWorkbook。跨文件取数时别混。综合跨工作表汇总把Sheet1~Sheet3的 B 列分数各求平均写进汇总表的 A、B 列表名 平均分。一次性用上四个对象Option Explicit Sub CollectSummary() Dim ws As Worksheet, sumWs As Worksheet Dim i As Long, r As Long, last As Long Dim total As Double, cnt As Long, c As Range Set sumWs ThisWorkbook.Worksheets(汇总) r 2 For i 1 To 3 Set ws ThisWorkbook.Worksheets(Sheet i) Worksheet 对象 last ws.Cells(ws.Rows.Count, 2).End(xlUp).Row 动态末行 total 0: cnt 0 For Each c In ws.Range(B2:B last) Range 对象 循环 total total c.Value cnt cnt 1 Next c sumWs.Cells(r, 1).Value ws.Name Cells 对象写表名 sumWs.Cells(r, 2).Value total / cnt 写平均分 r r 1 Next i End Sub这个例子就是四对象的标准组合拳ThisWorkbook取文件 →Worksheets取表 →Cells/Range读写单元格 →For Each批量扫。套这个骨架换表名/列号就能做各种汇总。速查表对象代表最常用的引用Workbook工作簿文件ThisWorkbook、Workbooks(名.xlsx)、Workbooks.Open(路径)Worksheet工作表SheetWorksheets(名)、Sheets(下标)、ActiveSheetRange一块区域Range(A1)、Range(A1:B10)Cells一个单元格Cells(行, 列)常见坑现象原因解决对象赋值报类型不匹配漏写Set给对象赋值加Set ws ...报下标越界表名拼错 / 不存在用Worksheets(实际表名)别漏引号删表弹确认框默认有警告删前DisplayAlertsFalse删后改回True取到别的文件的数据混用ThisWorkbook/ActiveWorkbook指代码所在文件用ThisWorkbook操作到错误的工作表没指定表默认当前表跨表时显式写ws.Range(...)循环里拼地址慢/出错大量用Range(Ar)改用Cells(r, 1)更稳定高效小结VBA 碰 Excel就是和四个对象打交道Workbook文件→Worksheet表→Range/Cells单元格。记住三件事——对象赋值要写Set整块/已知地址用Range、循环逐格用Cells跨表跨文件一定写清在哪个 Workbook 的哪个 Worksheet。理清楚层级报错率能降一大半。下一篇VBA批量重命名文件一键搞定100个文件名。