ActiveCell.Offset混乱

我正在读一些有人写过的模块中的一些VBA,碰到一些令我困惑的东西:

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

我想知道如何ActiveCell.Offset(列,行).Range()。select行工作。 在这种情况下,“开始”范围是一个单元格A18,偏移量偏移一行,我得到了很多。 但是我并没有追踪Range(“A1”)在这里插入的方式或范围。

岂不

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

工作是一样的,减less混淆? Range(“A1”)子句是否有插入的原因?

非常感谢,对于初学者的问题感到抱歉。

简短的回答

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

长答案

这是因为你在这一行使用ActiveCell

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

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

考虑下面的macros:

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

无论select哪个范围,都将打印select内的白色单元格的地址。

在这里输入图像描述

ActiveCell$A$4

在一个单元格上调用Offset(1,0)将只抵消该单元格 。 所以,如果我们看看你的原始代码:

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

让我们假设我之前的select( A2:B4 )是“开始”的命名范围,我们可以精确地看看发生了什么:

  1. 在范例Range("Start").Select范例中,select范围A2:B4 。 从而使ActiveCell等于A2

  2. 接下来我们调用ActiveCell上的Offset(1,0) ,它等于Range("A2").Offset(1,0)将我们放在范围A3 (A2下面的一行)

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

  4. 那么当然.Select()仍然只selectA3

什么时候.Range("A1")实际上有用?

考虑下面没有任何Range("A1")调用的例子:

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

由于我们已经改变了ActiveCellSelection Offset(1,0)将select相同的尺寸范围作为“开始”刚抵消1行。

即:

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

在这里输入图像描述

我们运行示例macros:

在这里输入图像描述

我们有相同维度的新select。

但是,如果我们将示例macros更改为包含Range("A1")

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

在这里输入图像描述

现在只select选区中的第一个单元格。