Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Application.OnTime e visualizzazione a tempo di UserForm

99 views
Skip to first unread message

Ciuffo Rosso

unread,
Jul 12, 2007, 5:20:24 AM7/12/07
to
Buongiorno NG,

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

Norman Jones

unread,
Jul 12, 2007, 8:13:12 AM7/12/07
to
Ciao Ciuffo Roso,

'---------------

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


Ciuffo Rosso

unread,
Jul 12, 2007, 12:16:53 PM7/12/07
to
On 12 Lug, 14:13, "Norman Jones" <normanjo...@whereforartthou.com>
wrote:

> 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

Norman Jones

unread,
Jul 12, 2007, 12:30:57 PM7/12/07
to
Ciao Ciuffo Rosso,

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.

Norman Jones

unread,
Jul 12, 2007, 12:50:26 PM7/12/07
to
> In questo caso, si deve permettere il sitema
> operativo

===>

In questo caso, si deve permettere che il sistema
operativo ripristini lo schermo

0 new messages