¿Cuál es la diferencia entre dim y set en vba?

Resuelto Ram asked hace 14 años • 7 respuestas

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é?

Ram avatar Oct 06 '10 19:10 Ram
Aceptado

No hay razón para usarlo seta 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 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
Michael avatar Oct 07 '2010 18:10 Michael
  • 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 Setusted 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 Setpara 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 rque sea un Varianttipo.

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í.

  1. rse declara como Variante

    `Dim r` ' TypeName(r) returns "Empty", which is the value for an uninitialized variant
    
  2. rse establece en la Rangecelda que contiene "A1"

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

Otras veces uso

Set r = Range("A1")

Esto no funcionaría sin declarar primero que res un objeto Rangeu Variant... usando la Dimdeclaración, a menos que no lo haya Option Explicithabilitado, 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 .

RubberDuck avatar Nov 12 '2014 16:11 RubberDuck

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
Tobias Schittkowski avatar Oct 06 '2010 12:10 Tobias Schittkowski

Dimsimplemente declara el valor y el tipo.

Setasigna un valor a la variable.

Justin Niessner avatar Oct 06 '2010 12:10 Justin Niessner