excel - 相对引用,recoaring 宏,VBA
问题描述
我正在使用相对引用在 VBA 中录制宏,我首先选择单元格 A1。生成的代码是这样的:
ActiveCell.FormulaR1C1 = "First Cell"
ActiveCell.Offset(1,1).Range("A1").Select
ActiveCell.FormulaR1C1 = "Second Cell"
ActiveCell.Offset(1,0).Range("A1").Select
我想知道为什么我们在第二个和第四个单元格中得到“.Range.("A1)”?相对引用不应该以这样的方式表现,即我们只是从起始单元格开始,我们可以在其他地方开始,所以“A1”不需要出现在代码中吗?我尝试从第二行删除“.Range(“A1”)”,宏似乎做了同样的事情?
解决方案
当您选择一个打开了相对引用的范围时,宏记录器会做两件事:
- 它确定与将成为新选择范围左上角单元格的活动单元格的偏移量。如果您从 A1 转到 B1,它将构建
ActiveCell.Offset(0,1)
为向下移动零行,向右移动一列。 - 它确定新选择的范围的宽度和高度,并以 A1 表示法构建高度和宽度的命令。如果从 A1 到 B1,它会计算出新的范围为 1x1。在 A1 表示法中,相对于活动单元格的 1x1 选择是“A1”,因此它继续构建命令为
ActiveCell.Offset(0,1).Range("A1")
他们必须构建宏记录器以分两步执行此操作,因为您可以选择多个单元格。如果您从 A1 转到 B1:C7。你得到
ActiveCell.FormulaR1C1 = "First Cell"
ActiveCell.Offset(0, 1).Range("A1:B7").Select
这意味着“从活动单元格右侧的零行和一列的单元格开始,然后就好像它是整个工作表的左上角单元格一样,选择一个两列宽和七个单元格高的范围。
令人困惑的部分是 A1 符号。人们只会想到像 A1 这样的单元格引用来引用整个工作表。所以像 C6 这样的引用将始终是第三列和第六行。
但在 VBA 中,您可以从任何单元格开始使用 A1 表示法。您可以选择单元格 K10,然后在立即窗口中输入:
?activecell.Range("b2").Range("b2").Range("b2").Address
你会得到 13 美元。这些 B2 引用中的每一个都意味着向右移动一列并向下移动一行。他们三个连续做三次。关键是它以一个Range
对象开头,即ActiveCell
。如果您从工作表开始,例如Sheet1
or ActiveSheet
,那么 A1 表示法将相对于工作表的左上角。
为什么没有它就可以工作?
Range("A1")
如果您选择一个单元格,它仅在没有该部分的情况下才有效。如果您选择了多个单元格,您仍然可以删除 Range 部分,但代码将无法正常工作。
它在没有 Range 部分的情况下工作的另一个重要原因是该Offset
属性返回一个Range
对象。有很多属性可以返回Range
对象,包括Range
、Offset
、Resize
和Cells
. 任何返回Range
对象的属性都可以跟.Select
因为Select
是Range
对象的属性。
为什么记录仪包含单个单元格?
除了创建宏记录器的程序员之外,没有人知道。他们可以很容易地计算出新选择的范围是单个单元格并在 处停止ActiveCell.Offset(0,1).Select
,但无论新选择的高度和宽度如何,执行这两个步骤可能更容易。
推荐阅读
- c++ - 如何测试不同的 gcc 目标属性
- error-logging - syslog-ng - 使用 wildcard_file 时将 FILENAME 从客户端传递到服务器
- symfony - 没有引擎能够使用模板
- flutter - 如何在小部件层次结构中约束 ListTile
- javascript - 错误:通过 python 子进程调用启动 NodeJS 服务器时找不到模块
- python - Python中的全局变量和函数给出错误
- bash - Bash 命令“Head”未显示我的 bed/csv 文件的某些列
- css - CSS中从上到下的动画
- c - 影响 char 上的移位运算符
- python - 我找到了一个掩码检测程序,想知道是否可以用其他东西替换 tensorflow 库