¿Cuál es la diferencia entre dim y set en vba?
Perdóneme porque soy 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 debo usar qué?
No hay razón para usarlo set
a menos que se haga referencia 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 embargo , es una buena idea dim
(dimensionar) TODAS las variables:
Ejemplos de tipos de datos simples serían integer
, long
, boolean
, string
. Estos son solo tipos de datos y no tienen sus propios métodos ni propiedades.
Dim i as Integer
i = 5
Dim myWord as String
myWord = "Whatever I want"
Un ejemplo de an object
sería a Range
, a Worksheet
o 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 object
declarado, puede acceder a sus propiedades y métodos.
myString = myRange.Value
Dim
declara la variable .Dim r As Range
Set
establece la variable como 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
usted recibirá el error de tiempo de ejecución #91 Variable de objeto o Con variable de bloque no configurada . Esto se debe a que debe utilizar Set
para asignar un valor de variable a una referencia de objeto. Entonces el código anterior funcionará .
Creo que el siguiente código ilustra lo que realmente estás preguntando. Supongamos que no declaramos un tipo y en su lugar dejamos r
que sea un Variant
tipo.
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 Variante`Dim r` ' TypeName(r) returns "Empty", which is the value for an uninitialized variant
r
se establece en laRange
celda que contiene "A1"Set r = Range("A1") ' TypeName(r) returns "Range"
r
se 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 dos líneas de código siguientes son equivalentes.
r = Range("A1")
r = Range("A1").Value
Para obtener más información sobre las propiedades predeterminadas de los objetos, consulte "Miembro predeterminado de una clase" de Chip Pearson .
En cuanto a tu Set
ejemplo:
Otras veces uso
Set r = Range("A1")
Esto no funcionaría sin declarar primero que r
es un objeto Range
u Variant
... usando la Dim
declaración, a menos que no lo haya Option Explicit
habilitado, lo cual debería hacerlo. Siempre. De lo contrario, estará utilizando identificadores que no ha declarado y todos están declarados implícitamente como Variants .
Dim: estás definiendo una variable (aquí: r es una variable de tipo Rango)
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.