Luego de mucho tiempo sin postear (me mudé a una nueva ciudad y entre el trabajo, los trámites, reparar y acomodar mi nueva vivienda, no me quedaban ni diez minutos para mi querido blog) procedo a contestar la consulta que me efectuara hace unos días un lector llamado Martín Ramírez.
El tema es el siguiente: tiene dos tablas (cada una en distintas hojas) que poseen varios miles de registros. Entre ambas tablas, y en algunos casos, existen coincidencias en el código de artículo del producto descripto.
Necesita que una macro (aunque también se podría realizar con funciones) que busque esas coincidencias y las pegue en otra hoja. Recurro a las macros por un motivo muy sencillo: tantos registros manejados con funciones.... solo se traduce en una gran ralentización de Excel.
el código de la columna B deberá ser buscado en otra tabla. Si en esta otra tabla existe, dicho registro será copiado a una hoja nueva.
Los códigos de artículos de la segunda tabla se encuentran en la columna D. Mi planteo para solucionar esto es el siguiente:
[+/-] Ver el resto / Ocultar
1) Creo un formulario que le permita al usuario seleccionar que hojas va a revisar.
2) Recorro la tabla que tiene los artículos en la columna B y busco ese valor en la columna D de la otra tabla.
3) Si el artículo está en la segunda tabla, lo copio a otra hoja.
4) Como las tablas tienen distintos orden en sus columnas, se deberá respetar siempre el formato de ambas, punteando la tabla1 contra la tabla2. Caso contrario, la macro no funcionará correctamente.
El UserForm se tendría este aspecto:
en ambos combobox se cargarán las hojas existentes en el libro. el usuario elegirá la hoja en donde se encuentra la primer tabla y, en el combobox de abajo, seleccionará la hoja donde está la segunda tabla
No es mi intención en este blog generar proyectos de gran envergadura; mi propósito apunta a crear código sencillo, que sea fácil de interpretar y que, posteriormente, sus líneas puedan ser aprovechadas en otros trabajos, con simples modificaciones.
Veamos el código generado, el cual tiene comentarios abundantes explicando los pasos llevados a cabo:
Private Sub cmdInciar_Click()
Dim Rng1, Rng2, Celda As Range
Dim Uf, Fila, Fila2 As Long
Dim NuevaHoja As String
'primero corroboro que ambos cuadros combinados tengan algún
'valor seleccionado y que el usuario no quiera puntear las
'mismas hojas:
If cboHoja1.Text = "" Or cboHoja2.Text = "" Then
MsgBox "por favor seleccione las hojas a comparar", vbCritical
Exit Sub
ElseIf cboHoja1.Text = cboHoja2.Text Then
MsgBox "no se pueden puntear dos hojas iguales", vbCritical
Exit Sub
End If
'selecciono la primer hoja
Sheets(cboHoja1.Text).Select
'y veo hasta donde llegan los datos de la columna
'que contiene los códigos de articulos:
Uf = Cells(Cells.Rows.Count, 2).End(xlUp).Row
'ahora creo los rangos sobre los cuales trabajaré:
Set Rng1 = Range("b3:b" & Uf)
Set Rng2 = Sheets(cboHoja2.Text).Range("d1:d65536")
'agrego una hoja, en donde colocaré los codigos de articulos
'coincidentes:
Sheets.Add
NuevaHoja = ActiveSheet.Name
Fila2 = 3
'me voy a la primer hoja y comienzo a recorrer el rango que
'posee lo artículos:
Sheets(cboHoja1.Text).Select
For Each Celda In Rng1.Cells
On Error Resume Next
'busco el nro de fila en la que se encuentra el artículo
'en la segunda hoja
Fila = Rng2.Find(Celda.Value).Row
'si hay error quiere decir que el artículo NO existe en
'la segunda hoja
If Err.Number <> 0 Then
Err.Clear
Else
'si NO hay error, el artículo fué encontrado, entonces
'me lo llevo a otra hoja:
Celda.EntireRow.Copy Sheets(NuevaHoja).Range("a" & Fila2)
Fila2 = Fila2 + 1
End If
'voy reflejando en el título del formulario el avance del
'trabajo:
Me.Caption = "revisando registro nro " & Celda.Row
Next Celda
MsgBox "Tarea finalizada"
'dejo un mensaje sobre el trabajo realizado:
Sheets(NuevaHoja).Select
Cells(1, 1) = "registros de la hoja " & cboHoja1.Text & " comparados con la hoja " & cboHoja2.Text
'destruyo los objetos, para liberar recursos:
Set Rng1 = Nothing
Set Rng2 = Nothing
Set Celda = Nothing
Unload Me
End Sub
Private Sub UserForm_Initialize()
'cargo las hojas presentes en el libro, al
'inicializarce el formulario
Dim Sht As Worksheet
For Each Sht In ActiveWorkbook.Sheets
cboHoja1.AddItem Sht.Name
cboHoja2.AddItem Sht.Name
Next Sht
'destruyo el objeto previamente creado
Set Sht = Nothing
End Sub
Private Sub cboHoja1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
'a este código lo pongo para que el usuario NO pueda borrar lo
'que está escrito dentro de los cuadros desplegables:
If KeyCode <> 0 Then
KeyCode = 0
End If
End Sub
Private Sub cboHoja2_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode <> 0 Then
KeyCode = 0
End If
End Sub
Como siempre, el
link a la descarga el archivo.
Suerte y gracias por todos los correos de agradecimiento que he recibido.
necesito ayuda, es algo similar, solo que la macro debe buscar coincidencias paraciase, ejemplo: 5.2 (Option Tire Pkg.) - 5.2 FSI R TRONIC QUATTRO SPYDER. el 5.2 es la coincidencia, cada dato esta en una hoja diferente y quiero que las junte a ambas en una tercera hoja. mi correo es chino5227@live.com.mx
ResponderEliminarhola estimado: el trabajo puede realizarse, aunque voy a necesitar mas datos. por ejemplo: ese "5.2" que mencionas ¿está siempre al principio de la cadena de texto, o puede encontrarse en cualquier lugar? enviame un archivo que contenga registros así tengo varios datos para tener un mejor panorama. quedo al aguardo de tus noticias. un abrazo y gracias por tu mensaje
ResponderEliminar