un paio di giorni fa, nel thread "Macro *a tempo* e contemporaneo
utilizzo di Excel".
Mauro e Norman mi hanno iniziato al'OnTime method.
Questo mi ha permesso, pur nel poco tempo che purtroppo riesco a
dedicare al VBA, di risolvere molti problemi e andare avanti nello
sviluppo del mio foglio. (Grazie Chip Pearson!)
Adesso però ho un nuovo problema che non so bene come risolvere:
l'applicazione chiede periodicamente di attivare una certa UserForm,
di tenerla su per 2 sec quindi di chiuderla.
Ora:
SE la proprietà ShowModal della UserForm è settata a FALSE ->
la cosa funziona ma quando la UserForm viene caricata non si vede
*dentro* (è tutta bianca)
SE la proprietà ShowModal della UserForm è settata a TRUE ->
la UserForm viene caricata bene (ossia si vede lo sfondo e le labels
impostate), però non si chiude più a meno di non cliccare sulla X.
Commenti?
Ciao!
CR
==========================================================
Qui il codice - tutto nel Modulo1 - per gli aficionados :)
Option Explicit
Option Base 1
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Public RunWhen As Double
Public Counter As Integer
Public Const cRunIntervalSeconds = 5
Public Const cRunWhat = "Modulo1.The_Sub"
'NOTA
'Nel Foglio1 ho messo un ToggleButton che attiva/disattiva il timer
Sub StartTimer()
RunWhen = Now + TimeSerial(0, 0, cRunIntervalSeconds)
Application.OnTime earliesttime:=RunWhen, procedure:=cRunWhat,
schedule:=True
End Sub
Sub StopTimer()
On Error Resume Next
Application.OnTime earliesttime:=RunWhen, procedure:=cRunWhat,
schedule:=False
End Sub
Sub The_Sub()
Dim f As UserForm1
Set f = New UserForm1
'NOTA
'Nella Form, solo per motivi di debug, c'è un label
'che dice: "Questa forma si è già caricata Counter volte"
Counter = Counter + 1
f.Lbl2.Caption = Counter
f.Show
Sleep 2000 'Tiene il messaggio attivo per 2s
Unload f
Modulo1.StartTimer
End Sub
'---------------
Ora:
Commenti?
Ciao!
CR
Sub The_Sub()
End Sub
'----------------
Vedi l'help di VBA per la funzione DoEvents
e prova la seguente versione della tua procedura
principale:
'=============>>
Public Sub The_Sub()
Counter = Counter + 1
With UserForm1
.Lbl2.Caption = Counter
.Show vbModal = False
DoEvents
End With
Sleep 2000
Unload UserForm1
StartTimer
End Sub
'<<=============
---
Regards,
Norman
Microsoft Excel MVP
> Ciao Ciuffo Roso,
> Vedi l'help di VBA per la funzione DoEvents
> e prova la seguente versione della tua procedura
> principale:
>
> '=============>>
> Public Sub The_Sub()
> Counter = Counter + 1
> With UserForm1
> .Lbl2.Caption = Counter
> .Show vbModal = False
> DoEvents
> End With
> Sleep 2000
> Unload UserForm1
> StartTimer
> End Sub
> '<<=============
>
> ---
> Regards,
> Norman
> Microsoft Excel MVP
Grazie Norman,
naturalmente il tuo suggerimento works. :)
Il punto sta proprio nell'utilizzo della funzione DoEvents; se, nel
codice, provo a commentare questo comando si torna nella situazione di
UserForm che compare negli intervalli prestabiliti ma non è
visualizzata correttamente (sfondo bianco).
Nell'Help leggo:
Funzione DoEvents -> Sospende l'esecuzione in modo che il sistema
operativo possa elaborare altri eventi.
Ora, non voglio abusare della tua gentilezza (so anche che l'Italiano,
che pure scrivi discretamente, non è la tua lingua), ma cosa significa
questo, in pratica?
Perchè c'è bisogno di *trasferire* il controllo al sistema operativo?
Ciao!
CR
PS: Non sentirti obbligato a rispondere. Mi hai già risolto un bel
dilema e va di gran lusso anche così. :P
In questo caso, si deve permettere il sitema
operativo a ripristinare lo schermo e pertanto,
si utilizza la funzione suggerita da me, cioe'
DoEvents.
Utilizzando le Userform - particolarmente in
congiunzione con OnTime, e' spesso necessario
utilizzare la funzione - spesso piu' di una volta in
una procedura. Talvalota e' anche utile il metodo
Repaint.
In inglese c'e' una espressione: Suck and see!
( circa: prova e vedi!)
In effetti, quando hai una problema con la
vizualizzazione di una Userfoem, prova DoEvents,
Repaint, o Do Events e Repaint.
===>
In questo caso, si deve permettere che il sistema
operativo ripristini lo schermo