Come posso creare una finestra di dialogo di stato in Excel
Domanda
Ho creato un generatore di report di database in Excel.Sto cercando di creare una finestra di dialogo che visualizzi le informazioni sullo stato durante l'esecuzione del programma.
Quando genero il report, anche se viene visualizzata la finestra di dialogo, non riesco ad aggiornare/aggiornare le informazioni visualizzate.Nella maggior parte dei casi la finestra di dialogo viene visualizzata solo parzialmente.Ho provato a utilizzare il metodo .repaint, ma ottengo sempre gli stessi risultati.Vedo solo la finestra di dialogo completa dopo la generazione del report.
Soluzione
Il codice seguente funziona bene quando si eseguono azioni in Excel (XP o successivo).
Per le azioni che si svolgono all'esterno di Excel, ad esempio la connessione a un database e il recupero dei dati, la cosa migliore offerta è l'opportunità di mostrare finestre di dialogo prima e dopo l'azione (ad es. "Ricevere dati", "Ho ricevuto i dati")
Crea un modulo chiamato "frmStato", inserisci un'etichetta sul modulo chiamato "Etichetta1".
Imposta la proprietà del modulo 'ShowModal' = falso, ciò consente l'esecuzione del codice mentre viene visualizzato il modulo.
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
Altri suggerimenti
Prova ad aggiungere a DoEvents chiama nel tuo loop.Ciò dovrebbe consentire al modulo di ridipingere e accettare altre richieste.
Ho utilizzato la barra di stato di Excel (in basso a sinistra della finestra) per visualizzare le informazioni sull'avanzamento di un'applicazione simile che ho sviluppato in passato.
Funziona molto bene se vuoi solo visualizzare aggiornamenti testuali sullo stato di avanzamento ed evita del tutto la necessità di una finestra di dialogo di aggiornamento.
Ok @JonnyGold, ecco un esempio del tipo di cose che ho usato...
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
Spero che questo ti aiuti!
Inserisci un foglio vuoto nella cartella di lavoro Rinomina il foglio, ad es."informazione"
Sheets("information").Select
Range("C3").Select
ActiveCell.FormulaR1C1 = "Updating Records"
Application.ScreenUpdating = False
Application.Wait Now + TimeValue("00:00:02")
Continua Macro
Sheets("information").Select
Range("C3").Select
Application.ScreenUpdating = True
ActiveCell.FormulaR1C1 = "Preparing Information"
Application.ScreenUpdating = False
Application.Wait Now + TimeValue("00:00:02")
Continua Macro
Ecc. In alternativa selezionare una cella vuota da qualche parte sul foglio esistente invece di inserire un nuovo foglio
Range("C3").Select
ActiveCell.FormulaR1C1 = "Updating Records"
Application.ScreenUpdating = False
Application.Wait Now + TimeValue("00:00:02")
Eccetera
Anche la finestra di dialogo è in esecuzione sullo stesso thread dell'interfaccia utente.Quindi, è troppo occupato per ridipingersi.Non sono sicuro che VBA abbia buone capacità multi-threading.