Ridefinizione di variabile



  • 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.