更改非活动工作表中的“选择”。VBA

更改非活动工作表中的“选择”。VBA

我意识到最好的做法是避免在代码中使用任何选择,但这更多的是出于好奇。如果您选择一个单元格然后更改工作表,则会记住非活动工作表中的选择。

为了证明;如果我做类似的事情

Sub schrodingers_copy()
Range("a1").Copy
Worksheets(2).Paste
End Sub

然后我可以将活动工作表中的单元格 A1 粘贴到当前“选定”的任何“选择”中非活动工作表

有没有办法获取或改变这个“选择”?

答案1

Range.Cells 属性

由于 Item 属性是 Range 对象的默认属性,因此您可以在 Cells 关键字后立即指定行和列索引。有关详细信息,请参阅 Item 属性和本主题的示例。

使用此属性没有对象限定符返回一个 Range 对象,该对象代表活动工作表

我的重点


你没有限定你的范围,这就是为什么会发生这种情况

Sub schrodingers_copy()
Range("a1").Copy
Worksheets(2).Paste
End Sub

Range("a1")指的是 ,指的是_GLOBAL.Range("a1")哪里。_GLOBALActivesheet

如果你用纸张检验原件,就不会发生这种情况。无论你实际使用与否.Range都没关系。.Select


例子

在 Sheet1 处于活动状态时运行此命令。然后再次运行(Sheet2 将处于活动状态)

Sub BadKitty()
    Sheet1.Cells(1, 1).Select
    MsgBox Selection.Parent.Name
    Sheet2.Activate
    Selection = "What sheet is this"
    MsgBox Selection.Parent.Name
End Sub

在 Sheet4 上选择 C3,然后转到 Sheet3 并选择 A1。然后观察这里发生了什么

Sub DontOpenTheBox()
    Dim x As String
    Range("A1").Select
    Sheet2.Range("B2") = Selection.Address
    Selection = "what sheet is this? "
    Sheet4.Activate
    x = Selection.Parent.Name
    MsgBox x
    Sheet3.Range("B2") = Selection.Address
End Sub

答案2

微软Worksheet.Paste关于可选参数的方法状态文档Destination

Range 对象,指定剪贴板内容应粘贴到的位置。如果省略此参数,则使用当前选择

当前选择在另一个工作表上,只有地址其中一部分是相关的,根据评论同一页上的部分:

如果没有指定 Destination 参数,则必须在使用此方法之前选择目标范围。

此方法可能会修改工作表选择,取决于剪贴板的内容。

所以你的问题完全归结为当省略它并且剪贴板包含一个对象时如何Worksheet.Paste处理它的参数。DestinationRange

现在,正如其他答案所述,不合格的Range调用隐式地引用了,因此复制后ActiveSheet剪贴板包含:ActiveSheet.Range("A1")

Range("a1").Copy

Paste限定目的地 - 隐式;目的地必须在任何工作Worksheets(2)表上,因为这就是你要.Paste反对的并且您没有提供 Destination 参数

考虑一下:

Sheet1.Range("A1") = "test"
Sheet1.Range("A1").Copy

Sheet3.Paste 'destination is [Sheet3!A1]
Sheet3.Paste Sheet1.Range("A2") 'destination is [Sheet1!A2]

因此,当提供 a 时Destination,使用什么表单来限定调用并不重要Paste。你问:

有没有办法获取或改变这个“选择”?

是:为参数提供一个值Destination

答案3

如果我理解了你的问题,那么像这样的方法是否有效:

Sub testSelection()
' This is to show how to work with .Selection, but not actually
' using .Select/.Selection.  We're going to take the value in
' Sheet1, SELECTION, and place that value in the selection of Sheet2, B2.

Dim theSelection As Range
Set theSelection = Selection
Debug.Print theSelection.Address

Sheets("Sheet2").Activate
Sheets("Sheet2").Cells(2, 2).Value = theSelection.Value

'Now, we want to move ONE CELL RIGHT of the Sheet1 selection
Set theSelection = theSelection.Offset(0, 1)
Debug.Print theSelection.Address

End Sub

再次强调,最佳做法是避免.Select只要有可能,我就会尽快将其设置为一个范围。

相关内容