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é?
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
SetsinDimla variable primero?Dimdeclara la variable .Dim r As RangeSetestablece la variable en una referencia de objeto .Set r = Range("A1")Sin embargo, no creo que esto sea lo que realmente estás preguntando.
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 utilizarSetpara 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 unVarianttipo 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 SubEntonces, analicemos lo que sucede aquí.
rse declara como una variante`Dim r` ' TypeName(r) returns "Empty", which is the value for an uninitialized variantrse establece en laRangecelda contenedora "A1"Set r = Range("A1") ' TypeName(r) returns "Range"rse establece en el valor de la propiedad predeterminada deRange("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").ValuePara 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:Esto no funcionaría sin antes declarar que
res un objetoRangeuVariant... usando laDimdeclaración, a menos que no lo hayaOption Explicithabilitado, lo que debería. Siempre. De lo contrario, está utilizando identificadores que no ha declarado y todos se declaran implícitamente como Variantes .fuente
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=5fuente
Dimsimplemente declara el valor y el tipo.Setasigna un valor a la variable.fuente
Si una variable se define como un objeto, por ejemplo, Dim myfldr As Folder, se le asigna un valor mediante la palabra clave "Set".
fuente
Dimes 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.
fuente
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=NewPropertyValuelas otras propiedades de Vars también cambian, entonces:
¡en realidad todas las vars son iguales!
fuente