2015-05-29 4 views
6

Questo dovrebbe essere semplice, ma non riesco a trovare una risposta chiara.Quando utilizzare range.value?

Se sto leggendo/scrivendo su un intervallo, quando uso solo il nome dell'intervallo e quando devo utilizzare range.value? Importa se l'intervallo è una cella o più celle? Ha importanza quale sia il tipo di variabile? O il tipo di dati nell'intervallo? C'è una buona pratica per questo?

Ad esempio, devo scrivere

`a = Range("Test")` 

o devo scrivere

`a = Range("Test").value` 

Analogamente,

`Range("Test") = a` 

o

`Range("Test").value = a` 

risposta

7

Nell'oggetto Excel Range, il default member è Value

Così SomeVariable = Range("A1") è stessa SomeVariable = Range("A1").Value

Allo stesso modo Range("A1") = SomeVariable è uguale Range("A1").Value = SomeVariable

Bisogna ovviamente fare attenzione quando si dice a = Range("Test")

Quando si tenta di archiviare il valore da un intervallo contiguo a una variabile Variant, ad esempio, il range di intervallo Test rs per dire, A1:A10, quindi si otterrà un array di valori

Sub Sample() 
    Dim Myar 

    Myar = Range("A1:A10").Value 

    Debug.Print UBound(Myar) 
End Sub 

Anche in questo caso Myar = Range("A1:A10").Value è lo stesso di Myar = Range("A1:A10")

Se sto lettura/scrittura ad un intervallo, quando fare Uso solo il nome dell'intervallo e quando è necessario utilizzare range.value?

io non sono sicuro di cosa si intende per when do I just use the range name, ma non importa se si utilizza .Value o no quando si sta leggendo/scrittura da/a una serie. IMHO, è una buona pratica usare .Value :)

Indica se l'intervallo è una cella o più celle?

No, non importa anche in questo caso se si utilizza .Value o no.

È importante quale sia il tipo di variabile?

Oh sì! Vedere l'esempio di array sopra

Oppure il tipo di dati nell'intervallo?

Le celle di Excel possono memorizzare vari tipi di dati. Dai numeri alle date alle stringhe. Poiché non sai cosa può essere quel tipo, è consigliabile che quando si lavora con loro, utilizzare Variant. Ecco un esempio classico

Diciamo cella A1 ha questo numero 123456789

Ora provate questo codice

Sub Sample() 
    Dim someVariable As Integer 

    someVariable = Range("A1").Value 

    Debug.Print someVariable 
End Sub 

Ed ora provate questo

Sub Sample() 
    Dim someVariable As Variant 

    someVariable = Range("A1").Value 

    Debug.Print someVariable 
End Sub 

Edit:

Come già detto da Tim Williams

Utilizzando .Value è utile anche a "dis-ambiguate" il comune "dimenticato di utilizzare Set quando si assegna una variabile oggetto" problema - Dim un: Set a = Range ("A1") vs Dim a: a = Intervallo ("A1") Nel secondo caso utilizzando sempre .Value chiarisce il problema reale -

+1

Nice one Siddharth. Mi piace anche esplicitamente '.Value' dal momento che aiuta i principianti a leggere il codice e aiuta a differenziare il vecchio nugget' .Value2' (vedi qui Raghu http://stackoverflow.com/questions/17359835/what-is-the-difference -tra-valore-testo-e-valore2) – CuberChase

+1

Grande roba Siddharth :) Per completare quanto sopra, se sei più simile a me di Siddharth, quindi usare qualifiche come .value, anche quando non strettamente necessario, ti aiuterà a mantenere tenere traccia dei dati che si desidera acquisire e risolvere i problemi quando si verificano errori di mancata corrispondenza del tipo. Preferisco anche evitare l'uso di Variant per lo stesso motivo (e per il vantaggio estremamente minore di usare meno memoria). Ovviamente se sei cresciuto periodicamente facendo questi errori direi che il consiglio di Siddharth è la strada da percorrere. – puzzlepiece87

+3

L'uso di '.Value' è anche utile per" disambiguare "il comune" ha dimenticato di usare Imposta durante l'assegnazione di un oggetto variabile "problema -' Dim a: Imposta a = Intervallo ("A1") 'vs' Dim a: a = Range ("A1") 'Nel secondo caso, sempre usando' .Value' chiarisce il problema reale –