Bueno, vamos a ponernos más prácticos...
Aclaración: un rango puede ser una celda sola, varias, una columna, una fila, una matriz (filas y columnas). Se?
Bien, supongamos que en la "hoja 1" tengo un listado bajado de SAP que cambia siempre en la cantidad de registros (hoy tiene 100 filas con datos y mañana tiene 90 o 3000, se?), y tengo en la columna A el código de articulo, servicio, o lo que sea, columna B cantidades, columna C precios, etc... pero este listado no tiene el nombre del articulo... q problema, ne?
Bueno, en la "hoja 2" tengo un listado con códigos de articulos o servicios en la columna A y sus nombres en la columna B.
Facil, tiramos un Buscarv (o Consultav si tenés Excel 2010) en la columna D para todos los articulos y listo. Como a mí me gusta tener "Codigo Articulo | Nombre " voy a insertar una columna de manera que me quede ese orden y todo lo demas.
Entonces, con Alt+F11 abrimos el editor de Visual (y de muchas maneras más, claro) y agregamos un módulo con el menú Insertar -> Modulo; doble click en "Modulo 1" que está a la izquierda de la pantalla, y tenemos nuestro lienzo para comenzar nuestra pintura. (Quise subir imagenes pero se me complicó)
En fin, volvamos. Vamos a escribir algunas cosas...
Vamos a hacer que busque la ultima fila de la "hoja 1", que en nuestro supuesto varia cada vez que vamos a trabajar con la info.
Codigo (que pueden copiar y pegar directamente):
'SELECCIONAMOS HOJA 1
Sheets("Hoja 1".Select
'INSERTAMOS UNA COLUMNA EN LA COLUMNA B
Range("b:b".Insert
'DECLARAMOS UNA VARIABLE
Dim Ultima_fila As String
'ELEGIMOS ULTIMA FILA CON DATOS DE LA COLUMNA A
Range("A" & Rows.Count()).Select
Selection.End(xlUp).Select
'NOS MOVEMOS UNA CELDA HACIA LA DERECHA
Activecell.offset(,1).select
'LE DECIMOS QUE LA VARIABLE ES = A LA DIRECCION DE LA CELDA QUE ACABAMOS DE ENCONTRAR
Ultima_fila = ActiveCell.Address
'SUPONGAMOS QUE LOS DATOS COMIENZAN EN LA FILA 2, VAMOS A COMPLETAR EL BUSCARV DESDE LA CELDA B2 HASTA LA CELDA QUE ACABAMOS DE ENCONTRAR
Range("B2:" & Ultima_fila).FormulaR1C1 = "=+vlookup(rc[-1],Hoja2!c[-1]:c[1],2,0)"
'AHORA QUIERO QUE SE PEGUE VALOR, QUE NO QUEDE EL BUSCARV
'POR LAS DUDAS PRIMERO TIRO UN CALCULAR
Calculate
'COPIO LA COLUMNA
Range("b:b".Copy
'PEGO VALOR
Range("b:b".PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
CutCopyMode = False
Aclaración: donde sale una carita del orto guiñando un ojo hay en realidad un paréntesis de cierre. Si alguien sabe como corregirlo me avisa. Si le meto un espacio no sale mas el guiño, pero no funciona el código tampoco así que estamos en la misma...
Otra, supongamos que el archivo que estamos usando tiene muchos cálculos, y que cuando tiremos este buscarv se nos cuelga una hora con el Calculando 10% del demonio... bueno, nunca vamos a zafar del todo de la demora, pero lo que podemos hacer es que calcule todo en un solo paso y no a cada momento.
Un "tip", las funciones lógicas son las que más demoran, ejemplo SI, Y, O, en fin, las lógicas.
'Bueno, para que no haga cálculos a cada rato vamos a poner al principio del código:
Application.Calculation = xlManual
'Y cuando queremos que calcule todas las formulas:
Calculate
Esto es muy bueno, prácticamente todas mis macros empiezan con esta linea. Solo hay que recordar el Calculate en los pasos correctos, si no podemos errarle y estropear todo el trabajo.
A decir verdad, mis macros empiezan así:
'No mostrar el avance de la macro
Application.ScreenUpdating = False
'No calcular automaticamente
Application.Calculation = xlManual
Voy a ir subiendo más casos así...
El primer post fue:
El que sigue:

