Ir ao conteúdo
  • Cadastre-se
FaustoJr

Excel Macro para copiar células não vazias de uma coluna e colar em outra coluna

Recommended Posts

Olá, 

estou elaborando uma planilha e como não tenho muito conhecimento em programação, gostaria de uma ajuda. Esta planilha tem algumas células protegidas e eu preciso de uma macro associada a um botão para fazer o seguinte processo:

 

Desbloquear a tabela;

Apagar somente os valores e não as fórmulas das colunas "B" e "D";

Copiar somente os valores e não as fórmulas das células não vazias da coluna "F" (que se refere a situação atual);

Colar esses valores na coluna "E" (que se refere a situação anterior) sobrepondo-os aos valores antigos;

Bloquear a tabela.

 

Segue em anexo a planilha. Obrigado

 

Planilha1.xlsx

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia Fausto. Estou trabalhando pra te ajudara aqui, mas fiquei em dúvida com um dos seus requerimentos:

 

15 horas atrás, FaustoJr disse:

Apagar somente os valores e não as fórmulas das colunas "B" e "D";

 

Se você apagar os valores, mas não apagar as fórmulas, as células automaticamente assumirão algum valor por causa da fórmula que tem nela... Exemplo: se uma célula tem a fórmula =SOMA(A1,A2), se eu limpar o valor e deixar a fórmula, vai aparecer o valor da soma nela de novo. E se eu limpar as células A1 e A2 ela assumirá o valor zero automaticamente também...

 

Por favor esclareça este ponto para que eu possa te ajudar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa noite Charley. Desculpe por não me fazer entender muito bem, mas na verdade o que eu estou querendo é que quando eu atualizar a planilha os dados da colunas "B" e "D" sejam apagados e que caso eu resolva colocar alguma fórmula nas células destas colunas elas não sejam apagadas na próxima atualização. Então eu gostaria que quando eu pressionar um botão específico, a tabela fosse desbloqueada, os valores das colunas "B" e "D" fossem apagados, depois somente os valores das células não vazias da coluna "F" fossem copiados (sem copiar as fórmulas dessa coluna) e depois esses valores fossem colados nas células correspondentes da coluna "E" sobrepondo aos valores antigos desta coluna. E por fim, bloquear novamente a planilha. A planilha está em anexo. Obrigado

Planilha1.xlsx

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia Fausto. Agora eu acho que entendi. Segue o código que você deve aplicar ao botão da sua planilha:

 

Sub Atualiza()

With ThisWorkbook.Worksheets("Planilha1")

'Desbloqueia a planilha'
.Unprotect

'Conta quantas células existem na primeira coluna'
'e assim define quantas vezes deve repetir a rotina'
Dim contador As Integer
contador = 2
Do While .Cells(contador, 1).Text <> ""
    contador = contador + 1
Loop

'Varre as colunas B, D e F da linha 2 até a última linha preenchida'
For i = 2 To contador

    If .Cells(i, 6).Text <> "" Then     'Copia as células não-vazias da coluna F para a coluna E'
        .Cells(i, 5) = .Cells(i, 6).Value
    End If
    
    If .Cells(i, 2).HasFormula = False Then 'Limpa as células da coluna B sem fórmulas'
        .Cells(i, 2).ClearContents
    End If
    
    If .Cells(i, 4).HasFormula = False Then 'Limpa as células da coluna D sem fórmulas'
        .Cells(i, 4).ClearContents
    End If
    
    
Next

'Bloqueia a planilha'
.Protect

End With
End Sub

Eu tentei deixar o código bem explicado para te ajudar nos seus estudos.

 

Por favor me avise se funcionou.

 

Há braços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa noite Charley Rocha.

Você é o cara!!! Ficou perfeito; exatamente como eu queria. Muito Obrigado.

 

Sem querer abusar, mas aproveitando um pouco mais do seu conhecimento; esta planilha é para um bolão da mega sena entre os amigos de trabalho e em uma outra parte dela eu colocaria as dezenas apostadas da seguinte maneira (segue tabela em anexo):

 

Coluna "J" numerada de 1 a 60 a partir da célula "J5", onde o número 1 representa a primeira linha com até 8 dezenas (K5:R5); 

a célula "J6" representa a segunda linha com até 8 dezenas apostadas (K6:R6) e assim por diante até a célula "J64" onde tenho a última linha para apostas (K64:R64).

 

Desta forma, eu preciso de uma macro que faça o seguinte:

MsgBox para confirmar se realmente quer realizar este processo;

Colocar os números das células (K5:R5) em ordem crescente;

Depois colocar os números das célula (K6:R6) em ordem crescente e assim por diante até a última linha (K64:R64);

MsgBox: Operação realizada com sucesso.

 

Estou colocando a planilha em anexo e se puder me ajudar agradeço mais uma vez!!!

 

Planilha1.xlsx

Compartilhar este post


Link para o post
Compartilhar em outros sites

Que bom que deu certo, Fausto. Segue o código que você pediu:

 

Sub Reorganiza()

If MsgBox("Deseja mesmo reordenar?", vbYesNo) = vbYes Then
    
With ThisWorkbook.Sheets("Planilha1")
Dim buffer As Integer

For n = 1 To 8

    For j = 5 To 64

        For i = 11 To 17
    
            If .Cells(j, i) > .Cells(j, i + 1) Then
                
                buffer = .Cells(j, i)
                .Cells(j, i) = .Cells(j, i + 1)
                .Cells(j, i + 1) = buffer
                
            End If
        
        Next
    Next
Next

MsgBox ("Operação Realizada com sucesso")
    
End With

End If

End Sub

 

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa noite Charley Rocha, 

Era realmente isso, só que ainda preciso corrigir um detalhe. Nesta planilha posso registrar jogos da Mega Sena com 6, 7 e 8 dezenas, mas quando eu insiro somente 6 dezenas (no intervalo K5:P5, por exemplo) sobram duas células vazias (Q5 e R5). E quando eu aciono a macro para colocar em ordem crescente, as células K5 e L5 ficam vazias e as dezenas vão para o intervalo M5:R5. Eu gostaria que após a ação da macro as dezenas fossem ordenas a partir da primeira célula deixando as últimas vazias quando houver.

Obrigado mais uma vez

Compartilhar este post


Link para o post
Compartilhar em outros sites
Sub OrdenaLinhas()
 Dim a As Long
  For a = 5 To 64
   Cells(a, 11).Resize(, 8).Sort Key1:=Cells(a, 11), Order1:=xlAscending, Orientation:=xlLeftToRight
  Next a
End Sub

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×