Risultati da 1 a 7 di 7

Discussione: byVal e byRef in VBA



  1. #1
    L'avatar di dracoscrigno
    Clicca e Apri
    Data Registrazione
    May 2016
    Località
    ferrara
    Età
    41
    Messaggi
    2075
    Versione Office
    office pro 2010
    Likes ricevuti
    440
    Likes dati
    241

    Talking byVal e byRef in VBA

    quest' argomento devo averlo gia fatto snocciolare a qualcuno tempo fa su un altro forum ma non mi ricordo mica come sia andata a finire.
    ci stavo ripensando ora perchè ho appena letto un intervento di scossa dove ha pubblicato una sub con, nell argomento, la specifica "byVal".

    mi stavo chiedendo se era necessaria e se impostare un argomento come byRef cambiasse veramente le cose.

    voi direte "non ti basta far due prove al pc per saperlo?"
    certo. ma sono al cello e sentivo il desiderio compulsivo di aprire ora la discussione :D :D

  2. #2
    L'avatar di A.Maurizio
    Clicca e Apri
    Data Registrazione
    Aug 2015
    Località
    Torino
    Età
    56
    Messaggi
    383
    Versione Office
    2013
    Likes ricevuti
    44
    Likes dati
    0

    Re: byVal e byRef in VBA

    Ciao Dragoscrigno Usare il costrutto ByVal o By Ref si ottiene la stessa cosa .
    Per qui prova questa funzione per avere lo stesso risultato
    Codice: 
     Function Triple(ByVal x As Integer) As Integer
    
    x = x * 3
    Triple = x
    
    End Function

  3. #3

    L'avatar di alfrimpa
    Clicca e Apri
    Data Registrazione
    Dec 2015
    Località
    Napoli
    Età
    64
    Messaggi
    6840
    Versione Office
    2013
    Likes ricevuti
    721
    Likes dati
    166

    Re: byVal e byRef in VBA

    Draco, in attesa di un intervento del Prof. Scossa guarda qui

    https://msdn.microsoft.com/it-it/library/ddck1z30.aspx

    Alfredo

  4. #4

    L'avatar di scossa
    Clicca e Apri
    Data Registrazione
    Jul 2015
    Località
    Verona Provincia
    Età
    57
    Messaggi
    1027
    Versione Office
    .
    Likes ricevuti
    368
    Likes dati
    0

    Re: byVal e byRef in VBA

    Riporto quanto risposto al riguardo in altro forum (essendone io l'autore credo di non violare alcuna regola):


    Il discorso è piuttosto complesso. Mi limiterò ad una spiegazione semplificata.


    I parametri ad una routine (function o sub che sia) possono essere passati per riferimento (ByRef - default) o per valore (ByVal).

    ByRef
    significa che passi un riferimento (un indirizzo che punta alla locazione di memoria della variabile) a quella variabile, ByVal significa che passi il suo valore.


    Riferendosi alle variabili "semplici" (non oggetti) la differenza fondamentale è che - passandola ByRef - la routine può modificare direttamente il valore della variabile originale, mentre - passandola ByVal - la routine non può modificare la variabile originale.


    Sarà più chiaro se provi il seguente codice:


    Codice: 
    Sub prova()
      Dim nMiaVar As Long
      
      nMiaVar = 5
      
      testVal nMiaVar
      MsgBox nMiaVar
      
      testRef nMiaVar
      MsgBox nMiaVar
    
    
    End Sub
    
    
    
    
    Sub testVal(ByVal nVar As Long)
      nVar = nVar * 2
    End Sub
    
    
    
    
    Sub testRef(ByRef nVar As Long)
      nVar = nVar * 2
    End Sub


    Il discorso è diverso per le variabili oggetto, come un range, in quanto loro stesse "puntano" all'oggetto (sono istanze di quell'oggetto: se saluto Alfredo o se saluto alfrimpa, saluto comunque sempre la stessa persona).


    Quindi nel caso di un range, che sia passato ByVal o ByRef, il codice potrà comunque agire sulle celle originali.
    La differenza fondamentale tra ByRef e ByVal, in caso di oggetti, è che, con ByRef passi il riferimento all'istanza precedentemente creata (nella routine chiamante), mentre con ByVal crei una nuova istanza.
    Questo significa che nel secondo caso (ByVal) è opportuno distruggere l'isatnza con Set ... = Nothing, mentre nel primo caso (ByRef) tale distruzione è assolutamente da evitare, in quanto distruggeresti l'istanza nella sub chiamante con ovvie disastrose conseguenze:


    Codice: 
    Sub provaRng()
      Dim rngMioRange As Range
      
      Set rngMioRange = Range("A2")
      rngMioRange.Value = 2
      
      testRngVal rngMioRange
      MsgBox rngMioRange.Value 'ok
      
      testRngRef rngMioRange
      MsgBox rngMioRange.Value 'errore!!
      
      Set rngMioRange = Nothing
    End Sub
    
    
    
    
    Sub testRngVal(ByVal rng As Range)
      rng.Value = rng.Value * 5
      Set rng = Nothing
    End Sub
    
    
    Sub testRngRef(ByRef rng As Range)
      rng.Value = rng.Value * 3
      Set rng = Nothing
    End Sub


    Spero di essere riuscito almeno in parte a chiarire la differenza.
    Bye!
    scossa
    scossa's web site
    ___
    Se tu hai una mela, e io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)

  5. I seguenti 3 utenti hanno dato un "Like" a scossa per questo post:


  6. #5
    L'avatar di dracoscrigno
    Clicca e Apri
    Data Registrazione
    May 2016
    Località
    ferrara
    Età
    41
    Messaggi
    2075
    Versione Office
    office pro 2010
    Likes ricevuti
    440
    Likes dati
    241

    Re: byVal e byRef in VBA

    Grazie mille delle immediate risposte.
    Conosco la differenza tra un passaggio per valore piuttosto che per riferimento e ricordavo che i maledetti oggetti non si possono passare per valore, tant' è vero che in visual basic e non in VBA esiste un metodo apposito per duplicare gli oggetti di modo che siano trattabili come passati per valore.

    Se, Scossa, hai ricopiato la risposta da un mio topic, ti chiedo scusa ma qunado mi viene la domanda non posso non porla
    Il pensiero di questa cosa mi è venuto per via di questo tuo intervento dove hai postato questa Subroutine:
    Codice: 
    Function OrdinalSuffix(ByVal Num As Long) As StringDim N As Long
            Const cSfx = "stndrdthththththth"
            N = Abs(Num Mod 100)
            If ((N >= 10) And (N <= 19)) _
                    Or ((N Mod 10) = 0) Then
                OrdinalSuffix = Num & "th"
            Else
                OrdinalSuffix = Num & Mid(cSfx, _
                    ((N Mod 10) * 2) - 1, 2)
            End If
            
    End Function
    Al che ho pensato a come mai avessi messo quel ByVal nell' argomento.
    Probabilment elo trovo strano perchè ho l' abitudine di non operare direttamente sugli argomenti ed in questo caso, mi pare, non c'è nessuna istruzione che possa modificarlo.
    Forse una tua abitudine?

    Personalmente non l' ho mai impostato perchè, venendo dal visual basic, il ByVal era impostato in automatico dall' IDE e quindi non lo imposto nemmeno ora perchè non mi viene di scriverlo...

  7. #6

    L'avatar di scossa
    Clicca e Apri
    Data Registrazione
    Jul 2015
    Località
    Verona Provincia
    Età
    57
    Messaggi
    1027
    Versione Office
    .
    Likes ricevuti
    368
    Likes dati
    0

    Re: byVal e byRef in VBA

    Citazione Originariamente Scritto da dracoscrigno Visualizza Messaggio
    Personalmente non l' ho mai impostato perchè, venendo dal visual basic, il ByVal era impostato in automatico dall' IDE e quindi non lo imposto nemmeno ora perchè non mi viene di scriverlo...
    Attento che in VBA gli argomenti vengono passati per default ByRef.
    Il fatto di indicare in modo esplicito il metodo di passaggio fa parte delle mie "linee guida": io so come devo usare gli argomenti ed io decido io come passarli; in questo modo sono sicuro che, se nella versione 2018 di Excel (e del suo VBA) MS decidesse di passarli ByVal per default, il mio codice funzionerà comunque correttamente.
    Bye!
    scossa
    scossa's web site
    ___
    Se tu hai una mela, e io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)

  8. I seguenti utenti hanno dato un "Like"


  9. #7
    L'avatar di dracoscrigno
    Clicca e Apri
    Data Registrazione
    May 2016
    Località
    ferrara
    Età
    41
    Messaggi
    2075
    Versione Office
    office pro 2010
    Likes ricevuti
    440
    Likes dati
    241

    Re: byVal e byRef in VBA

    Come quando mi dicesti:
    "Io le creo ed io le distruggo" riferendoti alle variabili object impostate a nothing nelle tue sub, anche ora, come allora, mi vien voglia di lanciarti quell' idea di George Bernard Shaw nella speranza che si trasformi in mela, acerba, durante il volo

Permessi di Scrittura

  • Tu non puoi inviare nuove discussioni
  • Tu non puoi inviare risposte
  • Tu non puoi inviare allegati
  • Tu non puoi modificare i tuoi messaggi
  •