Perdóname porque soy un novato en VBA.
A veces uso
Dim r as Range
r = Range("A1")
Otras veces uso
Set r = Range("A1")
¿Cuál es la diferencia? ¿Y cuándo debería usar qué?
Respuestas:
No hay razón para usarlo a setmenos que se refiera a una referencia de objeto. Es una buena práctica usarlo solo en ese contexto. Para todos los demás tipos de datos simples, simplemente use un operador de asignación. Sin dimembargo, es una buena idea (dimensionar) TODAS las variables:
Los ejemplos de los tipos de datos simples serían integer, long, boolean, string. Estos son solo tipos de datos y no tienen sus propios métodos y propiedades.
Dim i as Integer
i = 5
Dim myWord as String
myWord = "Whatever I want"
Un ejemplo de un objectsería a Range, a Worksheeto a Workbook. Estos tienen sus propios métodos y propiedades.
Dim myRange as Range
Set myRange = Sheet1.Range("A1")
Si intenta utilizar la última línea sin Set, VB arrojará un error. Ahora que tiene un objectdeclarado, puede acceder a sus propiedades y métodos.
myString = myRange.Value
Setsin Dimla variable primero?
Dim declara la variable .
Dim r As Range
Set establece la variable en una referencia de objeto .
Set r = Range("A1")
Sin embargo, no creo que esto sea lo que realmente estás preguntando.
A veces uso:
Dim r as Range r = Range("A1")
Esto nunca funcionará. Sin Set, recibirá el error de tiempo de ejecución # 91 Variable de objeto o Con variable de bloque no establecida . Esto se debe a que debe utilizar Setpara asignar un valor de variable a una referencia de objeto. A continuación, el código anterior será trabajar.
Creo que el siguiente código ilustra lo que realmente estás preguntando. Supongamos que no declaramos un tipo y dejamos rser un Varianttipo en su lugar.
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
Entonces, analicemos lo que sucede aquí.
r se declara como una variante
`Dim r` ' TypeName(r) returns "Empty", which is the value for an uninitialized variant
rse establece en la Rangecelda contenedora "A1"
Set r = Range("A1") ' TypeName(r) returns "Range"
rse establece en el valor de la propiedad predeterminada de Range("A1").
r = Range("A1") ' TypeName(r) returns "String"
En este caso, la propiedad predeterminada de un rango es .Value, por lo que las siguientes dos líneas de código son equivalentes.
r = Range("A1")
r = Range("A1").Value
Para obtener más información sobre las propiedades de objeto predeterminadas, consulte "Miembro predeterminado de una clase" de Chip Pearson .
En cuanto a tu Setejemplo:
Otras veces uso
Set r = Range("A1")
Esto no funcionaría sin antes declarar que res un objeto Rangeu Variant... usando la Dimdeclaración, a menos que no lo haya Option Explicithabilitado, lo que debería. Siempre. De lo contrario, está utilizando identificadores que no ha declarado y todos se declaran implícitamente como Variantes .
Dim: está definiendo una variable (aquí: r es una variable de tipo Range)
Establecer: está configurando la propiedad (aquí: establezca el valor de r en Rango ("A1"); esto no es un tipo, sino un valor).
Tienes que usar set con objetos, si r fuera un tipo simple (por ejemplo, int, string), entonces simplemente escribirías:
Dim r As Integer
r=5
Dim simplemente declara el valor y el tipo.
Set asigna un valor a la variable.
Si una variable se define como un objeto, por ejemplo, Dim myfldr As Folder, se le asigna un valor mediante la palabra clave "Set".
Dim es la abreviatura de Dimension y se usa en VBA y VB6 para declarar variables locales.
Set, por otro lado, no tiene nada que ver con declaraciones de variables. La Setpalabra clave se utiliza para asignar una variable de objeto a un nuevo objeto.
Espero que te aclare la diferencia.
De acuerdo con la ayuda de VBA en la declaración SET, establece una referencia a un objeto. Por lo tanto, si cambia una propiedad, el objeto real también cambiará.
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
las otras propiedades de Vars también cambian, entonces:
Var1.property1=Var2.property1=Var3.property1=Var4.property1=Object1.Property1=NewpropertyValue`
¡en realidad todas las vars son iguales!