Hola, estimados y queridos visitantes de este malagradecido blogero excelmaníaco. Vuelvo luego de meses y meses de inactividad... espero no abandonar nunca mas de esta forma. Son muchos los factores que me han jugado en contra: mudanzas familiares, nueva rama laboral, estudios, excusas, excusas y excusas. Realmente siento que no debo fallar en mi cometido de ayudar con Excel; intentaré subir nuevos post de forma mas regular y predecible.
Listas las disculpas del caso; vamos a meternos de lleno en un ejemplo. =)
Un asiduo lector de mi blog me plantea el siguiente problema: "Tengo una tabla con varios datos, si el valor de alguna de sus celdas coincide con otro predefinido, la macro debe quitar ese registro y colocarlo en otra hoja". ¿Se entiende? De no comprenderse algo, a no preocuparse, seguramente con el desarrollo del ejemplo todo quedará mas claro.
Comencemos... nuevamente.
Una imagen para simplificar las cosas.
[+/-] Ver el resto / Ocultar
Miremos la tabla: tiene varios registros, con tres campos: País, Importe y Fecha.
Mi amigo necesita ir recorriendo la tabla y llevarse a otra hoja todos los registros cuyo campo "Importe" sea igual a 120. ¿Queda mas claro ahora?
Un paso a paso no facilitará aún mas la compresión:
1) En F1 ingreso el valor que deseo buscar
2) Defino en que columna buscaré ese valor y a que hoja llevaré los datos (estos parámetros se encuentran dentro del código)
3) Recorro desde la fila 2 hasta el final de la tabla
4) Si el valor de la columna B (importe) es igual a F1, copio toda la fila
5) Pego la fila en la hoja "Destino"
6) Elimino la fila en la tabla
7) Repito desde el punto 4 hasta llegar al final.
Como podrán observar en el código que mas abajo les dejo (el cual se encuentra nutridamente comentado), Uds. podrán cambiar la columna en la cual se buscará el valor y definir el nombre de la hoja a la cual la macro se llevará los registros. Lo hice de esta forma para que el código tenga cierta "ductilidad" y así poder adaptar el proyecto a casi cualquier situación: En F1 colocan el valor a buscar (puede ser texto, fecha, numeros, etc, etc) y dentro del código modifican la Columna a comparar y la hoja destino de los registros. Me parece que ha quedado bastante sencillo, se podría perfeccionar a través de un UserForm... pero esa tarea se las dejo; quedo a V/disposición ante cualquier duda o consulta al respecto.
Hay una línea de código que también deberán tener en cuenta, y es la siguiente:
If Cells(X, Columna).Value = Valor Then
allí estoy indicando que si el valor de la celda es igual a Valor (el dato que paso en F1), entonces se ejecuten las líneas que siguen. A ese "=" (igual), pueden reemplazarlo por un < (menor), > (mayor), etc, etc, potenciando aún mas las posibilidades. Creo que la solución está planteada de una forma bastante "maleable" y les será factible adaptar el código a cualquier proyecto.
Sin mas, vamos a VBA:
Sub LlevarRegistros()
'defino dos constantes: la Columna en la cual se buscará el dato
'y la hoja a la que se llevarán las coincidencias:
Const Columna As String = "B"
Const HojaDestino As String = "Destino"
'un par de variables para trabajar:
Dim Valor As Variant
Dim Fila, X, UltimaFila As Long
'Fila es la fila en la hoja "Destino" a partir de la cual se co
'menzarán a copiar los datos
Fila = 2
'tomo el valor a buscar del rango "Valor":
Valor = Range("Valor").Value
'si el Valor está en blanco, aviso y me salgo del Sub:
If Valor = "" Then
MsgBox "Ingrese el valor a buscar", vbExclamation, "Faltan datos"
Range("Valor").Select
Exit Sub
End If
'antes de iniciar, aviso con un mensaje en que columna se buscará el valor, y a
'que hoja se llevarán los resultados
If MsgBox("La macro buscará en la columna: " & Columna & " el valor: " & Valor & " , llevando" _
& " los datos a la hoja: " & HojaDestino & ". Desea continuar?", vbYesNo + vbQuestion) = vbNo Then
Exit Sub
End If
'guardo en una variable la ultima fila ocupada de la tabla:
UltimaFila = Cells(Cells.Rows.Count, 1).End(xlUp).Row
'y comienzo el bucle: Desde la fila 2 (donde inicia la tabla) hasta UltimaFila
'que es el final de la tabla:
For X = 2 To UltimaFila
'si el valor de la celda me coincide con el "Valor":
If Cells(X, Columna).Value = Valor Then
'copio toda la fila
Cells(X, Columna).EntireRow.Copy
'la pego en la hoja Destino:
Sheets(HojaDestino).Cells(Fila, "A").PasteSpecial (xlPasteAll)
'aumento en 1 a Fila, para que el próximo registro se pegue
'debajo:
Fila = Fila + 1
'borro toda la fila recien copiada:
Cells(X, Columna).EntireRow.Delete
'disminuyo en 1 a X y a UltimaFila, para compensar la fila eliminada
X = X - 1
UltimaFila = UltimaFila - 1
'llevo un contador:
cont = cont + 1
End If
Next X
If cont = 0 Then
MsgBox "No se ubicaron valores como: " & Valor & " en la columna " & Columna _
, vbExclamation
Else
MsgBox "Se migraron " & cont & " registros a la hoja " & HojaDestino, vbInformation
End If
End Sub
Bueno amigos, como siempre, les dejo
el link al archivo y mi mas profundo y sincero agradecimiento por estar cerca de festejar el millón de visitas. Son unos capos, en serio muchas gracias.
Salu2.xlsx
GRANDE MAESTRO!
ResponderEliminarsin dudas el mejor blog que he conocido. Un gran trabajo en ayudar de forma grata a los demas
pero ahora yo necesito una ayudita. mi idea es la misma que planteas pero no buscando el valor, sino que dos celdas ya definidas se copien y peguen en otro libro excel. Agradeceria mucho una ayudita ya que no me manejo mucho en el tema de interaccion entre archivos.
Gracias de antemano y felicidades por el gran trabajo.
Gracias Max, veo de armar algún ejemplo de como llevar datos a otro libro y te aviso. Es un buen tema para mi próxima entrada.
ResponderEliminarSalu2