Exibindo uma barra de progresso numa macro VBA

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.

(Se você não sabe como fazer isso, leia isto)

 
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 e ficar sempre atualizado das novidades do site, ok.
Abraço.

13 comentários em “Exibindo uma barra de progresso numa macro VBA”

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

    Responder
    • 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ç

      Responder
  2. 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.

    Responder
    • 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ç

      Responder
  3. 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…

    Responder
  4. 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!!

    Responder

Deixe um comentário