我意识到最好的做法是避免在代码中使用任何选择,但这更多的是出于好奇。如果您选择一个单元格然后更改工作表,则会记住非活动工作表中的选择。
为了证明;如果我做类似的事情
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")
哪里。_GLOBAL
Activesheet
如果你用纸张检验原件,就不会发生这种情况。无论你实际使用与否.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
处理它的参数。Destination
Range
现在,正如其他答案所述,不合格的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
只要有可能,我就会尽快将其设置为一个范围。