Condividi:        

variabile da utilizzare per tanti file

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

variabile da utilizzare per tanti file

Postdi giorgioa » 19/11/23 18:18

Salve,
pur avendo letto diversi approcci su come iscrivere una
variabile che serva a diversi file alla fine non ci ho capito,
tutto come prima.
per ipotesi trascrivo la variabile che vorrei gestire come
nome da inserire in un file o nuovo oppure file qualsiasi
se cortesemente da trascriverla e dove inserirla:
(Dim) i as long
I =cells(rows.count, 3).end(xlup).row-4

Intanto mi darebbe lo spunto di come impostarla

Grazie dell'aiuto
giorgioa
Utente Senior
 
Post: 773
Iscritto il: 16/04/12 15:00

Sponsor
 

Re: variabile da utilizzare per tanti file

Postdi Anthony47 » 20/11/23 01:00

Perdona, non ho capito se (a) vorresti estendere l'area di validità di una variante a tutti i Workbooks aperti (quindi, semplificando, la variabile viene compilata da Macro1 del primo workbook ma e' visibile anche da una macro del secondo workbook); oppure se (b) stai cercando un modo di evitare di scrivere le cose usate piu' spesso Dim I as Long, J as Integer, Cippa as String; oppure se (c) ...boh
Puoi chiarire?
Avatar utente
Anthony47
Moderatore
 
Post: 19228
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: variabile da utilizzare per tanti file

Postdi giorgioa » 20/11/23 06:47

Salve,

rientrano (a) e (b)

(b) perche in un file per diverse soluzioni:
riporto diverse macro, ciascuna con compiti diversi
e ne faccio una unica.
E questo sembra mi semplifichi le cose,
il brutto è quando devo apportare cambiamenti in una di queste.
quindi continuo ripetizione di variabili.

(a) per una o due variabili posso utilizzarle per + file
giorgioa
Utente Senior
 
Post: 773
Iscritto il: 16/04/12 15:00

Re: variabile da utilizzare per tanti file

Postdi Anthony47 » 20/11/23 13:36

Allora...
La (a) non e' fattibile in modo immediato; infatti nel VBA non esiste il concetto di "variabile Globale" (cioe' disponibile a tutti all'interno dell'Applicazione). Il massimo e' Public, che consente di dichiarare in testa a un Modulo standard una variabile che sara' visibile da tutto il resto del "Progetto Vba" di quel file, salvo "eccezioni". Tra i casi di eccezione: la ridichiarazione di una variabile con lo stesso nome all'interno di una singola procedura o in testa a un altro Modulo.

Per una overview sull'argomento:
https://support.microsoft.com/it-it/off ... c64deacc6b

Se quindi il tuo obiettivo fosse scambiare il contenuto di una variabile da un file a un altro puoi usare dei trucchi, che pero' presuppongono un "accordo" tra le parti

Ad esempio
All'interno di File1:
Codice: Seleziona tutto
Public Cippa As Long
Sub RiceviValore(Valore)        'All'interno di File1

Cippa = Valore
Debug.Print "BBB", Valore

End Sub

All'interno di File 2
Codice: Seleziona tutto
Public PippoL As Long   'All'interno di File2

Sub EsportaValore()    'All'interno di File1
PippoL = 33
Application.Run "'FILE1_Xyz.xlsm'!RiceviValore", PippoL
End Sub

Il File1 e' predisposto per "ricevere" il valore da inserire all'interno della variabile Cippa (visibile all'interno di tutto il Progetto Vba di File1)

File2 e' predisposto per "passare" a File2 il contenuto della variabile PippoL (visibile all'interno di tutto il Progetto Vba di File2)

Ovviamente tutte le volte che File2 modifica il contenuto di PippoL deve essere eseguita la Sub EsportaValore, se si vuole garantire che lo stesso valore sia conosciuto contemporaneamente all'interno di File1 e File2

Un approccio meno sofisticato ma probabilmente piu' semplice da adottare e' usare delle celle di appoggio all'interno dei fogli dei file


Quanto alla (b)
Premetto che ritengo sia piu' vantaggioso scrivere pezzi di codice che svolgono compiti elementari, che poi vengono richiamati da una macro superiore; questo pero' richiede che i singoli pezzi di codice siano scritti in modo piu' complesso. Insomma serve una complicazione iniziale per poter godere di una semplificazione successiva.
Capisco che quindi spesso e' piu' comodo assemblare i vari pezzi in una unica macro.
In questi casi non vedo quali trucchi si possano usare per semplificarsi la vita. L'approccio che dovresti adottare e' di copiare "i concetti" e ricodificarli nella unica macro.

Concludo il messaggio con il sospetto che comunque quello che hai in mente tu non e' quello che ho capito io
Avatar utente
Anthony47
Moderatore
 
Post: 19228
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: variabile da utilizzare per tanti file

Postdi giorgioa » 20/11/23 14:51

Salve Anthony,

del progetto (a) lasciamo perdere.

del progetto (b) ti sei spiegato ma forse ho capito e fino ad un certo punto.

Cosa mi passa per la testa e se ciò è fattibile.
Per spiegarmi scrivo in un MODULO1 una macro che conterrebbe le
variabili che ritengo mi necessitano= Pippo
E chiudo questa macro.
Apro una seconda macro fricfroc
come prima istanza riporto:
call Pippo

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?
Se così mi dovresti portare un paio di esempi come impostare le variabili in pippo
e il tutto riguarderebbe un solo file che però posso soddisfare le varie macroline che
mi servono.
spero di essermi spiegato, dicono che tutte le strade portano a Roma: ci arriverò?
giorgioa
Utente Senior
 
Post: 773
Iscritto il: 16/04/12 15:00

Re: variabile da utilizzare per tanti file

Postdi giorgioa » 20/11/23 15:00

Preciso, rileggendo
In un file e diverse cartelle, diversi moduli
giorgioa
Utente Senior
 
Post: 773
Iscritto il: 16/04/12 15:00

Re: variabile da utilizzare per tanti file

Postdi Anthony47 » 20/11/23 16:49

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 esempio
Hai 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 ... 748ae8231f

Buona meditazione
Avatar utente
Anthony47
Moderatore
 
Post: 19228
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: variabile da utilizzare per tanti file

Postdi giorgioa » 20/11/23 18:50

Cmq una letta me la sono fatta su tue indicazioni;

come cartelle mi riferivo a fogli, e moduli a moduli;

Il file è unico e qualora mi servissi in un altro file trasferisco i dati
se c'è un modo semplice e forse mi sto mettendo in cose molto
più grandi di quanto so.
Ti riporto cosa e quali dati da ritenere e farli funzionare.
e trasformarli:

Dim sh1 as worksheet, sh2 as worksheet, sh3 as worksheet
dim i as Long, j as long
set sh1=sheets("foglio1") :set sh2 = sheets("foglio2") : set sh3 = sheets("foglio3")'eventualmente da cambiare il nome foglio)
i=sh1.cells(rows.count, 3).End(xlup).row-3 : J=sh1.cells(1, Columns.count).End(xlToleft).Column-2

Tutto qui - se si può fare molto semplicemente
giorgioa
Utente Senior
 
Post: 773
Iscritto il: 16/04/12 15:00

Re: variabile da utilizzare per tanti file

Postdi Anthony47 » 21/11/23 00:40

Non capisco... Piu' semplice che scrivere set sh1=sheets("foglio1") cosa si puo' fare? Piuttosto, visto che "ti sbatti" a fare un Set, usa un nome esplicativo; ad esempio Set Orig = sheets("foglio1") per dire che il foglio e' quello "di origine dei dati"; ma questo non c'entra niente con l'argomento di questa discussione
Avatar utente
Anthony47
Moderatore
 
Post: 19228
Iscritto il: 21/03/06 16:03
Località: Ivrea


Torna a Applicazioni Office Windows


Topic correlati a "variabile da utilizzare per tanti file":


Chi c’è in linea

Visitano il forum: Nessuno e 27 ospiti