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"?
microsoft-excel
vba
Some_Guy
fonte
fonte
.paste
é feito na planilha 2?Worksheets(2).Range("A1").PasteSpecial
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.Select
com uma planilha INATIVA, o VBA tenderá a gerar um erro até você ativar essa planilha.Respostas:
Propriedade Range.Cells :
minha ênfase
Você não está qualificando seu alcance, é por isso que isso está acontecendo
Range("a1")
refere-se a_GLOBAL.Range("a1")
onde_GLOBAL
está se referindoActivesheet
.Se você tivesse qualificado o original
.Range
com uma folha, isso não aconteceria. Não importa se você realmente usa.Select
ou não.Exemplos
Execute isso enquanto a Folha1 está ativa. Em seguida, execute-o novamente (a Plan2 estará ativa)
Selecione C3 na Planilha4, vá para a Planilha3 e selecione A1. Então veja o que acontece aqui
fonte
A documentação do MSDN para os
Worksheet.Paste
estados do método, em relação aoDestination
parâmetro opcional :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:
Portanto, sua pergunta se resume a como
Worksheet.Paste
lida com seuDestination
parâmetro quando é omitido e a área de transferência contém umRange
objeto.Agora, como outras respostas declararam, uma
Range
chamada não qualificada está implicitamente se referindo aActiveSheet
, portanto, sua área de transferência contémActiveSheet.Range("A1")
após a cópia:Quando você
Paste
, no entanto, está qualificando o destino - implicitamente; o destino deve estar na planilha a queWorksheets(2)
se refere, porque é.Paste
contra isso que você está ligando e não forneceu um parâmetro Destination .Considere isto:
Portanto, quando um
Destination
é fornecido, não importa em qual planilha você qualificou aPaste
chamada. Você pergunta:Sim: forneça um valor para o
Destination
parâmetro!fonte
Se eu entendi sua pergunta, um método como este funcionaria:
Novamente, é uma prática recomendada evitar
.Select
sempre que possível; assim que possível, eu definiria isso para um intervalo.fonte