Gostaria de compartilhar algo que uso a anos, mas pelo que vejo no dia a dia, acredito que poucos saibam. Imagine o cenário: você está com uma tabela de dados filtrada, aí precisa copiar e colar os dados filtrados ou visíveis para outra coluna desta mesma tabela filtrada, mas só quer fazer isso nas linhas filtradas, claro. Ou seja, você quer copiar os dados visíveis, e colar apenas nas linhas que também estão visíveis, e ainda por cima quer que o Excel preserve os dados que estão nas linhas ocultas ou “não estão no filtro”. Vou te ensinar duas formas de fazer isso: Uma com um truque usando recursos do próprio Excel e outra usando uma macro, que você verá mais à frente a utilidade e pode servir se você quiser fazer alguma automatização na sua planilha.
Vamos a uma breve introdução, para que você entenda do que estou falando:
Esta é a nossa tabela de dados, sem filtros:
Filtramos apenas pela coluna C (“Em estoque” = Sim):
E agora, imagine que a por algum motivo, eu preciso colar os dados da coluna D, que eu consegui através de um PROCV que eu “puxei” de outra planilha, para a coluna “B”, por exemplo. E quero que o “Valor/Kg” seja colocado apenas para os produtos que estão em estoque, ou seja, apenas para os que estão aparecendo no filtro.
Você pensa: “OK, vou apenas dar o velho e bom Ctrl+C na coluna D e um Ctrl+V na B, e pronto”. Se você tentar fazer desta forma, vai acontecer isso…
Isso acontece porque o Excel, ao copiar e colar considera as linhas ocultas como parte do intervalo a ser colado. Eu sempre desejei que o Excel pudesse ser inteligente e já fazer isso por padrão, já que estamos trabalhando em uma tabela filtrada mas enfim…
Agora entendeu o problema né? Isso é fácil de resolver “na unha”, copiando célula por célula se for uma tabela pequena, mas e se forem milhares de linhas? Vamos adiante!
Parte 1: Truque usando recursos do Excel:
Este pequeno truque vai atender a maioria das necessidades e você não precisará recorrer a macro.
Vamos usar a mesma planilha de exemplo, com os mesmos filtros. Para conseguir a “cola mágica” siga estes passos:
- Já com o filtro aplicado, selecione o intervalo que você quer preencher com os dados que serão copiados:
- Pressione a tecla F5 no teclado, na janela que aparece clique em “Especial…”
- Clique em “Somente células visíveis” e dê OK:
- A seleção vai ficar assim (vai aparecer a primeira célula da seleção com bordas verdes finas e o restante em cinza:
- Agora, SEM CLICAR EM NADA, digite no seu teclado a fórmula: =D2 (porque a minha primeira linha filtrada é a 2, mas poderia ser qualquer outra, preste atenção nisso senão não vai dar certo!.
- Pressione simultaneamente Ctrl + ENTER e veja o que acontece:
Sensacional, não é? O Excel colocou a fórmula apenas no intervalo visível. Vamos tirar o filtro para ver o que o Excel fez:
Repare que o Excel preservou as linhas que continham a interrogação. Agora é só limpar o filtro, depois copiar e colar especial para remover as fórmulas e pronto. Se isto resolveu para você, pode parar por aqui. Foi um prazer ajudar! 😉
Agora se você não pode copiar/colar especial por algum motivo, como por exemplo para preservar outras fórmulas, dados, ou se simplesmente quer fazer isso sem tirar o filtro, ou se você só gosta de macros, vamos ter que partir para a solução com… macros.
Veja o que acontece quando tentamos copiar e colar especial nas células filtradas que acabamos de aplicar nosso truque:
Logo após preencher com Ctrl+Enter o intervalo, conforme explicado mais acima, seu instinto manda você copiar e colar especial para o mesmo intervalo, para não ter que mexer com os dados que não estão filtrados (ou ocultos, como preferir), certo?
Selecionando e copiando os dados que acabaram de ser preenchidos com a “cola mágica” que explicamos mais acima…
Agora vamos selecionar B2 ou B2:B12, clicar com o botão direito e tentar colar especial, para tirar as fórmulas…
Que pena! O Excel será mais uma vez amável com você e dirá isso:
E se tentar de outro jeito, dirá isso:
E se reclamar, tomará mais isso:
Mas isso tem solução, agora você terá que recorrer a uma macro. Infelizmente não tem outra forma. Confesso que fiquei muito tempo pesquisando para encontrar uma solução confiável, que funcionasse todas as vezes em qualquer situação e que eu pudesse ter certeza que não iria destruir meus dados. Isto porque por padrão, sempre que o Excel executa uma macro, ele apaga o cache de mudanças recentes, ou seja, ao executar uma macro, você não consegue mais clicar no botão desfazer, afinal, não tem como “desexecutar” (sic) uma macro ou fazer ela executar ao contrário.
Parte 2: Macro para copiar e colar somente em células visíveis / filtradas
Minha macro foi retirada neste site. Fiz algumas adaptações e traduzi para o português. Com ela o trabalho é executado com perfeição.
Não se preocupe, vamos passo a passo fazer isso e tenho certeza que você conseguirá. Existe uma forma de deixar isso disponível no seu Excel como uma função permanente, para isso terá que construir um arquivo .xlam, mas não vamos abordar isso aqui. Você pode ler sobre isso aqui e também aqui.
A ideia é apenas executar a macro, conferir os dados e depois removê-la, para não ter que salvar a planilha com macros.
Não se assuste com o código que vem a seguir, você não precisará alterar nada.
Siga os passos:
- Com o Excel aberto, pressione Alt+F11, vai abrir essa tela feia, meio anos 90. É o editor do Visual Basic, onde iremos colar nosso código:
- Agora clique com O BOTÃO DIREITO em qualquer item desta lista de objetos que aparecem na esquerda, e escolha a opção “inserir/módulo”:
- Agora vai aparecer uma tela em branco:
- Selecione e copie todo o código abaixo (não deixe faltar nem uma parte):
Sub CopiarColarEmCelulasVisiveis() 'Copia e cola valores em um intervalo filtrado, preservando os dados das linhas ocultas. _ (Não funciona com colunas ocultas, somente linhas ocultas. '---------------------------------------------------------------------------------------- 'Código original: 'https://www.mrexcel.com/forum/excel-questions/85288-paste-visible-cells-only-8.html 'adaptado por Cristiano Ash 'https://cristianoash.wordpress.com/ '---------------------------------------------------------------------------------------- Dim SrcRng As Range Dim SrcRngVisible As Range Dim DestRng As Range Dim SrcCell As Variant Dim DestCell As Variant Dim DestRngColumnCount As Long Dim DestRngRowCount As Long Dim msgAnswer As Variant On Error Resume Next 'Seleciona o intervalo de origem (os dados que você quer copiar)... Set SrcRng = Application.InputBox("Selecione o intervalo de origem...", Default:=Selection.Address, Type:=8) On Error GoTo 0 If SrcRng Is Nothing Then Exit Sub On Error Resume Next 'Seleciona o intervalor de destino... Set DestRng = Application.InputBox("Selecione o intervalo de destino...", Type:=8) On Error GoTo 0 If DestRng Is Nothing Then Exit Sub 'Observe que você não pode colocar ScreenUpdating, até que o valor das input boxes _ seja definido, o Application.ScreenUpdating = False deve vir depois _ que você tiver selecionado o intervalo ou então dará um erro. Application.ScreenUpdating = False 'Calcula a quantidade de colunas, linhas e a primeira coluna... SrcRngRowCount = SrcRng.Rows.Count SrcRngColumnCount = SrcRng.Columns.Count DestRngColumnCount = DestRng.Columns.Count DestRngRowCount = DestRng.Rows.Count DestRngFirstColumn = DestRng.Cells(1, 1).Column 'DEtermina se os intervalos de origem e destino tem o mesmo tamanho... If SrcRngColumnCount <> DestRngColumnCount Or SrcRngRowCount <> DestRngRowCount Then msgAnswer = MsgBox("Os intervalos de origem e destino não têm o mesmo tamanho." & vbCrLf & vbCrLf & _ "Selecione os intervalos novamente e tente outra vez.", vbExclamation + vbOKOnly, "Intervalo Selecionado Inválido") Application.ScreenUpdating = True Exit Sub End If 'Seta o intervalo de origem para apenas células visíveis Set SrcRngVisible = SrcRng.SpecialCells(xlCellTypeVisible) 'Faz o loop por cada célula visível do intervalo de origem... For Each SrcCell In SrcRngVisible 'Faz o loop por cada célula do intervalo de destino... For Each DestCell In DestRng 'Somente copia se a célula for visível (RowHeight não é 0) If DestCell.EntireRow.RowHeight > 0 Then 'Verifica se o valor na célula de destino não é vazio... If SrcCell.Value <> "" Then DestCell.Value = SrcCell.Value End If 'Determina se existem várias colunas de valores que estão sendo copiados If DestRngColumnCount > 1 Then If DestCell.Column = DestRngFirstColumn + DestRngColumnCount - 1 Then 'Mover para a próxima linha, resetar a coluna Set DestRng = DestCell.Offset(1, (DestRngColumnCount - 1) * -1).Resize(DestRngRowCount, DestRngColumnCount) Else 'Mover para a próxima coluna Set DestRng = DestCell.Offset(0, 1).Resize(DestRngRowCount, DestRngColumnCount) End If Exit For Else ''Mover para a próxima linha Set DestRng = DestCell.Offset(1, 0).Resize(DestRngRowCount, DestRngColumnCount) Exit For End If End If Next Next Application.ScreenUpdating = True End Sub
- Agora volte ao Visual Basic e cole o código que você copiou. Ficou mais ou menos assim:
- Agora feche o editor (só clicar no “X” em cima da tela…)
- Agora, que você já está novamente na tela do Excel, pressione Alt+F8. Vai aparecer esta janela para você executar a macro. Selecione ela com um clique e clique em Executar…
- A macro “gerou” esta pequena caixa de seleção, onde você irá agora selecionar o intervalo de origem, ou seja, o que deseja copiar. Não precisa clicar no campo da caixa, é só clicar direto no intervalo com o mouse e arrastar, como faria normalmente no Excel:
- Agora apareceu mais uma caixa de seleção, que pede para você selecionar o intervalor de destino, ou seja, intervalo que você irá colar os valores…
- Veja que maravilha o resultado final:
- A macro verifica também se os intervalos de origem e destino estão com a mesma quantidade de colunas e/ou linhas. Se estiverem diferentes, ou seja, se você selecionou mais colunas/linhas a mais do que deveria. Se isso ocorrer aparecerá esta mensagem:
- Agora volte ao editor do Visual Basic, digitando Alt+F11. Selecione na janela da esquerda o módulo que você criou e clique em Remover:
Clique e “Não”…
Feche novamente o Editor e salve a planilha se desejar.
A propósito, nada impede de você salvar a planilha sem excluir a macro, talvez você queira guardar para referência futura. Neste caso, se tentar salvar vai aparecer esta mensagem:
Mas basta clicar em “ Não”, escolher o local que deseja salvar e trocar o tipo de arquivo para este…
E agora é só salvar.
Fácil não é? Dá um pouco mais de trabalho, mas esta é a solução ideal para quando o primeiro caso não atende ou se você já tem algum tipo de automatização na planilha e deseja incrementar ou complementar com isso.
CLIQUE AQUI PARA BAIXAR A PLANILHA DE EXEMPLO COM A MACRO.
Espero que tenha ajudado você a economizar seu tempo. Grande abraço!
INCRIVEL
CurtirCurtir
Só para fins de ajudar os amigos sofrendo com as planilhas do excel, tentei todas as soluções do Cristiano, mas no meu caso não resolveu, então transferi os dados para uma planilha do Google Drive e magicamente, ao filtrar copiar e colar, ele considerou apenas as células visíveis.
CurtirCurtir
Cristiano somente espetacular. Muito bom mesmo!!
CurtirCurtir
Obrigado Cristiano. Estava perdendo muito tempo pois esquecia que ao colar em filtrado o Excel leva em consideração as linhas ocultas, e como você mesmo mencionou, mas…
CurtirCurtir
Ajudou muito. Muito obrigada para compartilhar!
CurtirCurtir
Excelente.
Parabéns e muito obrigado por esta partilha.
CurtirCurtir
Estou de home office e trabalho 7 dias por semana rsrsrs. E você me ajudou demais com as dicas acima. Agora, acho que posso descansar pelo menos aos domingos. Gratidão.
CurtirCurtir
Muito Obrigado!!!!!!!!!!!!!!!
CurtirCurtir
Boa tarde, preciso de ajuda para colar dados filtrados de outra planilha em uma planilha com filtro também, podem me ajudar?
CurtirCurtir
Aqui não funcionou mesmo conferindo a quantidade de linhas… Dá o erro que você citou.. Mas é a mesma quantidade de linhas.
CurtirCurtir
Muito obrigado, mestre!! Me ajudou d++
CurtirCurtir
Era tudo que eu queria! mt top de vdd
CurtirCurtir
Bom dia Cristiano.. apareceu m erro no final da macro quando executei por aqui… sabe como resolver?
If DestCell.EntireRow.RowHeight > 0 Then
‘Verifica se o valor na célula de destino não é vazio…
If SrcCell.Value “” Then <– ERRO ESTÁ AQUI
DestCell.Value = SrcCell.Value
End If
CurtirCurtir
Muito bom, deu certo.
Obrigado
CurtirCurtir
Valeu Cristiano, resolveu minha vida kkk estava aqui quebrando cabeça.
CurtirCurtir
Ajudou demais! Muito obrigado pela dica!
CurtirCurtir
sensacional, me ajudou bastante! o método1já me salvou
CurtirCurtir
Top top!
obrigada
CurtirCurtir
Muito borigado mandou bem
CurtirCurtir
Muito obrigado! O método do Crtl + ENTER juntamente com a seleção Especial foi sensacional!
CurtirCurtir
Valeu Cristiano, muito bom o conteúdo. Também escrevi um código em VBA que, na minha opinião, ficou um pouco mais simples de entender. Segue ele para quem quiser usar:
Option Explicit
‘—————————————————-
‘Código Criado por Carlos Costa
‘
‘cac.mec@gmail.com
‘—————————————————-
Sub CopiaEColaComFiltro()
Dim Origem As Range ‘Objeto Range que aboserverá os valores de origem
Dim Destino As Range ‘Objeto Range que absorverá os valores de destino
Dim OrigemLinhas As Long, DestinoLinhas As Long ‘Variável que conta as linhas e colunas da seleção de origem
Dim OrigemColunas As Long, DestinoCOlunas As Long ‘Variável que conta as linhas e colunas da seleção de destino
Dim CelCopiada As Range ‘Celula individual do intervalo de Origem
Dim CelColada As Range ‘Celula individual do intervalo de Destino
Dim i As Long ‘indexador de linha do vetor que transfere os valores da origem para o destino
Dim j As Long ‘indexador de coluna do vetor que transfere os valores da origem para o destino
Dim Vetor() As Variant ‘vetor que transfere os valores da origem para o destino
‘ Seleciona os intervalos de origem e destino dos dados
On Error Resume Next
Set Origem = Application.InputBox(“Selecione o intervalo de origem:”, Type:=8)
On Error GoTo 0
If Origem Is Nothing Then Exit Sub
On Error Resume Next
Set Destino = Application.InputBox(“Selecione o intervaloo de destino:”, Type:=8)
On Error GoTo 0
If Destino Is Nothing Then Exit Sub
‘Verifica se ambos os dados tem o mesmo tamanho
OrigemLinhas = Origem.Rows.Count
DestinoLinhas = Destino.Rows.Count
OrigemColunas = Origem.Columns.Count
DestinoCOlunas = Destino.Columns.Count
If OrigemLinhas DestinoLinhas Or OrigemColunas DestinoCOlunas Then
MsgBox “Os intervalos de origem e destino devem ser do mesmo tamanho”
Exit Sub
End If
ReDim Vetor(1 To OrigemLinhas, 1 To OrigemColunas) ‘Redimensiona o vetor para o tamanho da seleção
i = 1
j = 1
Set Origem = Origem.SpecialCells(xlCellTypeVisible) ‘Configura apenas as células visíveis da seleção
Set Destino = Destino.SpecialCells(xlCellTypeVisible)
‘Armazena o valor de cada celula visível da seleção no vetor de transferência
For Each CelCopiada In Origem.Cells
Vetor(i, j) = CelCopiada.Value
If i < OrigemLinhas Then
i = i + 1
ElseIf j < OrigemColunas Then
j = j + 1
End If
Next CelCopiada
i = 1
j = 1
'Transfere o valor do vetor de transferência para cada célula de destino
For Each CelColada In Destino.Cells
CelColada.Value = Vetor(i, j)
If i < OrigemLinhas Then
i = i + 1
ElseIf j < OrigemColunas Then
j = j + 1
End If
Next CelColada
End Sub
CurtirCurtir
MANOOOOOO.
VC MERECE UM BEIJO !!!
ACABOU DE ME SALVAR DE TER QUE DIGITAR 14K DE LINHAS NUN DOMINGO AS 21H QUASE ….
OBRIGADO !
CurtirCurtir
Obrigada, funcionou!
CurtirCurtir
Funcionou muito bem.. Parabéns !!!
CurtirCurtir
Deu muito certo! Parabéns pelo conteúdo!
CurtirCurtir
PQP, ERA TUDO O QUE QUERIA, SEMPRE SOFRI COM ISSO E NUNCA HAVIA ACHADO UMA FORMA TAO SIMPLES, SALVOOOOUU.
CurtirCurtir
Não precisa de Macro. Após realizar a inclusão das formulas e colar das células visíveis, é só retirar o filtro, copiar a coluna inteira, e colar somente valor em toda coluna. Os campos que estiverem com formula irá restar apenas valor.
CurtirCurtir
Sensacional! Salvou o dia!
CurtirCurtir
Essa macro foi ótima. Parabéns e obrigado.
CurtirCurtir
Muito obrigada!!!!! Estava quebrando a cabeça pra fazer isso! E pensando: O Excel é tão inteligente! Pq não cola em células visíveis! Gratidão!!!
CurtirCurtir
Tenho um problema quanto a isso, no item 12 do seu tutorial, é justamente o que eu gostaria de fazer, exemplo, passar os dados de uma coluna com 1.000 células para uma que está filtrada com 1.000 visíveis mas tem outras 1.000 ocultas, existe algum macro que faça isso? Grato desde já. (seleção especial não deu)
CurtirCurtir
SENSACIONAL… Parabéns pela dedicação e explicação minuciosa, referencias…. você até mesmo deixou sua planilha de exemplo no final, como prêmio pra quem leu tudo… (teria me polpado mais se tivesse ela no inicio SEM A MACRO…porque tive que reproduzi-la toda maunalmente no excel para aprender ahhah… mas ta valendo excelente)
show de bola!
é disso que o mundo precisa! hahah
CurtirCurtir
Curti muito a forma de explicar!
CurtirCurtir
Valeu Cristiano!! Funcionou muito bem!! Obrigada por compartilhar
CurtirCurtir