2010-10-06 34 views

risposta

55

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 
+3

Posso sapere per favore quale tutorial o libro hai fatto riferimento per capire questo? – Ram

+14

Questa risposta in realtà non spiega il "perché" – kizzx2

+1

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

7

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 
+0

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

3

Dim dichiara semplicemente il valore e il tipo.

Set assegna un valore alla variabile.

1

Se una variabile è definita come un oggetto, ad es. Dim myfldr As Folder, viene assegnato un valore usando la parola chiave "Set".

46

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.

  1. r viene dichiarata come variante

    `Dim r` ' TypeName(r) returns "Empty", which is the value for an uninitialized variant 
    
  2. r è impostato al Range contenente cella "A1"

    Set r = Range("A1") ' TypeName(r) returns "Range" 
    
  3. 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.

+2

Risposta eccellente – Pclaverie

+0

@PierreClaverie Sì :) include i riferimenti originali per * Dim * e * Set * – Wolf

+1

@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

0

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!

0

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.

Problemi correlati