2012-03-30 23 views
5

me escribió algunas VBA funcional:Guardar gama de variables

Sheets("Src").Range("A2:A9").Copy Destination:=Sheets("Dest").Range("A2") 

Quiero extraer el rango de origen en una variable de flexibilidad.

SrcRange = Sheets("Src").Range("A2:A9") 
SrcRange.Copy Destination:=Sheets("Dest").Range("A2") 

Sin embargo, esto no funciona. ¿Qué SrcRange debería atenuarse como? ¿Es la primera línea incluso correcta?
Me trataron de atenuación SrcRange como Rango y me dio
Runtime error 91: Object Variable or With block variable not set

No estoy muy familiarizado con el lenguaje y la documentación me ha dejado con ganas (no pude encontrar el tipo de retorno a la actual hoja (índice) la invocación, this fue lo más cercano que encontré). Cuando toco Grabar Macro, realizo algunas acciones, y presiono detener, el cuerpo de la Macro aún está en blanco.

¿Alguien podría arrojar alguna luz sobre cómo utilizar SrcRange como una variable?

Respuesta

9

En su respuesta propia, lo hace con eficacia este:

Dim SrcRange As Range ' you should always declare things explicitly 
Set SrcRange = Sheets("Src").Range("A2:A9") 
SrcRange.Copy Destination:=Sheets("Dest").Range("A2") 

usted no está realmente "extraer" el rango de una variable, se está configurando una referencia a la gama.

En muchas situaciones, esto puede ser más eficiente, así como más flexible:

Dim Src As Variant 
Src= Sheets("Src").Range("A2:A9").Value 'Read range to array 
'Here you can add code to manipulate your Src array 
'... 
Sheets("Dest").Range("A2").Value = Src 'Write array back to another range 
+0

me gusta ser capaz de leer a una variante Variable/matriz para una mayor flexibilidad. ¡Gracias por el consejo! –

7

... Y la respuesta es:

Set SrcRange = Sheets("Src").Range("A2:A9") 
SrcRange.Copy Destination:=Sheets("Dest").Range("A2") 

El Set hace toda la diferencia. Entonces funciona como un encanto.

8

Solo para aclarar, hay una gran diferencia entre estas dos acciones, según lo sugerido por Jean-François Corbett.

Una acción es copiar/cargar los datos reales de la Range("A2:A9") en una matriz variante llamada vArray (Cambiado para evitar la confusión entre matriz de variante y la Hoja de ambos llamados Src):

vArray = Sheets("Src").Range("A2:A9").Value

mientras que el otro simplemente configura una variable de rango (SrcRange) con la dirección del rango Sheets("Src").Range("A2:A9"):

Set SrcRange = Sheets("Src").Range("A2:A9")

En este caso, los datos no se copian y permanecen donde están, pero ahora se puede acceder de forma muy similar a una matriz. Eso a menudo es perfectamente adecuado, pero si necesita acceder, probar o calcular repetidamente con esa información, primero cargarla en un Array será MUCHO más rápido.

Por ejemplo, supongamos que desea comprobar una "base de datos" (hoja grande) con una lista de los suburbios conocidos y códigos postales. Ambos conjuntos de datos están en hojas separadas, pero si desea que se ejecute rápidamente, cargue los suburbios y los códigos postales en una matriz (vive en la memoria), luego recorra cada línea de la base de datos principal, probando con los datos de la matriz. Esto será mucho más rápido que si accede a ambos desde sus hojas originales.