COLAR VALORES SOMENTE EM CÉLULAS FILTRADAS (OU VISÍVEIS)

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:

Img1.png

Filtramos apenas pela coluna C (“Em estoque” = Sim):

Img2.png

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…

Img3.png     Img4.jpg

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:

  1. Já com o filtro aplicado, selecione o intervalo que você quer preencher com os dados que serão copiados:

Img5.png

  1. Pressione a tecla F5 no teclado, na janela que aparece clique em “Especial…”

Img6.png

  1. Clique em “Somente células visíveis” e dê OK:

Img7.png

  1. A seleção vai ficar assim (vai aparecer a primeira célula da seleção com bordas verdes finas e o restante em cinza:

Img8.png

  1. 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!.

Img9.png

  1. Pressione simultaneamente Ctrl + ENTER e veja o que acontece:

Img10.png

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:

Img11.png

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…

Img12.png

Agora vamos selecionar B2 ou B2:B12, clicar com o botão direito e tentar colar especial, para tirar as fórmulas…

Img13.png

Que pena! O Excel será mais uma vez amável com você e dirá isso:

Img14.png

E se tentar de outro jeito, dirá isso:

Img15.png

E se reclamar, tomará mais isso:

Img16.png

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:

  1. 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:

Img17.png

  1. 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”:

Img18.png

  1. Agora vai aparecer uma tela em branco:

Img19.png

  1. 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
  1. Agora volte ao Visual Basic e cole o código que você copiou. Ficou mais ou menos assim:

Img20.png

  1. Agora feche o editor (só clicar no “X” em cima da tela…)

Img21.png

  1. 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…

Img22.png

  1. 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:

Img23.png

  1. 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…

Img24.png

  1. Veja que maravilha o resultado final:

Img25.png

  1. 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:

Img26.png

  1. 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:

Img27.png

Clique e “Não”…

Img28.png

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:

Img29.png

Mas basta clicar em “ Não”, escolher o local que deseja salvar e trocar o tipo de arquivo para este…

Img30.png

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!

 

 

Esse post foi publicado em Sem categoria e marcado , , , , , , , , , , , . Guardar link permanente.

34 respostas para COLAR VALORES SOMENTE EM CÉLULAS FILTRADAS (OU VISÍVEIS)

  1. Anônimo disse:

    INCRIVEL

    Curtir

  2. Anônimo disse:

    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.

    Curtir

  3. Anônimo disse:

    Cristiano somente espetacular. Muito bom mesmo!!

    Curtir

  4. lcquerido disse:

    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…

    Curtir

  5. Danielle disse:

    Ajudou muito. Muito obrigada para compartilhar!

    Curtir

  6. João Morais disse:

    Excelente.
    Parabéns e muito obrigado por esta partilha.

    Curtir

  7. Luiz Valério disse:

    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.

    Curtir

  8. Lucas Vinicius da Silva disse:

    Muito Obrigado!!!!!!!!!!!!!!!

    Curtir

  9. Fernanda Maza disse:

    Boa tarde, preciso de ajuda para colar dados filtrados de outra planilha em uma planilha com filtro também, podem me ajudar?

    Curtir

  10. Mayque Souza disse:

    Aqui não funcionou mesmo conferindo a quantidade de linhas… Dá o erro que você citou.. Mas é a mesma quantidade de linhas.

    Curtir

  11. Douglas Nobre Batista disse:

    Muito obrigado, mestre!! Me ajudou d++

    Curtir

  12. hellenfmenezes disse:

    Era tudo que eu queria! mt top de vdd

    Curtir

  13. Antonio Augusto Moreira disse:

    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

    Curtir

  14. Anônimo disse:

    Muito bom, deu certo.
    Obrigado

    Curtir

  15. Anônimo disse:

    Valeu Cristiano, resolveu minha vida kkk estava aqui quebrando cabeça.

    Curtir

  16. Anônimo disse:

    Ajudou demais! Muito obrigado pela dica!

    Curtir

  17. Anônimo disse:

    sensacional, me ajudou bastante! o método1já me salvou

    Curtir

  18. Anônimo disse:

    Top top!
    obrigada

    Curtir

  19. vitur disse:

    Muito borigado mandou bem

    Curtir

  20. Anônimo disse:

    Muito obrigado! O método do Crtl + ENTER juntamente com a seleção Especial foi sensacional!

    Curtir

  21. Carlos Costa disse:

    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

    Curtir

  22. jouberte jr disse:

    MANOOOOOO.
    VC MERECE UM BEIJO !!!
    ACABOU DE ME SALVAR DE TER QUE DIGITAR 14K DE LINHAS NUN DOMINGO AS 21H QUASE ….

    OBRIGADO !

    Curtir

  23. Fernanda disse:

    Obrigada, funcionou!

    Curtir

  24. Anônimo disse:

    Funcionou muito bem.. Parabéns !!!

    Curtir

  25. Gabriela Boechat disse:

    Deu muito certo! Parabéns pelo conteúdo!

    Curtir

  26. Anônimo disse:

    PQP, ERA TUDO O QUE QUERIA, SEMPRE SOFRI COM ISSO E NUNCA HAVIA ACHADO UMA FORMA TAO SIMPLES, SALVOOOOUU.

    Curtir

  27. Anonimo disse:

    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.

    Curtir

  28. Anônimo disse:

    Sensacional! Salvou o dia!

    Curtir

  29. Anônimo disse:

    Essa macro foi ótima. Parabéns e obrigado.

    Curtir

  30. Melissa Rolim Mooser disse:

    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!!!

    Curtir

  31. euz disse:

    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)

    Curtir

  32. luan disse:

    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

    Curtir

  33. Tammy disse:

    Curti muito a forma de explicar!

    Curtir

  34. Anônimo disse:

    Valeu Cristiano!! Funcionou muito bem!! Obrigada por compartilhar

    Curtir

Deixe um comentário