Ridefinizione di variabile
Hai un problema con Excel? 
Ridefinizione di variabile
di marinoernestoch data: 20/02/2014 20:55:32
Buona sera.
Ho una funzione che ha un parametro obbligatorio e due facoltativi, ma uno dei due deve esserci.
Questi due parametri possono essere di tipo range o di tipo cellformat.
Per rendere standard le istruzioni desidero 'normalizzare' le aree di transito.
Infatti le proprietà che tatto possono appartenere a RANGE e a CELLFORMAT
Succede che alla seconda DIM il vba mi da errore.
Mi sapete dire se esiste qualche trucco per superare l'errore? Se non trovo una soluzione, mi resta solo quello di duplicare le funzioni, una per gestire il parametro cellformat e una per gestire il parametro range.
Le istruzioni sotto, le ho scritte di getto, quindi potrebbero avere errori di sintassi: mi scuso per essi, ma l'errore a cui mi riferisco è di concetto nella definizione di variabile, come dico nel titolo.
Grazie dell'aiuto.
Function sovrappone(ByVal parte As Object, optional ByRef arriva_cella As CellFormat, optional byref arriva_range as range)
if ismissing(arriva_cella) and ismissing(arriva_range) then
sovrappone = false
exit function
endif
if ismissing(arriva_cella) then
dim aree_di_transito as range <<<<<===== da errore
set aree_di_transito = arriva_range
else
dim aree_di_transito as cellformat <<<<<===== da errore
set aree_di_transito = arriva_cella
endif
with aree_di_transito
.numberformat = "XXXXX"
with .font
.bold =....
.
. omissis
.
end with '.font
.
.
. omissis
end with 'aree_di_transito
' finito, imposto i valori ricalcolati nei parametri passati ByRef
if ismissing(arriva_cella) then
set arriva_range = lavoro
else
set arriva_cella = lavoro
endif
sovrappone = true
end function |
di Vecchio Frac data: 20/02/2014 21:10:14
cit. "Succede che alla seconda DIM il vba mi da errore. "
---> Non dici che errore è (siate più precisi! non abbiamo la palla di vetro ^_^) ma io credo al 99% che l'errore è "dichiarazione doppia nell'area di validità corrente". Succede perchè stai dichiarando due volte la stessa variabile all'interno dello stesso scope (dim aree_di_transito as ... ) e questo VBA non te lo lascia fare.
Risolverai probabilmente dichiarando la variabile as Variant e lasciando che sia poi VBA a tipizzarla a seconda dell'oggetto assegnato.
Function sovrappone(ByVal parte As Object, optional ByRef arriva_cella As CellFormat, optional byref arriva_range as range)
dim aree_di_transito as Variant
if ismissing(arriva_cella) and ismissing(arriva_range) then
sovrappone = false
exit function
endif
if ismissing(arriva_cella) then
set aree_di_transito = arriva_range
else
set aree_di_transito = arriva_cella
end if
...resto del codice...
end function |
di Vecchio Frac data: 20/02/2014 21:16:20
Inoltre farei test accurati per IsMissing... non sono sicuro che funzioni come ci si aspetta (mi riferisco all'ultima parte del codice).
di marinoernestoch (utente non iscritto) data: 21/02/2014 11:11:30
Ringrazio Vecchio Frac.
L'errore è appunto "Errore di compilazione: dichiarazione doppia nell'area di validità corrente".
Ho inserito una sola definizione di lavoro e ho provato sia come AS VARIANT che come AS OBJECT: al SET successivo, condizionato dalla presenza del 2° o 3° parametro, diventa VARIANT/RANGE o VARIANT/CELLFORMAT oppure OBJECT/RANGE e OBJECT/CELLFORMAT. Le istruzioni successive funzionano, con l'eccezione della definizione dei bordi (ma ora apro un altra discussione su questo argomento).
Infine: in effetti l'istruzione ISMISSING non funziona perchè, in debugging, ho visto che il VBA definisce i parametri e, se assenti, gli assegna il valore NOTHING. Quindi in luogo del test IF ISMISSING(arriva_cella) ho inserito il test IF arriva_cella IS NOTHING. E la logica funziona.
Grazie mille
di Vecchio Frac data: 21/02/2014 20:46:00
Sì, hai ragionato bene.
Ci sarebbe un altro trucco per intercettare l'omissione del parametro facoltativo, ma il controllo se Nothing va bene visto che stai coinvolgendo degli oggetti.
Sul ragionamento dei bordi, ho risposto all'altro post ma non ho capito bene la situazione.
Forse devi postare un pezzo di file o almeno il codice finale per ricostruire lo scenario.
Vuoi Approfondire?