Alterar "seleção" na planilha inativa. VBA

1

Percebo que é uma prática recomendada evitar usar seleções no seu código, mas isso é mais por curiosidade 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"?

Some_Guy
fonte
1
Que valor você está tentando mudar? Onde isso .pasteé feito na planilha 2?
BruceWayne
@BruceWayne Sim. Quero alterar a "seleção" em uma planilha inativa. Essa rotina de pasta curta é apenas para demonstrar que essa seleção existe de fato.
Some_Guy
1
Para alterar a seleção, você não estaria apenas definindo o intervalo? isto é,Worksheets(2).Range("A1").PasteSpecial
Scott Craner
Você realmente não deveria usar Selection, mas eu entendo o que você está perguntando. Primeiro, eu definiria a seleção para uma variável de intervalo. Em seguida, você pode ajustá-lo conforme necessário. Isso deve ser mais limpo do que brincar .Select. IIRC, se você usar .Selectcom uma planilha INATIVA, o VBA tenderá a gerar um erro até você ativar essa planilha.
precisa saber é o seguinte
1
Na documentação : " Destino - Opcional - ... Se esse argumento for omitido, a seleção atual será usada ..."
Comintern

Respostas:

3

Propriedade Range.Cells :

Como a propriedade Item é a propriedade padrão para o objeto Range, você pode especificar o índice de linha e coluna imediatamente após a palavra-chave Cells. Para mais informações, consulte a propriedade Item e os exemplos deste tópico.

O uso dessa propriedade sem um qualificador de objeto retorna um objeto Range que representa todas as células na planilha ativa .

minha ênfase


Você não está qualificando 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")onde _GLOBALestá se referindo Activesheet.

Se você tivesse qualificado o original .Rangecom uma folha, isso não aconteceria. Não importa se você realmente usa .Selectou não.


Exemplos

Execute isso enquanto a Folha1 está ativa. Em seguida, execute-o novamente (a Plan2 estará ativa)

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, vá para a Planilha3 e selecione A1. Então veja 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
Raystafarian
fonte
Acho que estou perdendo o ponto que você está tentando chegar aqui. Se a planilha1 estiver ativa, badkitty () copia para qualquer célula que foi a última seleção feita na planilha 2. Se a planilha 2 estiver ativa no início, ela falhará.
Some_Guy
2

A documentação do MSDN para os Worksheet.Pasteestados do método, em relação ao Destinationparâmetro opcional :

Um objeto Range que especifica onde o conteúdo da área de transferência deve ser colado. Se esse argumento for omitido, a seleção atual será usada .

Como a seleção atual está em outra planilha, apenas a parte do endereço é relevante, de acordo com a seção de comentários na mesma página:

Se você não especificar o argumento Destino, deverá selecionar o intervalo de destino antes de usar este método.

Este método pode modificar a seleção da folha , dependendo do conteúdo da área de transferência.

Portanto, sua pergunta se resume a como Worksheet.Pastelida com seu Destinationparâmetro quando é omitido e a área de transferência contém um Rangeobjeto.

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

Range("a1").Copy

Quando você Paste, no entanto, está qualificando o destino - implicitamente; o destino deve estar na planilha a que Worksheets(2)se refere, porque é .Pastecontra isso que você está ligando e não forneceu um parâmetro Destination .

Considere isto:

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 planilha você qualificou a Pastechamada. Você pergunta:

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

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

Mathieu Guindon
fonte
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 possível, eu definiria isso para um intervalo.

Bruce Wayne
fonte