Discussione:
Variabile a livello modulo e UserForm
(troppo vecchio per rispondere)
Ignazio
2004-11-17 09:01:11 UTC
Permalink
Ciao a tutti,
credevo di aver compreso il meccanismo che regola la "vita utile" delle
variabili fino quando mi è successa una cosa "strana": l'esecuzione di una
UserForm mi ha cancellato il contenuto di una variabile definita in un
modulo standard a livello di modulo.
Per riuscire a capirci qualcosa ho eseguito i seguenti test.

Nel Modulo1 ho inserito le seguenti istruzioni:
----
Dim Num As Integer

Sub IncrementaNum1()
Num = Num + 1
Range("A1") = Num
End Sub
----
Se ora lancio ripetutamente la routine IncrementaNum1 vedo nella cella A1
incrementarsi di una unità il valore corrente (e fin qui tutto ok).

Ho quindi creato una UserForm1 (priva di controlli e codice) e ho aggiunto
nel Modulo1 la seguente routine:
----
Sub IncrementaNum2()
Num = Num + 1
UserForm1.Show
Range("A1") = Num
End Sub
----
Se ora lancio ripetutamente la routine IncrementaNum2 e chiudo la UserForm1
vedo ancora nella cella A1 incrementarsi di una unità il valore corrente (e
fin qui ancora tutto ok).

Infine ho inserito nella UserForm1 una etichetta (Label1) e il seguente
codice:
----
Private Sub UserForm_Click()
Label1.Caption = 1
End Sub
----
Se ora lancio ripetutamente la routine IncrementaNum2 e chiudo la UserForm1
vedo nella cella A1 sempre 1!
E' normale questo?

Inoltre succede un'altra cosa altrettanto strana.
Se ora lancio per 3 volte la macro IncrementaNum1 nella cella A1 vedo
comparire il numero 3.
Se poi provo a lanciare 2 volte la macro IncrementaNum2, la prima volta
nella cella A1 mi compare 4, la seconda volta 1!

Qualcuno sa spiegarmi il perchè di tutto questo?
Come mai il contenuto della variabile Num viene cancellato quando eseguo la
routine IncrementaNum2?
--
Ciao
Ignazio
Rémi
2004-11-17 11:47:24 UTC
Permalink
Ciao,

ho provato, funziona bene. L'errore è altrove !
Non hai un evento Private Sub UserForm_Activate() o Private Sub
UserForm_Initialize() ?
O un' altra variabile "Num" in un evento userform ?
--
Alcuni esempi VBA Excel
http://remigueudelot.free.fr/

Spero di aver risposto bene alla tua domanda.
Rémi.
Post by Ignazio
----
Dim Num As Integer
Sub IncrementaNum1()
Num = Num + 1
Range("A1") = Num
End Sub
----
----
Sub IncrementaNum2()
Num = Num + 1
UserForm1.Show
Range("A1") = Num
End Sub
----
Infine ho inserito nella UserForm1 una etichetta (Label1) e il seguente
----
Private Sub UserForm_Click()
Label1.Caption = 1
End Sub
----
Ignazio
2004-11-17 15:14:41 UTC
Permalink
Post by Rémi
ho provato, funziona bene. L'errore è altrove !
Non hai un evento Private Sub UserForm_Activate() o Private Sub
UserForm_Initialize() ?
O un' altra variabile "Num" in un evento userform ?
No Rèmi, quello che ho è solo quello che ho detto.
Sono partito da una cartella vuota e ho seguito passo-passo le cose che ho
indicato nel primo post.
--
Ciao
Ignazio
Mauro Gamberini
2004-11-17 15:49:58 UTC
Permalink
Post by Ignazio
No Rèmi, quello che ho è solo quello che ho detto.
Sono partito da una cartella vuota e ho seguito passo-passo le cose che ho
indicato nel primo post.
Ho riscontrato la stessa cosa.
Sembra che con il click
sulla UserForm si azzeri la
variabile Num che ho provato
anche a dichiarare Public nel Modulo1

Utilizzando questo codice nella UserForm:

Private Sub UserForm_Click()
Label1.Caption = 1
End Sub


Private Sub UserForm_Initialize()
Num = Num + 1
End Sub

Mi trovo 2 tutte le volte in A1.

Maurizio? Rémi?
--
----------------------------
Mauro Gamberini
Ignazio
2004-11-17 16:01:36 UTC
Permalink
Post by Mauro Gamberini
Post by Ignazio
No Rèmi, quello che ho è solo quello che ho detto.
Sono partito da una cartella vuota e ho seguito passo-passo le cose che ho
indicato nel primo post.
Ho riscontrato la stessa cosa.
Sembra che con il click
sulla UserForm si azzeri la
variabile Num che ho provato
anche a dichiarare Public nel Modulo1
Ho fatto questa ulteriore prova.
Ho cancellato codice e controlli nella UserForm1 ma il problema permane (se
lancio ripetutamente la routine IncrementaNum2 in A1 vedo sempre 1).

Ho poi creato una nuova UserFrom2 e scritto la routine:
----
Sub IncrementaNum3()
Num = Num + 1
UserForm2.Show
Range("A1") = Num
End Sub
----
che lanciata più volte mi fa incrementare il valore della cella A1 di una
unità.
Mah, .... non ci capisco più niente.
--
Ciao
Ignazio
Rémi
2004-11-17 16:49:22 UTC
Permalink
Ciao,

Adesso, ho riprovato, e anche io mi fa l'errore.
Ho fatto com te Ignazio, ho aggiunto un userform2 e funziona.
Però se su questo userform metti un label, ... non funziona piu !

E un problema con l'evento "click" perche se metti

Private Sub UserForm_Click()
MsgBox (num)
Label1.Caption = "1"
End Sub

la scatola è vuota !
--
Alcuni esempi VBA Excel
http://remigueudelot.free.fr/

Spero di aver risposto bene alla tua domanda.
Rémi.
Ignazio
2004-11-17 17:09:14 UTC
Permalink
Post by Rémi
Ciao,
Adesso, ho riprovato, e anche io mi fa l'errore.
Ho fatto com te Ignazio, ho aggiunto un userform2 e funziona.
Però se su questo userform metti un label, ... non funziona piu !
E un problema con l'evento "click" perche se metti
Private Sub UserForm_Click()
MsgBox (num)
Label1.Caption = "1"
End Sub
la scatola è vuota !
Non credo che dipenda dall'evento Click.
Ho infatti notato che se subito dopo aver creato la UserForm non inserisco
nessun controllo e uso la seguente routine:
----
Private Sub UserForm_Click()
Range("B1") = Range("B1") + 1
End Sub
----
tutto funziona bene ... ma se successivamente inserisco un controllo il
problema ricomincia.
--
Ciao
Ignazio
Mauro Gamberini
2004-11-17 18:27:07 UTC
Permalink
[cut]

Ho messo debug.print ovunque.
Con il click Num si azzera.
Mha....
--
----------------------------
Mauro Gamberini
Maurizio Borrelli
2004-11-17 12:51:59 UTC
Permalink
Post by Ignazio
credevo di aver compreso il meccanismo che regola la "vita utile" delle
variabili fino quando mi è successa una cosa "strana": l'esecuzione di una
UserForm mi ha cancellato il contenuto di una variabile definita in un
modulo standard a livello di modulo.
Per riuscire a capirci qualcosa ho eseguito i seguenti test.
[...]

Ciao, Ignazio.

Fa' anche questo esperimento. Se in Excel non hai visibile la barra
degli strumenti "Visual Basic" visualizzala. Cosi`:

Strumenti > Personalizza
Barre degli strumenti
[v] Visual Basic
[ Chiudi ]

Poi clic sul pulsante:

Modalita` progettazione

poi di nuovo clic sullo stesso pulsante:

Esci da modalita` progettazione

Ora le variabili globali sono azzerate.

Che succede ora?

(Facci sapere se ed eventualmente come hai risolto. Grazie.)
--
Ciao :o)
Maurizio Borrelli, Microsoft MVP - Office Systems - Access
--------
?SPQR(C)
X
--------
Ignazio
2004-11-17 15:24:16 UTC
Permalink
Post by Maurizio Borrelli
Fa' anche questo esperimento. Se in Excel non hai visibile la barra
degli strumenti "Visual Basic" visualizzala.
Modalita` progettazione
Esci da modalita` progettazione
Ora le variabili globali sono azzerate.
Che succede ora?
Ho fatto come hai detto, ma continua a succedere il problema indicato prima
(ovviamente partendo dalle variabile Num azzerata)
E' come se l'uso della UserForm mi azzerasse la variabile Num.
Forse sbaglio qualcosa io nell'uso della UserForm?
Tieni comunque presente che le operazioni che compio sono solo quelle che ho
indicato nel primo post (come ho già detto il mio è un test e per questo
sono partito da una cartella vuota).
--
Ciao
Ignazio
Maurizio Borrelli
2004-11-17 17:50:02 UTC
Permalink
[...]
Post by Ignazio
Post by Maurizio Borrelli
Esci da modalita` progettazione
Ora le variabili globali sono azzerate.
Che succede ora?
Ho fatto come hai detto, ma continua a succedere il problema indicato
prima (ovviamente partendo dalle variabile Num azzerata)
E' come se l'uso della UserForm mi azzerasse la variabile Num.
Forse sbaglio qualcosa io nell'uso della UserForm?
Tieni comunque presente che le operazioni che compio sono solo quelle che
ho indicato nel primo post (come ho già detto il mio è un test e per
questo sono partito da una cartella vuota).
Ciao, Ignazio.

Non sono riuscito a riprodurre il problema con nessuna di queste
configurazioni:

- Win98 + XL97 SR-2
- Win2003 + XL2000 SP-3
- Win2003 + XL2002 SP-3
- Win2003 + XL2003 SP-1

Continuo a sospettare, fino a prova contraria ;-), che il problema
derivi da una errata sequenza delle operazioni di modifica del progetto.
Indico quella corretta cosi` puoi verificare eventuali discordanze con
quella seguita da te.

*Ogni volta* che si intende *modificare* il progetto Visual Basic --
aggiungere o togliere una virgola o 10.000 istruzioni e` lo stesso! -- *si
deve* (nota bene: non ho scritto "bisognerebbe" o "e` buona norma". Ho
scritto *si deve*) seguire la seguente procedura:

Esegui > Modalita` progettazione

poi si effettuano le modifiche, quindi:

Debug > Compila <NomeProgetto>

e, se la compilazione e` andata a buon fine:

Esegui > Esci da modalita` progettazione

Seguendo scrupolosamente queste indicazioni ottieni lo stesso problema?
--
Ciao :o)
Maurizio Borrelli, Microsoft MVP - Office Systems - Access
--------
?SPQR(C)
X
--------
Ignazio
2004-11-17 19:24:45 UTC
Permalink
Post by Maurizio Borrelli
Non sono riuscito a riprodurre il problema con nessuna di queste
- Win98 + XL97 SR-2
- Win2003 + XL2000 SP-3
- Win2003 + XL2002 SP-3
- Win2003 + XL2003 SP-1
Io sto usando:
- WinXp 2002 + XL2002
ma il problema l'ho riscontrato anche in:
- Win98 SE + XL2002 SP-2
Post by Maurizio Borrelli
Continuo a sospettare, fino a prova contraria ;-), che il problema
derivi da una errata sequenza delle operazioni di modifica del progetto.
Indico quella corretta cosi` puoi verificare eventuali discordanze con
quella seguita da te.
[cut]
Post by Maurizio Borrelli
Seguendo scrupolosamente queste indicazioni ottieni lo stesso problema?
Ho seguito alla lettera le indicazioni che mi hai dato (confesso di non
essere così scrupoloso nel posizionarmi in modalità progettazione quando
modifico il codice; non sapevo che fosse necessario).

Purtroppo il problema continua a verificarsi.

Potrebbe dipendere da un modo poco ortodosso di chiudere la UserForm (tieni
presente che la finestra la chiudo con il tasto [x] che trovo su a destra e
che non uso l'evento Terminate)?
--
Ciao
Ignazio
Maurizio Borrelli
2004-11-17 19:48:47 UTC
Permalink
Post by Ignazio
Post by Maurizio Borrelli
Non sono riuscito a riprodurre il problema con nessuna di queste
- Win98 + XL97 SR-2
- Win2003 + XL2000 SP-3
- Win2003 + XL2002 SP-3
- Win2003 + XL2003 SP-1
- WinXp 2002 + XL2002
- Win98 SE + XL2002 SP-2
Post by Maurizio Borrelli
Continuo a sospettare, fino a prova contraria ;-), che il problema
derivi da una errata sequenza delle operazioni di modifica del progetto.
Indico quella corretta cosi` puoi verificare eventuali discordanze con
quella seguita da te.
[...]
Post by Ignazio
Post by Maurizio Borrelli
Seguendo scrupolosamente queste indicazioni ottieni lo stesso problema?
Ho seguito alla lettera le indicazioni che mi hai dato (confesso di non
essere così scrupoloso nel posizionarmi in modalità progettazione quando
modifico il codice; non sapevo che fosse necessario).
Purtroppo il problema continua a verificarsi.
Potrebbe dipendere da un modo poco ortodosso di chiudere la UserForm (tieni
presente che la finestra la chiudo con il tasto [x] che trovo su a destra e
che non uso l'evento Terminate)?
Ciao, Ignazio.

Io ho copincollato il tuo codice. E chiudo lo UserForm come fai tu.

Possibile che il fatto che il tuo Excel 2002 (XP) non sia aggiornato
alla SP-3 sia significativo? Mah... Se vuoi prova ad aggiornare, poi facci
sapere se questo fa differenza.

Nel frattempo vedo se riesco a trovare fra le correzioni di SP-3 se c'e`
qualcosa che riguarda tale problema, e... continuiamo a ragionarci sopra.

Riguardo la necessita` di entrare ed uscire dalla modalita`
progettazione... beh... ho gia` detto tutto. :-) So perfettamente che la
stragrande maggioranza degli utenti non e` cosi` scrupolosa. Funziona come
per il backup, che finche` non si perdono dati non se ne comprende
l'importanza.
--
Ciao :o)
Maurizio Borrelli, Microsoft MVP - Office Systems - Access
--------
?SPQR(C)
X
--------
Mauro Gamberini
2004-11-18 09:13:15 UTC
Permalink
Possibile che il fatto che il tuo Excel 2002 (XP) non sia aggiornato
alla SP-3 sia significativo? Mah... Se vuoi prova ad aggiornare, poi facci
sapere se questo fa differenza.
*****************************************************
Ciao Maurizio, io ho Excel2003, aggiornato,
e ho provato in tutti i modi.

Ma al click sulla Form, la variabile
pubblica dichiarata sul Modulo si setta a 1.

A questo punto, per favore e se hai tempo,
dai l'esatta procedura che esegui tu,
in base al codice del post iniziale di Ignazio.

Grazie.
--
----------------------------
Mauro Gamberini
Ignazio
2004-11-18 09:39:47 UTC
Permalink
Post by Maurizio Borrelli
Possibile che il fatto che il tuo Excel 2002 (XP) non sia aggiornato
alla SP-3 sia significativo? Mah... Se vuoi prova ad aggiornare, poi facci
sapere se questo fa differenza.
Ho aggiornato Excel 2002 alla SP-3, ma il problema rimane.
Però a differenza di Rèmi e Mauro (che rilevano il problema all'uso
dell'evento Clik), sembra che a a me succede dopo aver inserito un
qualsiasi controllo nella UserForm (ho riprovato a seguire l'intera
procedura che indicavo nel primo post, questa volta senza inserire nella
UserForm neanche una riga di codice, e il problema continua a verificarsi).
--
Ciao
Ignazio
Tiziano Marmiroli
2004-11-19 09:58:31 UTC
Permalink
Post by Maurizio Borrelli
Non sono riuscito a riprodurre il problema con nessuna di queste
- Win98 + XL97 SR-2
- Win2003 + XL2000 SP-3
- Win2003 + XL2002 SP-3
- Win2003 + XL2003 SP-1
E io non sono riuscito con

- Win98 + XL97 SR-2
- Win98 + XL2000 SP-3
- Win2003 + XL2003 SP-1


Ignazio mi manderesti il tuo file?
--
Tiziano Marmiroli
Microsoft MVP - Office
Ignazio
2004-11-19 16:42:50 UTC
Permalink
Post by Tiziano Marmiroli
Ignazio mi manderesti il tuo file?
Ciao Tiziano,
forse è inutile che te lo invii ...

Infatti, nel ricreare il file per inviartelo ho compiuto un'operazione che
credo mi ha fatto capire la probabile causa che generava l'errore (come
aveva intuito Maurizio forse si tratta di "una errata sequenza delle
operazioni di modifica del progetto").

Praticamente eseguo le routine con VBE aperto!
(Rèmi, Mauro mi confermate che anche voi facevate lo stesso?)

Infatti, se dopo aver apportato qualsiasi modifica al codice, scelgo:
File > Chiudi e torna a Microsoft Excel
pare che entrambe le macro (IncrementaNum1 e IncrementaNum2) funzionano
bene.
Se invece passo semplicemente ad Excel ed eseguo il codice, IncrementaNum2
presenta l'errore che segnalavo.

Quindi è importante chiudere VBE prima di lanciare una qualsiasi macro?
(Spesso - per non dire sempre - quando scrivo del codice, per testarlo passo
direttamente ad Excel senza chiudere VBE, e fino ad oggi è andato sempre
tutto ok).
--
Ciao
Ignazio
Rémi
2004-11-19 17:06:11 UTC
Permalink
Bravo Ignazio !!!

Confermo che fa l'errore solo quando il VBE è aperto !

Come potrebbe dire Maurizio, sappiamo adesso che *dobbiamo* e non
*bisognerebbe* chiudere l'editore VBA prima di provare una macro ;-)

Communque, non capivo perchè funzionava prima sul mio computer e dopo avevo
l'errore, ora ho la risposta.

Io non sapevo più dove cercare. Bravo per la tua perseveranza.
--
Alcuni esempi VBA Excel
http://remigueudelot.free.fr/

Spero di aver risposto bene alla tua domanda.
Rémi.
Post by Ignazio
Post by Tiziano Marmiroli
Ignazio mi manderesti il tuo file?
Ciao Tiziano,
forse è inutile che te lo invii ...
Infatti, nel ricreare il file per inviartelo ho compiuto un'operazione che
credo mi ha fatto capire la probabile causa che generava l'errore (come
aveva intuito Maurizio forse si tratta di "una errata sequenza delle
operazioni di modifica del progetto").
Praticamente eseguo le routine con VBE aperto!
(Rèmi, Mauro mi confermate che anche voi facevate lo stesso?)
File > Chiudi e torna a Microsoft Excel
pare che entrambe le macro (IncrementaNum1 e IncrementaNum2) funzionano
bene.
Se invece passo semplicemente ad Excel ed eseguo il codice, IncrementaNum2
presenta l'errore che segnalavo.
Quindi è importante chiudere VBE prima di lanciare una qualsiasi macro?
(Spesso - per non dire sempre - quando scrivo del codice, per testarlo passo
direttamente ad Excel senza chiudere VBE, e fino ad oggi è andato sempre
tutto ok).
--
Ciao
Ignazio
Ignazio
2004-11-19 19:46:39 UTC
Permalink
Post by Rémi
Confermo che fa l'errore solo quando il VBE è aperto !
Come potrebbe dire Maurizio, sappiamo adesso che *dobbiamo* e non
*bisognerebbe* chiudere l'editore VBA prima di provare una macro ;-)
Ciao Rèmi,
comunque qualcosa non mi torna ....

E se volessi seguire il codice passo-passo?
Quindi il VBE può essere aperto durante l'esecuzione del codice.
Se l'errore è quello che abbiamo rilevato, allora questo dovrebbe essere un
difetto del VBA, non ti pare?
--
Ciao
Ignazio
Maurizio Borrelli
2004-11-19 20:39:16 UTC
Permalink
Post by Ignazio
Post by Rémi
Confermo che fa l'errore solo quando il VBE è aperto !
[...]
Post by Ignazio
comunque qualcosa non mi torna ....
E se volessi seguire il codice passo-passo?
Quindi il VBE può essere aperto durante l'esecuzione del codice.
Se l'errore è quello che abbiamo rilevato, allora questo dovrebbe essere un
difetto del VBA, non ti pare?
Ciao, Ignazio.

Anche a me qualcosa non torna! Nemmeno con l'IDE aperto ottengo il
problema di cui dite.
--
Ciao :o)
Maurizio Borrelli, Microsoft MVP - Office Systems - Access
--------
?SPQR(C)
X
--------
Tiziano Marmiroli
2004-11-20 00:33:37 UTC
Permalink
Post by Maurizio Borrelli
Anche a me qualcosa non torna! Nemmeno con l'IDE aperto ottengo il
problema di cui dite.
IDEm.
--
Tiziano Marmiroli
Microsoft MVP - Office
Ignazio
2004-11-21 11:47:10 UTC
Permalink
Post by Maurizio Borrelli
Anche a me qualcosa non torna! Nemmeno con l'IDE aperto ottengo il
problema di cui dite.
IDEm.
Ciao Tiziano,
visto che sia tu che Maurizio continuate a non riscontrare il problema, ti
ho inviato il file che mi avevi chiesto in precedenza.

Facci sapere.
--
Ciao
Ignazio
Tiziano Marmiroli
2004-11-21 15:56:35 UTC
Permalink
Post by Ignazio
Ciao Tiziano,
visto che sia tu che Maurizio continuate a non riscontrare il problema, ti
ho inviato il file che mi avevi chiesto in precedenza.
Facci sapere.
Tu avevi scritto:

| Nel Modulo1 ho inserito le seguenti istruzioni:
| ----
| Dim Num As Integer

e infatti è questo che ho ritrovato nel file.

Io (e immagino anche Maurizio) invece nella macro che provavo usavo

Public Num As Integer

Il diverso comportamento dipende da questo.

Come riportato dalla guida in linea (Concetti di Visual Basic>
Dichiarazione di variabili):

| Se viene utilizzata a livello di modulo, l'istruzione Dim è equivalente
| all'istruzione Private. L'istruzione Private consente tuttavia di
| semplificare la lettura e l'interpretazione del codice.

| Se l'istruzione Dim Num As Integer compare nella sezione Dichiarazioni
| di un modulo, la variabile Num sarà disponibile per tutte le routine del
| modulo, ma non per le routine di altri moduli del progetto. Per rendere
| questa variabile disponibile per tutte le routine del progetto, è
| necessario farla precedere dall'istruzione Public.


Tutto ha funzionato come ti aspettavi fino a che non hai inserito nella
UserForm un etichetta e codice, cioè fino al momento in cui hai creato
un altro modulo. I problemi sorti sono aggirabili dichiarando la
variabile num come variabile pubblica, ma essi restano sul tavolo.

Problema 1
Dichiarando una variabile private a livello modulo è possibile che essa
venga azzerata nel momento in cui viene eseguito codice presente in una
UserForm.

(La variabile num non viene richiamata dalla routine UserForm_Click, che
si limita ad intevenire su Label1)

Problema 2
La routine IncrementaNum2 pare restituire risultati diversi a seconda
che venga lanciata dall'IDE o da Excel.
--
Tiziano Marmiroli
Microsoft MVP - Office
Rémi
2004-11-21 21:39:24 UTC
Permalink
Ciao Tiziano, ho il problema con la variabile Public num as integer.

Ti ho mandato il file. Spero che vedi il "bug" anche te. Ciao.
--
Alcuni esempi VBA Excel
http://remigueudelot.free.fr/

Spero di aver risposto bene alla tua domanda.
Rémi.
Post by Tiziano Marmiroli
Post by Ignazio
Ciao Tiziano,
visto che sia tu che Maurizio continuate a non riscontrare il problema, ti
ho inviato il file che mi avevi chiesto in precedenza.
Facci sapere.
| ----
| Dim Num As Integer
e infatti è questo che ho ritrovato nel file.
Io (e immagino anche Maurizio) invece nella macro che provavo usavo
Public Num As Integer
Il diverso comportamento dipende da questo.
Come riportato dalla guida in linea (Concetti di Visual Basic>
| Se viene utilizzata a livello di modulo, l'istruzione Dim è equivalente
| all'istruzione Private. L'istruzione Private consente tuttavia di
| semplificare la lettura e l'interpretazione del codice.
| Se l'istruzione Dim Num As Integer compare nella sezione Dichiarazioni
| di un modulo, la variabile Num sarà disponibile per tutte le routine del
| modulo, ma non per le routine di altri moduli del progetto. Per rendere
| questa variabile disponibile per tutte le routine del progetto, è
| necessario farla precedere dall'istruzione Public.
Tutto ha funzionato come ti aspettavi fino a che non hai inserito nella
UserForm un etichetta e codice, cioè fino al momento in cui hai creato
un altro modulo. I problemi sorti sono aggirabili dichiarando la
variabile num come variabile pubblica, ma essi restano sul tavolo.
Problema 1
Dichiarando una variabile private a livello modulo è possibile che essa
venga azzerata nel momento in cui viene eseguito codice presente in una
UserForm.
(La variabile num non viene richiamata dalla routine UserForm_Click, che
si limita ad intevenire su Label1)
Problema 2
La routine IncrementaNum2 pare restituire risultati diversi a seconda
che venga lanciata dall'IDE o da Excel.
--
Tiziano Marmiroli
Microsoft MVP - Office
Tiziano Marmiroli
2004-11-21 22:25:01 UTC
Permalink
Post by Rémi
Ciao Tiziano, ho il problema con la variabile Public num as integer.
Ti ho mandato il file.
Ehm, dove? Qui non è arrivato niente, Rémi.
--
Tiziano Marmiroli
Microsoft MVP - Office
Ignazio
2004-11-22 08:35:53 UTC
Permalink
Post by Rémi
Ciao Tiziano, ho il problema con la variabile Public num as integer.
Confermo, anche a me il problema persiste quando dichiaro:
Public Num As Integer
in Modulo1.
--
Ciao
Ignazio
Mauro Gamberini
2004-11-22 09:59:56 UTC
Permalink
Ciao Ignazio, ho fatto qualche altra prova.

Renderi visibile
la UserForm in modo vbModeless tipo:

Public Sub IncrementaDue()

mioNumero = mioNumero + 1
UserForm1.Show vbModeless '<-------

With Foglio1
.Range("A1").Value = mioNumero
End With

End Sub

Cambia qualcosa?
A me adesso mantiene il valore anche
quando chiudo la Form.

Su questo pc sto usando Excel2003,
adesso passo il file su XP....ok,
lo tiene.
--
----------------------------
Mauro Gamberini
Ignazio
2004-11-22 11:27:17 UTC
Permalink
Post by Mauro Gamberini
Renderi visibile
Public Sub IncrementaDue()
mioNumero = mioNumero + 1
UserForm1.Show vbModeless '<-------
With Foglio1
.Range("A1").Value = mioNumero
End With
End Sub
Cambia qualcosa?
A me adesso mantiene il valore anche
quando chiudo la Form.
Si Mauro, anche a me ora mantiene il valore.

Però ora le istruzioni successive alla istruzione:
UserForm1.Show vbModeless
vengono eseguite prima di chiudere la UserForm.

Quindi, cos'è vbModeless?
Ho letto sulla guida che così facendo la "UserForm è non a scelta
obbligatoria"
Che significa?
--
Ciao
Ignazio
Mauro Gamberini
2004-11-22 12:51:59 UTC
Permalink
Post by Ignazio
Ho letto sulla guida che così facendo la "UserForm è non a scelta
obbligatoria"
Che significa?
Vuol dire che puoi selezionare altri oggetti senza
dover per forza chiudere la UserForm.
Con vbModeless puoi, ad esempio, scrivere nelle
celle del Foglio, senza chiudere la Form.

Faccio qualche altra prova e poi mi accodo
più sotto.
--
----------------------------
Mauro Gamberini
Rémi
2004-11-22 11:31:06 UTC
Permalink
Ciao,

Confermo, con vbmodeless, funziona ! E anche, se lo togli dopo, funziona
ancora !!!

E veramente strano questo problemà. Anche mi sono accorto, che l'errore non
la fa sempre, qualche volta ho bisogno di chiudere - aprire il file o devo
tocare il codice e salvare, o devo aprire VBE con Alt+F11 al posto di
strumenti=>Macro=>VBE, per ritrovare il "bug". Anche per voi ?
--
Alcuni esempi VBA Excel
http://remigueudelot.free.fr/

Spero di aver risposto bene alla tua domanda.
Rémi.
Post by Mauro Gamberini
Ciao Ignazio, ho fatto qualche altra prova.
Renderi visibile
Public Sub IncrementaDue()
mioNumero = mioNumero + 1
UserForm1.Show vbModeless '<-------
With Foglio1
.Range("A1").Value = mioNumero
End With
End Sub
Cambia qualcosa?
A me adesso mantiene il valore anche
quando chiudo la Form.
Su questo pc sto usando Excel2003,
adesso passo il file su XP....ok,
lo tiene.
--
----------------------------
Mauro Gamberini
Ignazio
2004-11-22 12:16:57 UTC
Permalink
Post by Rémi
Confermo, con vbmodeless, funziona ! E anche, se lo togli dopo, funziona
ancora !!!
E' vero Rèmi, anche a me succede lo stesso.
Ho fatto quindi questo test.

Ho inserito "vbmodeless" e tutto funziona, poi l'ho eliminato e tutto
continua a funzionare bene.
Se dopo chiudo il file, quando lo riapro tutto funziona ancora bene (con o
senza VBE).
Per ricreare il problema ho dovuto inserire un'altro controllo nella
UserForm (problema che si evidenzia solo con il VBE aperto).
Se ora reinserisco "vbmodeless", si ripete il tutto.

A me sembra che sia l'inserimento dei controlli nella UserForm all'origine
dei problemi.
--
Ciao
Ignazio
Mauro Gamberini
2004-11-22 12:54:00 UTC
Permalink
Post by Ignazio
Ho fatto quindi questo test.
Ho inserito "vbmodeless" e tutto funziona, poi l'ho eliminato e tutto
continua a funzionare bene.
Se dopo chiudo il file, quando lo riapro tutto funziona ancora bene (con o
senza VBE).
Per ricreare il problema ho dovuto inserire un'altro controllo nella
UserForm (problema che si evidenzia solo con il VBE aperto).
Se ora reinserisco "vbmodeless", si ripete il tutto.
A me sembra che sia l'inserimento dei controlli nella UserForm all'origine
dei problemi.
Confermo tutto.
Sto facendo alcune altre prove.
--
----------------------------
Mauro Gamberini
Mauro Gamberini
2004-11-22 14:00:00 UTC
Permalink
Post by Mauro Gamberini
Post by Ignazio
A me sembra che sia l'inserimento dei controlli nella UserForm all'origine
dei problemi.
Confermo tutto.
Sto facendo alcune altre prove.
Mi arrendo.
Quando chiudo la Form visualizzata Modale,
se ho un controllo, mi si *azzera* il progetto
e le variabili pubbliche vengono settate a 0.
--
----------------------------
Mauro Gamberini
Maurizio Borrelli
2004-11-22 14:24:27 UTC
Permalink
[...]
Post by Ignazio
A me sembra che sia l'inserimento dei controlli nella UserForm all'origine
dei problemi.
Ciao, Tutti.

Forse conviene fare l'"appello" delle dll? Io nella cartella
C:\WINDOWS\system32 ho:

FM20.DLL
Descrizione: Microsoft(R) Forms DLL
Lingua: Inglese (Stati Uniti)
Versione file: 11.0.6254.0

FM20ENU.DLL
Descrizione: Microsoft(R) Forms International DLL
Lingua: Inglese (Stati Uniti)
Versione file: 2.1.7017.1

FM20ITA.DLL
Descrizione: DLL internazionale Microsoft(R) Forms
Lingua: Inglese (Stati Uniti)
Versione file: 11.0.5601.0

Voi?

(Dannazione!... Eppure mi sembrava di aver letto di un problema analogo
coi Form ma ancora non sono riuscito a ritrovare il post di uno dei ng
internazionali.)
--
Ciao :o)
Maurizio Borrelli, Microsoft MVP - Office Systems - Access
--------
?SPQR(C)
X
--------
Mauro Gamberini
2004-11-22 15:00:03 UTC
Permalink
Macchina con W2000Server SP4,
ExcelXP Pro SP3:

Questa *m'amanca*:

FM20ENU.DLL

Tieni però presente che su questo
pc non ho VB6. Stasera guardo a casa
dove ho anche il VB6.
--
----------------------------
Mauro Gamberini
Mauro Gamberini
2004-11-22 15:20:50 UTC
Permalink
Post by Mauro Gamberini
Tieni però presente che su questo
pc non ho VB6. Stasera guardo a casa
dove ho anche il VB6.
...e dove avevo comunque lo stesso comportamento....
--
----------------------------
Mauro Gamberini
Rémi
2004-11-22 15:14:38 UTC
Permalink
C:\WINDOWS\system32 ho:

FM20.DLL
Description : Microsoft® Forms DLL
Lingua : Anglais (États-Unis)
Versione file : 2.1.7017.1

FM20FRA.DLL
Descrizione: Microsoft® Forms International DLL
Lingua: Français (France)
Versione file: 2.1.7017.1

fm20ita.DLL
Descrizione: DLL internazionale Microsoft® Forms
Lingua: Italien (Italie)
Versione file: 2.1.7017.1

Non ho FM20ENU.DLL
--
Alcuni esempi VBA Excel
http://remigueudelot.free.fr/

Spero di aver risposto bene alla tua domanda.
Rémi.


C:\WINDOWS\system32 ho:

FM20.DLL
Descrizione: Microsoft(R) Forms DLL
Lingua: Inglese (Stati Uniti)
Versione file: 11.0.6254.0

FM20ENU.DLL
Descrizione: Microsoft(R) Forms International DLL
Lingua: Inglese (Stati Uniti)
Versione file: 2.1.7017.1

FM20ITA.DLL
Descrizione: DLL internazionale Microsoft(R) Forms
Lingua: Inglese (Stati Uniti)
Versione file: 11.0.5601.0
Post by Maurizio Borrelli
Voi?
(Dannazione!... Eppure mi sembrava di aver letto di un problema analogo
coi Form ma ancora non sono riuscito a ritrovare il post di uno dei ng
internazionali.)
--
Ciao :o)
Maurizio Borrelli, Microsoft MVP - Office Systems - Access
--------
?SPQR(C)
X
--------
Maurizio Borrelli
2004-11-22 15:16:21 UTC
Permalink
"Maurizio Borrelli" ha scritto nel messaggio news:***@TK2MSFTNGP10.phx.gbl...
[...]
Post by Maurizio Borrelli
FM20ITA.DLL
Descrizione: DLL internazionale Microsoft(R) Forms
Lingua: Inglese (Stati Uniti)
Versione file: 11.0.5601.0
[...]

Ciao, Tutti.

Ops!... Leggi:

FM20ITA.DLL
Descrizione: DLL internazionale Microsoft(R) Forms
Lingua: Italiano (Italia)
Versione file: 11.0.5601.0
--
Ciao :o)
Maurizio Borrelli, Microsoft MVP - Office Systems - Access
--------
?SPQR(C)
X
--------
Ignazio
2004-11-22 16:07:04 UTC
Permalink
Post by Maurizio Borrelli
Forse conviene fare l'"appello" delle dll? Io nella cartella
FM20.DLL
Descrizione: Microsoft(R) Forms DLL
Lingua: Inglese (Stati Uniti)
Versione file: 11.0.6254.0
FM20ENU.DLL
Descrizione: Microsoft(R) Forms International DLL
Lingua: Inglese (Stati Uniti)
Versione file: 2.1.7017.1
FM20ITA.DLL
Descrizione: DLL internazionale Microsoft(R) Forms
Lingua: Inglese (Stati Uniti)
Versione file: 11.0.5601.0
Voi?
A me manca la seconda (FM20ENU.DLL), mentre sono presenti le altre due,
anche se in versioni diverse (2.1.7017.1)
--
Ciao
Ignazio
Tiziano Marmiroli
2004-11-22 14:27:00 UTC
Permalink
Post by Rémi
Ciao Tiziano, ho il problema con la variabile Public num as integer.
Ti ho mandato il file. Spero che vedi il "bug" anche te. Ciao.
Nel tuo file ogni tanto il problema si presenta: se lancio la macro
dall'IDE la variabile poi si azzera. Però incollando le tue righe di
codice in un altro file il problema pare sparire.

Con quello di Ignazio invece non sono ancora riuscito a riprodurre il
problema.


Potreste provare col file

http://www.lapalissiano.it/files/variabile+userform.xls

e indicare qui come si comporta?

Si tratta del file di Ignazio modificato. La routine IncrementaNum2 usa
una variabile private, mentre la routine IncrementaNum3 usa una
variabile public.
--
Tiziano Marmiroli
Microsoft MVP - Office
Ignazio
2004-11-22 16:34:42 UTC
Permalink
Post by Tiziano Marmiroli
Potreste provare col file
http://www.lapalissiano.it/files/variabile+userform.xls
e indicare qui come si comporta?
Si tratta del file di Ignazio modificato. La routine IncrementaNum2 usa
una variabile private, mentre la routine IncrementaNum3 usa una
variabile public.
Entrambe le routine IncrementaNum2 e IncrementaNum3 funzionano bene.
Se però dopo aggiungo un controllo nella UserForm il problema ricomincia.
--
Ciao
Ignazio
Mauro Gamberini
2004-11-22 16:51:00 UTC
Permalink
Post by Tiziano Marmiroli
Si tratta del file di Ignazio modificato. La routine IncrementaNum2 usa
una variabile private, mentre la routine IncrementaNum3 usa una
variabile public.
Finchè non aggiungo un altro controllo,
tutto è ok......

Scusa Tiziano, ma tu hai la versione
italiana sul pc? E solo quella?
--
----------------------------
Mauro Gamberini
Tiziano Marmiroli
2004-11-22 19:37:09 UTC
Permalink
Post by Mauro Gamberini
Post by Tiziano Marmiroli
Si tratta del file di Ignazio modificato. La routine IncrementaNum2 usa
una variabile private, mentre la routine IncrementaNum3 usa una
variabile public.
Finchè non aggiungo un altro controllo,
tutto è ok......
Scusa Tiziano, ma tu hai la versione
italiana sul pc? E solo quella?
No, sia Windows che Office sono in inglese con MUI.
Ma quel file funziona senza problemi anche con Windows98SE ITA e
Office2000 sp3 ITA.
--
Tiziano Marmiroli
Microsoft MVP - Office
Mauro Gamberini
2004-11-22 07:38:27 UTC
Permalink
Post by Tiziano Marmiroli
Problema 1
Dichiarando una variabile private a livello modulo è possibile che essa
venga azzerata nel momento in cui viene eseguito codice presente in una
UserForm.
(La variabile num non viene richiamata dalla routine UserForm_Click, che
si limita ad intevenire su Label1)
Problema 2
La routine IncrementaNum2 pare restituire risultati diversi a seconda
che venga lanciata dall'IDE o da Excel.
Ciao Tiziano.
E infatti io l'avevo sempre dichiarata pubblica nelle
mie prove. Quindi, lanciando da Excel, mi
confermi anche tu che abbiamo il problema 2?
--
----------------------------
Mauro Gamberini
Tiziano Marmiroli
2004-11-22 09:38:10 UTC
Permalink
Post by Mauro Gamberini
Post by Tiziano Marmiroli
Problema 2
La routine IncrementaNum2 pare restituire risultati diversi a seconda
che venga lanciata dall'IDE o da Excel.
Ciao Tiziano.
E infatti io l'avevo sempre dichiarata pubblica nelle
mie prove. Quindi, lanciando da Excel, mi
confermi anche tu che abbiamo il problema 2?
Veramente credevo che dichiarando la variabile come pubblica si
evitassero entrambi i problemi.
--
Tiziano Marmiroli
Microsoft MVP - Office
Mauro Gamberini
2004-11-22 10:09:00 UTC
Permalink
Post by Tiziano Marmiroli
Veramente credevo che dichiarando la variabile come pubblica si
evitassero entrambi i problemi.
No, continua ad azzerare.
Qualcosa ho ottenuto con .Show vbModeless,
come spiego nel post di risposta ad Ignazio.

Ho fatto alcune prove anche in VB 6 e (ovviamente)
fino alla chiusura del programma, una variabile
dichiarata pubblica in un modulo(cosa che di solito
evito decisamente) mantiene i valori che le passo.
--
----------------------------
Mauro Gamberini
Mauro Gamberini
2004-11-20 16:28:59 UTC
Permalink
Post by Ignazio
Praticamente eseguo le routine con VBE aperto!
(Rèmi, Mauro mi confermate che anche voi facevate lo stesso?)
Yes. Però lunedì torno aprovare.
Ciao a tutta la banda e buon fine settimana.
--
----------------------------
Mauro Gamberini
Loading...