繁体   English   中英

ActiveCell.Offset 混淆

[英]ActiveCell.Offset Confusion

我正在阅读某人之前编写的模块中的一些 VBA 并遇到了一些让我感到困惑的事情:

Sheets("Setup").Select
Range("Start").Select
ActiveCell.Offset(1, 0).Range("A1").Select

我想知道 ActiveCell.Offset(column,row).Range().Select 行是如何工作的。 在这种情况下,“开始”范围是一个单元格,A18,偏移量将它偏移一行,我得到了这么多。 但我没有关注 Range("A1") 在这里插入的方式或内容。

不会

Sheets("Setup").Select
Range("Start").Select
ActiveCell.Offset(1, 0).Select

工作相同并且不那么令人困惑? 插入 Range("A1") 子句是否有任何原因?

非常感谢,很抱歉初学者的问题。

简答

是的,在这种特殊情况下,两者都做同样的事情。 删除Range("A1")很好。

长答案

这是因为您在这一行中使用了ActiveCell

ActiveCell.Offset(1, 0).Range("A1").Select

ActiveCell是您选择的范围内的第一个单元格。

考虑以下宏:

Sub Macro1()
    Debug.Print ActiveCell.Address
End Sub

无论您选择什么范围,这都会打印所选内容中白色单元格的地址。

IE

在此处输入图片说明

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 )是“开始”的命名范围,我们可以准确地了解正在发生的事情:

  1. 在此示例中Range("Start").Select将选择范围A2:B4 从而使ActiveCell等于A2

  2. 接下来我们在ActiveCell上调用Offset(1,0)相当于Range("A2").Offset(1,0)将我们置于范围A3 (A2 下方的 1 行)

  3. 现在我们调用.Range("A1")它将抓取范围内的第一个单元格 由于当前范围只有A3.Range("A1")给了我们A3

  4. 那么当然.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)将选择与“Start”相同的尺寸范围,只是偏移了 1 行。

IE:

如果这是“开始”的范围:

在此处输入图片说明

我们运行示例宏:

在此处输入图片说明

我们有一个相同维度的新选择。

但是,如果我们更改示例宏以包含Range("A1")

Sub Macro4()
    Sheets("Setup").Select
    Range("Start").Select
    Selection.Offset(1, 0).Range("A1").Select
End Sub

在此处输入图片说明

现在只选择了选择中的第一个单元格。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM