Vba 活动单元格。抵消混乱

Vba 活动单元格。抵消混乱,vba,excel,Vba,Excel,我在读前一个模块中的一些VBA,有人写了这个模块,遇到了一些让我困惑的东西: Sheets("Setup").Select Range("Start").Select ActiveCell.Offset(1, 0).Range("A1").Select 我想知道ActiveCell.Offset(column,row).Range().Select line是如何工作的。在本例中,“开始”范围是一个单元格A18,偏移量将其偏移一行,这就是我得到的。但我并没有关注插入范围(“A1”)的方式或内容

我在读前一个模块中的一些VBA,有人写了这个模块,遇到了一些让我困惑的东西:

Sheets("Setup").Select
Range("Start").Select
ActiveCell.Offset(1, 0).Range("A1").Select
我想知道ActiveCell.Offset(column,row).Range().Select line是如何工作的。在本例中,“开始”范围是一个单元格A18,偏移量将其偏移一行,这就是我得到的。但我并没有关注插入范围(“A1”)的方式或内容

不会

Sheets("Setup").Select
Range("Start").Select
ActiveCell.Offset(1, 0).Select
照样工作,减少混乱?是否有任何理由插入范围(“A1”)条款

非常感谢,对于初学者的问题,我很抱歉

简短回答 是的,在这种特殊情况下,两者的作用相同。移除
范围(“A1”)
即可

长话短说 这是因为您在此行中使用了
ActiveCell

ActiveCell.Offset(1, 0).Range("A1").Select
ActiveCell
是所选范围内的第一个单元格

考虑以下宏:

Sub Macro1()
    Debug.Print ActiveCell.Address
End Sub
无论选择哪个范围,此选项都将打印所选内容中白色单元格的地址

i、 e

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

  • 在本例中,选择范围(“开始”)。选择范围将选择范围
    A2:B4
    。从而使
    ActiveCell
    等于
    A2

  • 接下来,我们在
    ActiveCell
    上调用
    Offset(1,0)
    ,它相当于
    Range(“A2”)。Offset(1,0)
    将我们置于Range
    A3
    (A2下1行)

  • 现在我们调用
    .Range(“A1”)
    ,它将获取范围内的第一个单元格。由于当前范围仅为
    A3
    .range(“A1”)
    为我们提供了
    A3

  • 当然,
    .Select()
    仍然只是选择
    A3

  • .Range(“A1”)
    什么时候真正有用? 考虑以下没有任何
    范围(“A1”)
    调用的示例:

    Sub Macro3()
        Sheets("Setup").Select
        Range("Start").Select
        Selection.Offset(1, 0).Select
    End Sub
    
    由于我们已将
    ActiveCell
    更改为
    Selection
    Offset(1,0)
    将选择与“Start”相同的尺寸范围,仅偏移1行

    i、 e:

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

    我们运行示例宏:

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

    但是,如果我们将示例宏更改为包含
    范围(“A1”)


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

    是的,它的工作原理相同,并且不那么混乱。:)谢谢Rory!关于范围(“A1”)部分,以及为什么它仍然执行相同的功能,您有什么想法吗?请参阅@chancea的答案了解其工作原理。至于原因:如果您在录制宏时选中了“使用相对引用”选项,则宏录制器会将其放在那里。很好的答案(+1)当然,
    Resize()
    也可以实现同样的效果,而且更清晰,依我看;)回答得好!谢谢你抽出时间。因此,我想我理解您关于“ActiveCell”而不是使用范围('Selection()')的解释:在两种不同的场景中,我们将单个单元格相对于整个范围移动一行。我不完全理解的是,为什么在代码行中包含范围(“A1”)不会改变代码行的结果。或者更确切地说,它告诉偏移函数要做什么。再次感谢@我试图更新和澄清。看我的edit@chancea所以
    偏移量(x,x).Range()
    部分只是一个定义,用于定义将要使用的数组的大小,而不是对要选择的点的实际引用?对不起,我认为你解释得非常好,我只是无法准确理解
    Selection.Offset(1,0)。Select
    vs
    Selection.Offset(1,0)。Range(“A1”)。Select
    正在定义什么。在python中,我们看到
    open(“file.txt”,“a”)
    a是open()函数的加数可选定义。在VBA中,是
    .Offset().xxx。选择
    ,xxx是他输入
    范围()
    的地方,这让我很困惑。
    Sub Macro4()
        Sheets("Setup").Select
        Range("Start").Select
        Selection.Offset(1, 0).Range("A1").Select
    End Sub