我正在读一个曾经写过的模块中的VBA,并且遇到了让我感到困惑的事情:
Sheets("Setup").Select
Range("Start").Select
ActiveCell.Offset(1, 0).Range("A1").Select
我想知道ActiveCell.Offset(列,行).Range()。选择行如何工作。在这种情况下,“开始”范围是一个单元格,A18,偏移量将其偏移一行,这是我得到的。但是我没有按照范围(“A1”)插入的方式或内容进行操作。
岂不
Sheets("Setup").Select
Range("Start").Select
ActiveCell.Offset(1, 0).Select
工作方式相同而且不那么混乱?是否有任何理由插入Range(“A1”)子句?
非常感谢,对于初学者的问题感到抱歉。
答案 0 :(得分:9)
是在这种特殊情况下都做同样的事情。删除Range("A1")
很好。
这是因为您在此行中使用了ActiveCell
:
ActiveCell.Offset(1, 0).Range("A1").Select
ActiveCell
是您选择的范围内的第一个单元格。
考虑以下宏:
Sub Macro1()
Debug.Print ActiveCell.Address
End Sub
无论您选择哪个范围,都会在选择内打印白色单元格的地址。
即
ActiveCell
为$A$4
在单个单元格上调用Offset(1,0)
只会偏移该单元格。因此,如果我们查看您的原始代码:
Sub Macro2()
Sheets("Setup").Select
Range("Start").Select
ActiveCell.Offset(1, 0).Range("A1").Select
End Sub
让我们假设我之前显示的选择(A2:B4
)是“开始”的命名范围,我们可以完全了解发生的事情:
在此示例中,Range("Start").Select
会选择范围A2:B4
。因此,ActiveCell
等于A2
。
接下来,我们在Offset(1,0)
上致电ActiveCell
,相当于Range("A2").Offset(1,0)
将我们放在A3
范围内(A2下方1行)
现在我们调用.Range("A1")
来获取范围内的第一个单元格。由于当前范围仅 A3
,.Range("A1")
为我们提供A3
。
当然.Select()
仍然只选择A3
.Range("A1")
何时实际有用?请考虑以下示例,不要进行任何Range("A1")
调用:
Sub Macro3()
Sheets("Setup").Select
Range("Start").Select
Selection.Offset(1, 0).Select
End Sub
由于我们已将ActiveCell
更改为Selection
,因此Offset(1,0)
将选择与“开始”相同的维度范围,只是偏移1行。
即:
如果这是“开始”的范围:
我们运行示例宏:
我们有一个相同维度的新选择。
但是,如果我们更改示例宏以包含Range("A1")
:
Sub Macro4()
Sheets("Setup").Select
Range("Start").Select
Selection.Offset(1, 0).Range("A1").Select
End Sub
现在只选择了选择中的第一个单元格。