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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top