Buscar un dato de un libro a otro y me regrese el nombre de la hoja
Buscar el dato en excel. En otro libro y me regrese el nombre de la hoja donde esta el resultado. Buscando de un libro a otro. Me regrese mediante una formula
1 Respuesta
.04/11/16
Buenas, Rosy
Prueba con la siguiente rutina que asume que sólo tienes -en la sesión actual de MS Excel- el archivo donde dejar el nombre de la hoja y el archivo donde buscar el dato.
Desde luego deberás indicarle la dirección de una celda donde está el dato a buscar y en qué celda dejar el resultado. Desde luego, esto no puede hacerse mediante una fórmula.
Accede al Editor de VBA (Atajo: Alt + F11), allí inserta un módulo (Insertar-Módulo) y pega el siguiente código:
Sub TraeHoja() '---- Variables modificables ---- '=== ROSY, modifica estos datos de acuerdo a tu proyecto: DatoBuscar = "B2" 'Celda donde está el dato a buscar CeldaResultado = "C2" 'Celda donde dejar el nombre de la página Parcial = False 'False = Coincidencia Total - True = Encontrar parte del texto de Dato a Buscar '---- fin Variables ' '---- inicio de rutina: ' L_Destino = ActiveWorkbook.Name HojaDest = ActiveSheet.Name Buscar = Range(DatoBuscar).Value Application.ScreenUpdating = False On Error Resume Next ActiveWindow.ActivateNext If Err.Number = 0 Then Err.Clear On Error GoTo 0 L_Origen = ActiveWorkbook.Name dire = "" TipoCoinc = IIf(Parcial, xlPart, xlWhole) For Each LaHoja In Sheets LaHoja.Select On Error Resume Next dire = Cells.Find(What:=Buscar, LookAt:=TipoCoinc).Address(False, False) If Len(dire) > 1 Then Exit For On Error GoTo 0 Next Windows(L_Destino).Activate Sheets(HojaDest).Select If Len(dire) Then Range(CeldaResultado).Value = "Hoja: " & LaHoja.Name & "- Celda: " & dire Else Range(CeldaResultado).Value = ">>> NO Encontrado" End If Else Err.Clear On Error GoTo 0 ElTitulo = "NO HAY OTRO ARCHIVO" ElMensaje = "No se encontró archivo pra buscar dato" & Chr(10) & "El procedimiento se detiene aquí" & _ Chr(10) & "Lola!, NO MODIFICO NADA" & Chr(10) & "Abrir el archivo de Busqueda y disparar esta rutina nuevamente" TipoMSG = vbOKOnly + vbExclamation MsgBox ElMensaje, TipoMSG, ElTitulo End If End Sub
También hay una variable para que indiques si la coincidencia debe ser total o parcial.
Pruebala y dime si te funcionó.
Muy buen fin de semana.
Fer
.
Gracia fernando.. funciona muy bien. Solo que lo hace en una celda tendría que ver como se hace en toda una columna
.
Hola, Rosy
Y si. Era un escenario posible, aunque no lo hayas mencionado en tu pregunta original
Esta variante de la rutina anterior ejecuta la búsqueda para la lista que tengas en la columna B dejando el dato en C. Es decir que mantendremos las dos variables anteriores, pero ahora indican la primera celda donde está el dato a buscar y la primera donde dejar la hoja donde encuentre el dato (if any). Reemplaza la anterior por esta:
Sub TraeHoja() '---- Variables modificables ---- '=== ROSY, modifica estos datos de acuerdo a tu proyecto: DatoBuscar = "B2" 'Celda donde está el PRIMER dato a buscar CeldaResultado = "C2" 'Celda donde dejar el PRIMER nombre de la página Parcial = False 'False = Coincidencia Total - True = Encontrar parte del texto de Dato a Buscar '---- fin Variables ' '---- inicio de rutina: ' cont = 0 LaFila = 0 UltFila = ActiveSheet.Range(Left(DatoBuscar, 1) & Rows.Count).End(xlUp).Address L_Destino = ActiveWorkbook.Name HojaDest = ActiveSheet.Name TipoCoinc = IIf(Parcial, xlPart, xlWhole) Buscar = Range(DatoBuscar).Value Application.ScreenUpdating = False On Error Resume Next ActiveWindow.ActivateNext If Err.Number = 0 Then Set DESTINO = Workbooks(L_Destino).Sheets(HojaDest) Err.Clear On Error GoTo 0 L_Origen = ActiveWorkbook.Name Do While Range(DatoBuscar).Offset(LaFila).Address <= UltFila dire = "" Buscar = DESTINO.Range(DatoBuscar).Offset(LaFila).Value For Each LaHoja In Sheets LaHoja.Select On Error Resume Next dire = Cells.Find(What:=Buscar, LookAt:=TipoCoinc).Address(False, False) If Len(dire) > 1 Then Exit For On Error GoTo 0 Next If Len(dire) Then DESTINO.Range(CeldaResultado).Offset(LaFila).Value = "Hoja: " & LaHoja.Name & "- Celda: " & dire ContOK = ContOK + 1 Else DESTINO.Range(CeldaResultado).Offset(LaFila).Value = ">>> NO Encontrado" End If LaFila = LaFila + 1 cont = cont + 1 Loop Windows(L_Destino).Activate Sheets(HojaDest).Select Range(DatoBuscar).Select ElMensaje = IIf(cont = 0, "NO SE BUSCÓ DATO ALGUNO", "Se buscaron: " & cont & " linea" & IIf(cont > 1, "s", "") & Chr(10) & "Encontrando " & ContOK & " caso" & IIf(ContOK > 1, "s", "")) TipoMens = IIf(cont = 0, vbCritical, vbInformation) ElTitulo = IIf(cont = 0, "NO SE HIZO NADA", "TERMINADO!") Application.ScreenUpdating = True MsgBox ElMensaje, TipoMens, ElTitulo Set DESTINO = Nothing Else Err.Clear On Error GoTo 0 ElTitulo = "NO HAY OTRO ARCHIVO" ElMensaje = "No se encontró archivo pra buscar dato" & Chr(10) & "El procedimiento se detiene aquí" & _ Chr(10) & "Lola!, NO MODIFICO NADA" & Chr(10) & "Abrir el archivo de Busqueda y disparar esta rutina nuevamente" TipoMSG = vbOKOnly + vbExclamation MsgBox ElMensaje, TipoMSG, ElTitulo End If End Sub
Espero que te funcione OK.
Saludos
Fer
.
Gracias fernando. Justamente lo que estaba buscando.. se queda en la fila 5. Se finaliza cuando ya no encuentra el dato?
.
Hola, Rosy
De acuerdo a la celda que le hayas indicado donde empiece a buscar considera la última celda que tenga dato. Controla si tu celda inicial es B2, o cámbiala por la que corresponda a tu listado.
Si no encuentra el dato, deja en la columna que le haya indicado ">>>No Enocntrado" y sigue con la siguiente.
Luego me comentas si corrigiendo la celda inicial se resolvió tu problema.
Saludos
Fer
.
Si mi celdas son a2 y el resultado g2. Ya hice el cambio.. y tengo por ejemplo... 600 fiilas si lo busca bien hasta la 5
.
Y luego de la fila 5 ¿Qué hace? ¿Se detiene? ¿O coloca NO Encontrado?
¿Qué hay en la fila 6?
¿Podrías pegar -aqui- una imagen parcial de ese listado?
Aparte, recuerda colocar si Parcial = False (Coincidencia completa de lo que tengas en A) o Parcial = True (Basta que encuentre el texto de A en un fragmento de alguna celda del otro libro).
¡Gracias! en la fila 5 ya no hace nada. Se pone blanco. No aparece mensaje como si terminara la rutina.
.
Extraño, Rosy
En cualquier caso, debería llegar a un mensaje personalizado, donde la rutina te avisa qué hizo.
A menos que la celda A5 tenga una fórmula que dé ERROR no encuentro razón para que la macro se detenga sin aviso alguno.
Insisto, ¿Puedes colocar aquí una imagen de ese listado?
Saludos
Fer
.
.
Mmmm, creo que en este caso será más simple que me envíes ese archivo para que vea qué problema tiene . Simplemente escríbeme a:
Saludos
Fer
.
.
Ok, Rosy
Aquí te envío una variante de la rutina que debería funcionar OK en tu caso.
Reemplaza la anterior por esta:
Sub TraeHoja() '---- Variables modificables ---- '=== ROSY, modifica estos datos de acuerdo a tu proyecto: DatoBuscar = "A2" 'Celda donde está el PRIMER dato a buscar CeldaResultado = "G2" 'Celda donde dejar el PRIMER nombre de la página Parcial = False 'False = Coincidencia Total - True = Encontrar parte del texto de Dato a Buscar '---- fin Variables ' '---- inicio de rutina: ' cont = 0 LaFila = 0 UltFila = ActiveSheet.Range(Left(DatoBuscar, 1) & Rows.Count).End(xlUp).Offset(1).Address L_Destino = ActiveWorkbook.Name HojaDest = ActiveSheet.Name TipoCoinc = IIf(Parcial, xlPart, xlWhole) Buscar = Range(DatoBuscar).Value On Error Resume Next ActiveWindow.ActivateNext If Err.Number = 0 Then Application.ScreenUpdating = False Set DESTINO = Workbooks(L_Destino).Sheets(HojaDest) Err.Clear On Error GoTo 0 L_Origen = ActiveWorkbook.Name Do While DESTINO.Range(DatoBuscar).Offset(LaFila).Address <> UltFila dire = "" Buscar = Len(DESTINO.Range(DatoBuscar).Offset(LaFila).Value) Buscar = IIf(Len(Buscar), Buscar, "Z34!ewe") For Each LaHoja In Sheets LaHoja.Select On Error Resume Next dire = Cells.Find(What:=Buscar, LookAt:=TipoCoinc).Address(False, False) If Len(dire) > 1 Then Exit For On Error GoTo 0 Next If Len(dire) Then DESTINO.Range(CeldaResultado).Offset(LaFila).Value = "Hoja: " & LaHoja.Name & "- Celda: " & dire ContOK = ContOK + 1 Else DESTINO.Range(CeldaResultado).Offset(LaFila).Value = ">>> NO Encontrado" End If LaFila = LaFila + 1 cont = cont + 1 TEST = DESTINO.Range(DatoBuscar).Offset(LaFila).Address Loop Windows(L_Destino).Activate Sheets(HojaDest).Select Range(DatoBuscar).Select ElMensaje = IIf(cont = 0, "NO SE BUSCÓ DATO ALGUNO", "Se buscaron: " & cont & " linea" & IIf(cont > 1, "s", "") & Chr(10) & "Encontrando " & ContOK & " caso" & IIf(ContOK > 1, "s", "")) TipoMens = IIf(cont = 0, vbCritical, vbInformation) ElTitulo = IIf(cont = 0, "NO SE HIZO NADA", "TERMINADO!") Application.ScreenUpdating = True MsgBox ElMensaje, TipoMens, ElTitulo Set DESTINO = Nothing Else Err.Clear On Error GoTo 0 ElTitulo = "NO HAY OTRO ARCHIVO" ElMensaje = "No se encontró archivo pra buscar dato" & Chr(10) & "El procedimiento se detiene aquí" & _ Chr(10) & "Lola!, NO MODIFICO NADA" & Chr(10) & "Abrir el archivo de Busqueda y disparar esta rutina nuevamente" TipoMSG = vbOKOnly + vbExclamation MsgBox ElMensaje, TipoMSG, ElTitulo End If End Sub
Pruebala y dime si te anduvo para todas las filas.
Saludos
Fer
.
.
Oops!
Cierto dejé un control que no debía cuando probaba la rutina.
Usa esta, por favor:
Sub TraeHoja() '---- Variables modificables ---- '=== ROSY, modifica estos datos de acuerdo a tu proyecto: DatoBuscar = "A2" 'Celda donde está el PRIMER dato a buscar CeldaResultado = "G2" 'Celda donde dejar el PRIMER nombre de la página Parcial = False 'False = Coincidencia Total - True = Encontrar parte del texto de Dato a Buscar '---- fin Variables ' '---- inicio de rutina: ' cont = 0 LaFila = 0 UltFila = ActiveSheet.Range(Left(DatoBuscar, 1) & Rows.Count).End(xlUp).Offset(1).Address L_Destino = ActiveWorkbook.Name HojaDest = ActiveSheet.Name TipoCoinc = IIf(Parcial, xlPart, xlWhole) Buscar = Range(DatoBuscar).Value On Error Resume Next ActiveWindow.ActivateNext If Err.Number = 0 Then Application.ScreenUpdating = False Set DESTINO = Workbooks(L_Destino).Sheets(HojaDest) Err.Clear On Error GoTo 0 L_Origen = ActiveWorkbook.Name Do While DESTINO.Range(DatoBuscar).Offset(LaFila).Address <> UltFila dire = "" Buscar = DESTINO.Range(DatoBuscar).Offset(LaFila).Value Buscar = IIf(Len(Buscar), Buscar, "Z34!ewe") For Each LaHoja In Sheets LaHoja.Select On Error Resume Next dire = Cells.Find(What:=Buscar, LookAt:=TipoCoinc).Address(False, False) If Len(dire) > 1 Then Exit For On Error GoTo 0 Next If Len(dire) Then DESTINO.Range(CeldaResultado).Offset(LaFila).Value = "Hoja: " & LaHoja.Name & "- Celda: " & dire ContOK = ContOK + 1 Else DESTINO.Range(CeldaResultado).Offset(LaFila).Value = ">>> NO Encontrado" End If LaFila = LaFila + 1 cont = cont + 1 TEST = DESTINO.Range(DatoBuscar).Offset(LaFila).Address Loop Windows(L_Destino).Activate Sheets(HojaDest).Select Range(DatoBuscar).Select ElMensaje = IIf(cont = 0, "NO SE BUSCÓ DATO ALGUNO", "Se buscaron: " & cont & " linea" & IIf(cont > 1, "s", "") & Chr(10) & "Encontrando " & ContOK & " caso" & IIf(ContOK > 1, "s", "")) TipoMens = IIf(cont = 0, vbCritical, vbInformation) ElTitulo = IIf(cont = 0, "NO SE HIZO NADA", "TERMINADO!") Application.ScreenUpdating = True MsgBox ElMensaje, TipoMens, ElTitulo Set DESTINO = Nothing Else Err.Clear On Error GoTo 0 ElTitulo = "NO HAY OTRO ARCHIVO" ElMensaje = "No se encontró archivo pra buscar dato" & Chr(10) & "El procedimiento se detiene aquí" & _ Chr(10) & "Lola!, NO MODIFICO NADA" & Chr(10) & "Abrir el archivo de Busqueda y disparar esta rutina nuevamente" TipoMSG = vbOKOnly + vbExclamation MsgBox ElMensaje, TipoMSG, ElTitulo End If End Sub
Recuerda, además, que la variable "Parcial" está seteada a False, con lo que intenta buscar el texto completo de lo que pusiste en la columna A.
Saludos
Fer
.
- Compartir respuesta