Como faço para criar uma caixa de diálogo de status no Excel
Pergunta
Criei um gerador de relatórios de banco de dados no Excel.Estou tentando criar uma caixa de diálogo que exiba informações de status enquanto o programa é executado.
Quando gero o relatório, embora a caixa de diálogo apareça, não consigo atualizar/atualizar as informações que ele exibe.Na maioria das vezes, a caixa de diálogo aparece apenas parcialmente.Tentei usar o método .repaint, mas ainda obtive os mesmos resultados.Só vejo a caixa de diálogo completa após a geração do relatório.
Solução
O código abaixo funciona bem ao executar ações no Excel (XP ou posterior).
Para ações que ocorrem fora do Excel, por exemplo, conectar-se a um banco de dados e recuperar dados, o melhor que isso oferece é a oportunidade de mostrar caixas de diálogo antes e depois da ação (por exemplo, "Obtendo dados", "Tenho dados")
Crie um formulário chamado "frmStatus", coloque um rótulo no formulário chamado "Rótulo1".
Defina a propriedade do formulário 'ShowModal' = falso, isso permite que o código seja executado enquanto o formulário é exibido.
Sub ShowForm_DoSomething()
Load frmStatus
frmStatus.Label1.Caption = "Starting"
frmStatus.Show
frmStatus.Repaint
'Load the form and set text
frmStatus.Label1.Caption = "Doing something"
frmStatus.Repaint
'code here to perform an action
frmStatus.Label1.Caption = "Doing something else"
frmStatus.Repaint
'code here to perform an action
frmStatus.Label1.Caption = "Finished"
frmStatus.Repaint
Application.Wait (Now + TimeValue("0:00:01"))
frmStatus.Hide
Unload frmStatus
'hide and unload the form
End Sub
Outras dicas
Tente adicionar um DoEvents ligue em seu loop.Isso deve permitir que o formulário seja redesenhado e aceite outras solicitações.
Usei a barra de status do Excel (no canto inferior esquerdo da janela) para exibir informações de progresso de um aplicativo semelhante que desenvolvi no passado.
Funciona muito bem se você deseja apenas exibir atualizações textuais sobre o progresso e evita a necessidade de uma caixa de diálogo de atualização.
Ok @JonnyGold, aqui está um exemplo do tipo de coisa que usei...
Sub StatusBarExample()
Application.ScreenUpdating = False
' turns off screen updating
Application.DisplayStatusBar = True
' makes sure that the statusbar is visible
Application.StatusBar = "Please wait while performing task 1..."
' add some code for task 1 that replaces the next sentence
Application.Wait Now + TimeValue("00:00:02")
Application.StatusBar = "Please wait while performing task 2..."
' add some code for task 2 that replaces the next sentence
Application.Wait Now + TimeValue("00:00:02")
Application.StatusBar = False
' gives control of the statusbar back to the programme
End Sub
Espero que isto ajude!
Insira uma folha em branco na sua pasta de trabalho renomeie a folha, por exemplo."Informação"
Sheets("information").Select
Range("C3").Select
ActiveCell.FormulaR1C1 = "Updating Records"
Application.ScreenUpdating = False
Application.Wait Now + TimeValue("00:00:02")
Continuar Macro
Sheets("information").Select
Range("C3").Select
Application.ScreenUpdating = True
ActiveCell.FormulaR1C1 = "Preparing Information"
Application.ScreenUpdating = False
Application.Wait Now + TimeValue("00:00:02")
Continuar Macro
Etc. alternativamente, selecione uma célula em branco em algum lugar da folha existente em vez de inserir uma nova folha
Range("C3").Select
ActiveCell.FormulaR1C1 = "Updating Records"
Application.ScreenUpdating = False
Application.Wait Now + TimeValue("00:00:02")
Etc.
A caixa de diálogo também está em execução no mesmo thread de UI.Então, está muito ocupado para se repintar.Não tenho certeza se o VBA possui bons recursos multithreading.