[Excel] Macro para copiar células não vazias de uma coluna e colar em outra coluna - Microsoft Office - Clube do Hardware
Macro para copiar células não vazias de uma coluna e colar em outra coluna
Por FaustoJr, 23 de setembro em Microsoft Office
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
Charley Rocha 3
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:
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.
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
Bom dia Fausto. Agora eu acho que entendi. Segue o código que você deve aplicar ao botão da sua planilha:
With ThisWorkbook.Worksheets("Planilha1")
'Desbloqueia a planilha'
'Conta quantas células existem na primeira coluna'
'e assim define quantas vezes deve repetir a rotina'
Do While .Cells(contador, 1).Text <> ""
'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
If .Cells(i, 2).HasFormula = False Then 'Limpa as células da coluna B sem fórmulas'
.Cells(i, 2).ClearContents
If .Cells(i, 4).HasFormula = False Then 'Limpa as células da coluna D sem fórmulas'
.Cells(i, 4).ClearContents
'Bloqueia a planilha'
Eu tentei deixar o código bem explicado para te ajudar nos seus estudos.
Por favor me avise se funcionou.
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!!!
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")
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
MsgBox ("Operação Realizada com sucesso")
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.