ActiveCell.Offset混乱

时间:2015-03-18 14:45:20

标签: excel vba excel-vba

我正在读一个曾经写过的模块中的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”)子句?

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

1 个答案:

答案 0 :(得分:9)

简短回答

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

长答案

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

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

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

考虑以下宏:

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

无论您选择哪个范围,都会在选择内打印白色单元格的地址。

enter image description here

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. 接下来,我们在Offset(1,0)上致电ActiveCell,相当于Range("A2").Offset(1,0)将我们放在A3范围内(A2下方1行)

  3. 现在我们调用.Range("A1")来获取范围内的第一个单元格。由于当前范围 A3.Range("A1")为我们提供A3

  4. 当然.Select()仍然只选择A3

  5. .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行。

    即:

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

    enter image description here

    我们运行示例宏:

    enter image description here

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

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

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

    enter image description here

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