Excel 有两种录制宏方式:绝对引用和相对引用,它们在引用工作表中的单元格的方式上有所不同。无论当前选定的单元格如何,使用绝对引用录制的宏始终引用相同的单元格位置,而使用相对引用录制的宏引用与选定单元格偏移的单元格。
绝对引用
Excel 默认的录制宏方式是绝对引用。您可能知道,绝对引用通常用于公式中的单元格引用,当公式中的单元格引用是绝对引用时,如果把公式粘贴到新位置时它不会自动调整公式。在我们之前的录制你的第一个宏示例中,我们使用了绝对引用。
相对引用
相对引用意味着相对于当前活动的单元格。因此,无论是在录制相对引用宏时还是在运行宏时,都应谨慎选择活动单元格。
使用相对引用录制宏
在下面的示例中,我们使用相对引用来再次录制上节课的“HelloWorld”宏,看看有什么变化。
- 新建一个空白工作簿。Excel 默认选择单元格 A1。在录制之前,请确保选中单元格 A1。
- 单击【开发工具】选项卡,在【代码】组中,单击【使用相对引用】。如果你的【开发工具】选项卡不可见,请参阅:启用开发工具选项卡。
- 在【代码】组中单击【录制宏】命令,打开【录制宏】对话框。
- 在本例中,宏名:“
HelloWorld
”,快捷键填写小写j
,保存在当前工作簿,说明:“使用相对引用录制宏
”。
- 单击【确定】关闭对话框并开始录制宏动作。
- 选择单元格
B1
,在编辑栏里输入”Hello World!
",并按 Enter 键结束输入,此时 Excel 会自动激活单元格B2
。 - 选择【开发工具】选项卡,在【代码】组中选择【停止录制】命令(或单击状态栏最左边的【停止录制】按钮)。
录制完成,按 Alt+F11 组合键打开 VBE,双击左侧工程项目窗口的【模块1】,模块中的代码就会在右侧的代码窗口中显示出来。录制的宏代码类似如下代码:
Sub HelloWorld()
'
' HelloWorld 宏
' 使用相对引用录制宏
'
' 快捷键: Ctrl+j
'
ActiveCell.Offset(0, 1).Range("A1").Select
ActiveCell.FormulaR1C1 = "Hello World!"
ActiveCell.Offset(1, 0).Range("A1").Select
End Sub
第 1 行:录制的宏是一个名为 HelloWorld
的子过程。
第 2 行到第 7 行是注释。请注意,Excel 在过程的顶部插入了一些注释。这些注释是出现在【录制宏】对话框中的一些信息。这些注释行以撇号('
)开头并不是真正需要的,删除它们对宏的运行没有任何影响。
第 8 行:此语句以当前活动单元格(ActiveCell
)为基准向右移动一个单元格(Offset(0, 1)
),我们录制时的活动单元格是 A1,我们选择的单元格是 B1,B1 单元格相对于 A1 单元格就是向右移动了一格,此语句还记录了起始单元格为 A1。活动单元格的 Offset 属性告诉指针向上、向下、向左或向右移动多少个单元格。
第 9 行:此语句将您在录制时键入的文本插入到活动单元格中。
第 10 行:此语句以当前活动单元格(ActiveCell
)为基准向下移动一个单元格(Offset(1, 0)
)。
第 11 行:这表示宏的结束。
这个相对引用宏代码中完全没有指向任何具体单元格区域的引用(除了起始单元格 A1,而且完全可以删除)。
下面来看运行下这个宏,看看效果:
- 按 Alt+F11 返回 Excel。
- 当 Excel 处于活动状态时,激活一个工作表,选择任意一个单元格。
- 按下 Ctrl+J 组合键。
该宏会立即将 Hello World!
输入到您选择的单元格的右边一个单元格,并且激活输入 Hello World!
的下边的一个单元格。而我们之前用绝对引用录制的宏,不管你选择什么单元格,都固定在录制的单元格里输入文本。
下面我们把录制的起始单元格 A1 删除掉,并删除所有的注释来对比绝对引用和相对引用的代码有什么不同。
使用相对引用:
Sub HelloWorld()
ActiveCell.Offset(0, 1).Select
ActiveCell.FormulaR1C1 = "Hello World!"
ActiveCell.Offset(1, 0).Select
End Sub
使用绝对引用:
Sub HelloWorld()
Range("B1").Select
ActiveCell.FormulaR1C1 = "Hello World!"
Range("B2").Select
End Sub
我们看到使用相对引用录制的代码就是,把具体引的单元格地址,更换成相对于活动单元格地址的偏量。
所以要想让相对引用的宏能正确运行,需要确保:在运行宏前要选择正确的起始单元格。
当我们熟练的掌握了相对引用和绝对引用,我们就能在代码里既使用相对引用又使用绝对引用。
另外,我们优化下刚才的相对引用宏,核心代码就是:
Sub HelloWorld()
ActiveCell.Offset(0, 1).FormulaR1C1 = "Hello World!"
End Sub