Mude “seleção” na folha inativa. VBA

1

Eu percebo que é uma prática recomendada evitar o uso de qualquer seleção em seu código, mas isso é mais curioso do que qualquer outra coisa. Se você selecionar uma célula e depois alterar sua planilha, a seleção na planilha inativa será lembrada.

Para demonstrar; se eu fizer algo como

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

Em seguida, posso colar a célula A1 na planilha ativa em qualquer "seleção" atualmente "selecionada" na planilha inativa

Existe uma maneira de obter ou alterar essa "seleção"?

    
por Some_Guy 07.09.2016 / 18:09

3 respostas

3

Propriedade Range.Cells :

Because the Item property is the default property for the Range object, you can specify the row and column index immediately after the Cells keyword. For more information, see the Item property and the examples for this topic.

Using this property without an object qualifier returns a Range object that represents all the cells on the active worksheet.

minha ênfase

Você não está qualificando o seu alcance, é por isso que isso está acontecendo

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

Range("a1") refere-se a _GLOBAL.Range("a1") , em que _GLOBAL se refere a Activesheet .

Se você tivesse qualificado o original .Range com uma planilha, isso não aconteceria. Não importa se você realmente usa .Select ou não.

Exemplos

Execute isto enquanto a Folha1 estiver ativa. Em seguida, execute-o novamente (o Sheet2 estará ativo)

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

Selecione C3 na Planilha4, depois vire para Planilha3 e selecione A1. Então observe o que acontece aqui

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
    
por 07.09.2016 / 20:47
2

A documentação MSDN dos estados do método Worksheet.Paste , em relação ao opcional Destination parameter:

A Range object that specifies where the Clipboard contents should be pasted. If this argument is omitted, the current selection is used.

Como a seleção atual está em outra planilha, somente a parte endereço é relevante, de acordo com a seção observações da mesma página :

If you don't specify the Destination argument, you must select the destination range before you use this method.

This method may modify the sheet selection, depending on the contents of the Clipboard.

Portanto, a sua pergunta resume-se a como o Worksheet.Paste lida com o parâmetro Destination quando é omitido e a área de transferência contém um objeto Range .

Agora, como outras respostas afirmaram, uma chamada Range não qualificada está referenciando implicitamente a ActiveSheet , então sua área de transferência contém ActiveSheet.Range("A1") após a cópia:

Range("a1").Copy

Quando você Paste , você está qualificando o destino - implicitamente; o destino deve estar na planilha à qual Worksheets(2) está se referindo, porque você está chamando .Paste against e não forneceu um parâmetro Destination .

Considere isso:

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

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

Portanto, quando um Destination é fornecido, não importa em qual folha você qualificou a chamada Paste . Você pergunta:

Is there a way to get or change this "selection"?

Sim: forneça um valor para o parâmetro Destination !

    
por 07.09.2016 / 21:59
0

Se eu entendi sua pergunta, um método como este funcionaria:

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

Novamente, é uma prática recomendada evitar .Select sempre que possível, assim que puder, eu definiria isso para um intervalo.

    
por 07.09.2016 / 19:38