Então pessoal… Depois de um tempo sem escrever um novo artigo aqui no site, volto hoje publicando uma dica fácil e extremamente útil para aquelas funções que demandam um tempo maior de execução, tornando necessário que o sistema nos informe o andamento do processo.
Geralmente quando nossa macro vai percorrer milhares de linhas em nossa planilha, ou acessar diversos comandos para fazer inúmeras atividades, precisamos, quase que, obrigatoriamente, exibir o status do processo: o que a macro está fazendo; quanto falta para terminar; se está travado ou processando ainda.
São muitos os motivos. E para resolver isso, nada melhor que informar o percentual de execução na barra de status do próprio Excel. Algo do tipo: Aguarde… 38% concluído.
Vejamos como podemos criar um contador para as tarefas de nossa macro
Para começar a criar a macro vba em excel, você precisa acessar o ambiente de programação em vba (visual basic for applications).
Use o atalho ALT+F11 e insira um módulo.
Vou sugerir um exemplo simples de uso e como podemos desenvolver o nosso código.
Digamos que eu tenha uma planilha com milhares de linhas de registro, um cadastro de clientes ou lista telefônica, por exemplo. Vamos supor que eu precise percorrer toda a minha lista e executar alguma ação, do tipo enviar um email, copiar algum registro específico, adicionar alguma informação por linha, enfim, qualquer coisa que a sua aplicação demande.
Neste exemplo, vou apenas inserir uma mensagem na célula adjacente a cada registro. Veja:
Sub BarraDeProgresso()
Dim i As Long
Dim iUltimaLinha As Long
Dim sStatusProcesso As String
iUltimaLinha = ActiveSheet.Range("A1").End(xlDown).Row
sStatusProcesso = "Aguarde... O sistema está processando as informações. "
Application.StatusBar = sStatusProcesso
For i = 2 To iUltimaLinha
Application.StatusBar = sStatusProcesso & Format(i / iUltimaLinha, "0.0%") & " Concluído"
' O código da sua macro vai aqui
Call MinhaMacro(ActiveSheet.Cells(i, 1))
Next
Application.StatusBar = False
MsgBox "Processo concluído.", vbInformation, "Excel do Seu Jeito"
End Sub
Private Sub MinhaMacro(ByVal rCell As Range)
With rCell
Select Case CInt(Left(.Offset(0, 1).Value, 1))
Case 7, 8, 9
.Offset(0, 2).Value = "Oi, " & .Value & ". Este número de telefone parece ser um celular!"
Case Else
.Offset(0, 2).Value = "Oi, " & .Value
End Select
End With
End Sub
No exemplo acima, ao percorrer cada linha do catálogo de telefones, a rotina verifica se o primeiro dígito do número telefônico corresponde a um padrão de celular e escreve uma mensagem naquela linha correspondente.
O comando Application.StatusBar escreve na barra de progresso a informação do andamento do processo definida por você dentro da sua rotina. Para finalizar sua escrita na barra de status do Excel, ou seja, no fim do processo, defina Application.StatusBar=False.
O laço For…Next que utilizamos, serve para lermos todos os registros da tabela. Dentro deste loop, devemos escrever na barra de status o percentual de execução da macro. Podemos fazer isto dividindo a posição atual pelo total de linhas e formatá-la como percentual, como mostrado no código acima.
Desta maneira, o usuário terá conhecimento do andamento do processo.
Isto foi apenas um exemplo, e você pode criar suas próprias macros em excel, de acordo com a necessidade do seu projeto.
Espero que tenham gostado. Em breve publico mais dicas excel para vocês.
Deixo aqui um convite para Follow @exceldoseujeitoe ficar sempre atualizado das novidades do site, ok.
Abraço.
Olá, Reinaldo, bom dia,
minha dúvida é como posso mostrar o conteúdo de uma célula na statusbar no Excel? Ex. Coloco meu nome numa célula e após o Enter a statusbar exibe este conteúdo.
Felipe,
O comando a ser utilizado é:
Application.StatusBar = “Texto a ser exibido”
Basta você definir quando este comando será chamado. Veja um exemplo que será invocado quando o conteúdo da célula A1 da planilha Plan1 for modificado.
Coloque este código no módulo da Plan1.
Private Sub Worksheet_Change(ByVal Target As Range)
With Target
If .Address = "$A$1" Then
Application.StatusBar = .Value
If .Value = "" Then Application.StatusBar = False
End If
End With
End Sub
Abç
Como faço para que numa planilha, por exemplo com 30 linhas, eu possa com uma macro definir numa célula, por exemplo A2 o número de linhas que eu queira apagar. Por exemplo tenho trinta linhas e na célula A2 coloco 10 e a macro elimina as 10 linhas. Obrigado.
Então Sacramento.
Supondo que você já tenha sua macro de exclusão de linhas, vou dar um exemplo utilizando um laço FOR..NEXT
Sub Exclusao()
Dim i As Long
Dim iQuantidadeLinhas As Long
Dim iLinhaInicial As Long
Dim iLinhaFinal As Long
iQuantidadeLinhas = ActiveSheet.Range(“A2”).Value
iLinhaInicial = 3
iLinhaFinal = iLinhaInicial + iQuantidadeLinhas – 1
For i = iLinhaFinal To iLinhaInicial Step -1
ActiveSheet.Cells(i, 1).EntireRow.Delete
Next i
End Sub
O loop tem que começar das linhas mais abaixo para as primeiras, ok. Porque se fizermos ao contrário, quando, por exemplo, excluírmos a linha 1, a linha 2 será a nova linha 1 e nossa macro estará programada para excluir a linha 2, ou seja, a próxima linha no loop. Com isso, o conteúdo da linha 2 não seria excluído.
Faça um teste e você perceberá a diferença.
Perceba que para fazer um loop inverso, você precisa usar o comando Step -1.
Abç
Brother… blz…
sabe de alguma forma de fazer uma barra de progresso, para uma macro.
Tenho uma planilha que extrai informações de outra planilha, e gostaria de colocar uma barra de progresso enquanto esta ocorrendo a execução dessas linhas e codigos…. se souber de algo e puder me mandar por email…
Ja tentei varias mais nada ainda….
Valeu…
Messias,
Já baixou o arquivo de exemplo que postei neste artigo?
É só adaptar em sua macro.
Abç
Olá Reinaldo, muito obrigado por compartilhar este conhecimento. Muito legal. Você sabe me dizer qual adaptação eu teria que fazer neste código para mostrar este status em uma caixa tipo msgbox?! Pq eu acho que a barra de status fica meio escondida. Vlw, abraço!!
Veja aqui:
https://www.exceldoseujeito.com.br/2012/01/24/exibindo-uma-barra-de-progresso-parte-2/