Perdonami come sono un principiante in VBA.Qual è la differenza tra dim e set in vba
A volte uso
Dim r as Range
r = Range("A1")
Altre volte io uso
Set r = Range("A1")
Qual è la differenza? E quando dovrei usare cosa?
Perdonami come sono un principiante in VBA.Qual è la differenza tra dim e set in vba
A volte uso
Dim r as Range
r = Range("A1")
Altre volte io uso
Set r = Range("A1")
Qual è la differenza? E quando dovrei usare cosa?
Non c'è motivo di utilizzare set
a meno che non si faccia riferimento a un riferimento a un oggetto. È buona norma usarlo solo in quel contesto. Per tutti gli altri tipi di dati semplici, basta usare un operatore di assegnazione. E 'una buona idea quella di dim
(dimensione) Tutte le variabili però:
Esempi di tipi di dati semplici sarebbe integer
, long
, boolean
, string
. Questi sono solo tipi di dati e non hanno i loro metodi e proprietà.
Dim i as Integer
i = 5
Dim myWord as String
myWord = "Whatever I want"
Un esempio di object
sarebbe un Range
, un Worksheet
, o un Workbook
. Questi hanno i loro metodi e proprietà.
Dim myRange as Range
Set myRange = Sheet1.Range("A1")
Se si tenta di utilizzare l'ultima linea senza Set
, VB genera un errore. Ora che hai un object
dichiarato puoi accedere alle sue proprietà e ai suoi metodi.
myString = myRange.Value
Dim: si sta definendo una variabile (in questo caso: r è una variabile di tipo Range)
Set: si sta impostando la proprietà (qui: impostare il valore di r per Range ("A1") - questo non è un tipo, ma un valore).
è necessario utilizzare Imposti con gli oggetti, se r fosse un tipo semplice (ad esempio int, string), allora si dovrebbe solo scrivere:
Dim r As Integer
r=5
L'ultima riga non deve essere "Dim r as Integer: r = 5' o un'interruzione di riga? Non pensare di poter attenuare e assegnare così in VBA. - modifica: ho appena notato l'età di questo post. Lasciamo un commento qui perché è ancora valido anche se – bmgh1985
Dim
dichiara semplicemente il valore e il tipo.
Set
assegna un valore alla variabile.
Se una variabile è definita come un oggetto, ad es. Dim myfldr As Folder, viene assegnato un valore usando la parola chiave "Set".
Dim r As Range
Set
sets the variable to an object reference.
Set r = Range("A1")
Tuttavia, non credo che questo è quello che stai davvero chiedendo.
A volte uso:
Dim r as Range r = Range("A1")
Questo non funzionerà mai. Senza Set
si riceverà l'errore di runtime #91 Object variable or With block variable not set. Questo perché deve utilizzare Set
per assegnare un valore di variabili a un riferimento a un oggetto. Quindi il codice sopra funzionerà.
penso che il codice qui sotto illustra che cosa siete davvero chiedendo. Supponiamo di non dichiarare un tipo e lasciare che sia r
un tipo Variant
.
Public Sub test()
Dim r
debug.print TypeName(r)
Set r = Range("A1")
debug.print TypeName(r)
r = Range("A1")
debug.print TypeName(r)
End Sub
Quindi, analizziamo cosa succede qui.
r
viene dichiarata come variante
`Dim r` ' TypeName(r) returns "Empty", which is the value for an uninitialized variant
r
è impostato al Range
contenente cella "A1"
Set r = Range("A1") ' TypeName(r) returns "Range"
r
è impostato al valoredella proprietà predefinita di Range("A1")
.
r = Range("A1") ' TypeName(r) returns "String"
In questo caso, la proprietà predefinita di un Range è .Value
, quindi le seguenti due righe di codice sono equivalenti.
r = Range("A1")
r = Range("A1").Value
Per di più le proprietà degli oggetti predefiniti, vedere Chip Pearson's "Default Member of a Class".
quanto riguarda il tuo Set
ad esempio:
Altre volte io uso
Set r = Range("A1")
Questo non avrebbe funzionato senza prima dichiarare che r
è un oggetto Range
o Variant
.. . utilizzando l'istruzione Dim
- a meno che non sia abilitato lo Option Explicit
, che dovrebbero. Sempre. Altrimenti, stai utilizzando identificatori che non hai dichiarato e sono tutti implicitamente dichiarati come Variants.
Risposta eccellente – Pclaverie
@PierreClaverie Sì :) include i riferimenti originali per * Dim * e * Set * – Wolf
@Wolf non so se ne sei a conoscenza, ma il ref della lingua VBA è ora mantenuto su github. https://github.com/OfficeDev/VBA-content/blob/master/VBA/Language-Reference-VBA/readme.md – RubberDuck
In base alla guida di VBA sull'istruzione SET, imposta un riferimento a un oggetto. Se si modifica una proprietà, anche l'oggetto effettivo cambierà.
Dim newObj as Object
Set var1=Object1(same type as Object)
Set var2=Object1(same type as Object)
Set var3=Object1(same type as Object)
Set var4=Object1(same type as Object)
Var1.property1=NewPropertyValue
le altre proprietà Vars cambia anche, in modo da:
Var1.property1=Var2.property1=Var3.property1=Var4.property1=Object1.Property1=NewpropertyValue`
actualy tutti Vars sono uguali!
Dim
è l'abbreviazione di Dimensione e viene utilizzato in VBA e VB6 per dichiarare variabili locali.
Set, d'altra parte, non ha nulla a che fare con le dichiarazioni variabili. La parola chiave Set
viene utilizzata per assegnare una variabile oggetto a un nuovo oggetto.
La speranza che chiarisce la differenza per voi.
Posso sapere per favore quale tutorial o libro hai fatto riferimento per capire questo? – Ram
Questa risposta in realtà non spiega il "perché" – kizzx2
VBA è molto intelligente, non richiede di dire cosa diavolo stai facendo come un sacco di lingue. Questo però aggiunge tempo. Se si utilizza un'intera serie di dimensioni diverse su tutti i tipi di varietà diverse, si aggiunge il tempo. Se dici a VBA cosa aspettarsi quando vede una variabile, allora non deve risolverlo. Inoltre, se comunichi a VBA che una variabile è un numero intero e non una stringa, non occuperà più RAM. Sebbene quest'ultimo punto non sia probabilmente valido nei comuni progetti VBA di piccole dimensioni, è comunque una buona pratica di codifica. – Rapid