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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top