In un file e diverse cartelle, diversi moduli
Suppongo volessi dire "in un File con vari Fogli e vari Moduli vba"
ho creato un for e mi servo della variabile che sta in Pippo
detto e scritto così la variabile che sta in Pippo fa funzionare il For?
Detto così mi si e' surriscaldato il neurone di sinistra a cercare di capire il pensiero che c'e' dietro la frase...
Vediamo se riesco a girarci attorno...
Diamo per scontato che "Pippo" sia una macro autonoma (Sub Pippo)
Se Sub Pippo scrive in una variabile di nome QualsiasiNome e di tipo Public, allora il contenuto di questa variabile ("QualsiasiNome") potra' essere visibile anche da un'altra Sub contenuta nello stesso progetto vba
A questo scopo devi dichiarare in testa al modulo standard che contiene la Sub Pippo la variabile QualsiasiNome usando la dichiarazione
- Codice: Seleziona tutto
Public QualsiasiNome
Questa sintassi equivale a una Dim ma specifica l'area di validità pari a tutto il progetto vba
Ad esempioHai una macro (es Sub CalcolaValore; basta con Pippo!) che calcola un valore esaminando il contenuto di due celle (es A1 e B1) del foglio attivo
Poi vorresti fare delle simulazioni modificando A1 e B1 per cercare quale combinazione produce il risultato voluto o più simile
Ipotesi su come fare:
Fai in modo che la Sub CalcolaValore carichi il suo risultato in una variabile di tipo Public (quindi visibile da altri moduli e altre macro dello stesso progetto vba); supponiamo sia la variabile Result
Ora crea una Sub Simulazione che contiene un loop che vada a modificare in modo sequenziale entro i valori min e max le celle A1 e B1, richiama la Sub CalcolaValore e controlla se la variabile Result contiene il valore atteso; se Sì allora termina la simulazione, se No continua e memorizza la combinazione che produce i risultati piu' vicini al risultato atteso.
Esempio di codice all'interno della Sub Simulazione
- Codice: Seleziona tutto
'..
'..
Dim Best(1 To 4) 'Matrice di appoggio
Best(3) = 999 'Usato per "differenza tra cercato e calcolato"
For I = MinI To MaxI
For J = MinJ To MaxJ
Range("A1") = I 'varia i parametri A1 e B1
Range("B1") = J
Call CalcolaValore 'calcola il risultato della simulazione
If Abs(Result - ValoreAtteso) < Best(3) Then 'Controlla se l'errore e' il piu' basso
Best(1) = I 'Se Sì, salva i parametri e il risultato
Best(2) = J 'Best(1) e (2) contengono I e J
Best(3) = Abs(Result - ValoreAtteso) 'Best(3) contiene l'errore tra Cercato e Calcolato
Best(4) = Result 'Best(4) contiene il valore Calcolato
End If
If Result = ValoreAtteso Then Exit For 'Se Tovato=Cercato allora termina
Next J
If Result = ValoreAtteso Then Exit For 'idem
Next I
Debug.Print Best(1), Best(2), Best(4) '"Stampa" nella finestra Immediata il miglior risultato
Nota che la macro usa una matrice a 4 posizioni per memorizzare quale combinazione di I/J produce il miglior risultato
La variabile Result e' dichiarata in testa al modulo che contiene la Sub CalcolaValore con la dichiarazione
- Codice: Seleziona tutto
Public Result as Double 'il tipo=double ipotizza che il risultato sia un numero con decimali
Ovviamente il codice e' solo
un esempio per dimostrare l'uso di una variabile condivisibile tra varie macro in vari Moduli dello stesso file
Ti raccomando comunque di leggere l'articolo Microsoft al link che ti ho inserito nel messaggio precedente, anche se talvolta e' piu' comodo chiedere senza documentarsi prima.
La discussione pero' ci porta a un altro argomento: le funzioni personalizzate
Si tratta di macro che accettano in "entrata" del parametri e che restituiscono "in uscita" un risultato direttamente al chiamante; in questo modo fai a meno della variabile Public usata come "appoggio" ne' delle celle A1 e B1 di appoggio.
Per come creare una funzione personalizzata:
https://support.microsoft.com/it-it/off ... 748ae8231fBuona meditazione