Formulario de Excel en un libro, para buscar datos en otro

Estoy intentando crear un buscador en excel. Tengo una tabla de datos con múltiples columnas con encabezado (a modo de base de datos) que está en la hoja1 del LIBRO1. Hasta ahora buscaba en la misma con una macro de filtro avanzado que tenía en la hoja2 del mismo libro. Ocurre que ahora necesito que LIBRO1 esté compartido y esto implica deshabilitar las macros (implementé la manera de que la propia macro de búsqueda habilitará y deshabilitara el compartir libro, pero genera problemas cuando hay varios usuarios conectados a la vez en el LIBRO1). Por tanto quería intentar sacar la macro de Búsqueda a otro libro (LIBRO2, Hoja1), pero aún intentando adaptar la macro de filtro avanzado, no consigo que funcione para libros distintos. Así pido ayuda, por favor para:

Crear formulario de búsqueda en LIBRO2 de tal forma que tenga 5 o 6 textbox que coincida con 5 o 6 campos (encabezados) de mi base de datos (LIBRO1) de forma que introduciendo un dato en cualquiera de ellos me traiga a LIBRO2 (en la misma hoja, por ejemplo), los campos que yo quiera del registro correspondiente a la búsqueda

Pongo un ejemplo: En LIBRO2 Tengo 5 textbox de búsqueda, pero he decidido buscar por textbox1(expediente) un número correspondiente a "expediente" de LIBRO1. La macro va a LIBRO1, lo abre, localiza en la columna "expediente" todos los expedientes que coincidan con el número introducido (por ejemplo tres registros, tres filas) y me muestra en el mismo LIBRO2, HOJA1 los datos de los campos "Nombre", "referencia", "fecha" y "firma" para cada uno de los registros encontrado, es decir 3 filas - he tomado como ejemplo 4 de los 20 campos que tiene cada línea en LIBRO1). Los campos de búsqueda (textbox) como los campos elegidos para mostrar tras la búsqueda serán siempre los mismos.

Esto es lo que yo he pensado, pero estoy abierto a cualquier otra sugerencia que al final consiga mi objetivo, que no es otro que conseguir buscar determinados datos en un libro excel compartido.

1 respuesta

Respuesta
1

Seria de la siguiente manera

Private Sub CommandButton1_Click()

Application.ScreenUpdating = False

      Ruta = "C:\Users\dani.martinez\Desktop\rntt\"

nombre = "rntt.xls"
Workbooks.Open Filename:=Ruta & nombre
    Sheets("results").Select

 ......tu procedimiento

    Windows(nombre).Activate
    ActiveWindow.Close

Application.ScreenUpdating = true

end sub

Donde:

Ruta: es la ruta donde estar en libro compartido

Nombre: nombre del libro1

Results: es el nombre de la hoja del libro1

Si te silve no olvides valorar para cerrar la pregunta 

Gracias a ambos por contestar. Con todo el respeto, Frank, estando muy agradecido por tu interés, me centraré en el código que me envía Aneudys.

No controlo mucho Visual y apoyándome en tu código y en otros ejemplos publicados he construido un poco lo que yo pretendía.... pero el resultado no es satisfactorio.

Private Sub CommandButton1_Click()
Application.ScreenUpdating = False
      Ruta = "H:\BIBLIOTECA\PRUEBAS\aNEUDYS\"
NOMBRE = "prueba2.xlsx"
Workbooks.Open Filename:=Ruta & NOMBRE
    Sheets("hoja1").Select
'Mi Procedimiento
    Dim RangeDNI As Object
    Dim DNI As String, AyN As String, Enviado_a_Servicios As String
    Dim Respuesta As Single
' En A1: DNI. En B1: NOMBRES. EN C1 Enviado a Servicios
    [A1:C1].ClearContents
    TextBox2.Value = ""
    DNI = TextBox1.Text
    Application.ScreenUpdating = False
    Workbooks.Open Filename:="H:\BIBLIOTECA\PRUEBAS\aNEUDYS\PRUEBA2.XLSX"
    Set RangeDNI = Cells.Find(What:=DNI, LookIn:=xlValues, LookAt:=xlPart, _
        SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)
    If RangeDNI Is Nothing Then
        Respuesta = MsgBox("DNI no hallado")
        GoTo Fin
    End If
' Tomo el valor de AyN (DNI no hace falta pues ya lo tengo)
    NOMBRES = RangeDNI.Offset(0, 1).Value
    Enviado_a_Servicios = RangeDNI.Offset(0, 1).Value
' Asigno AyN al TextBox2
    TextBox2.Value = NOMBRES
    TextBox3.Value = Enviado_a_Servicios
'Asigno DNI y AyN a las celda A1 y B1 respectivamente
    [BÚSQUEDA1.xlsm!A1].Value = DNI
    [BÚSQUEDA1.xlsM!B1].Value = NOMBRES
    [BÚSQUEDA1.xlsM!C1].Value = Enviado_a_Servicios
Fin:
    'ActiveWindow.Close SaveChanges:=False
    'Application.ScreenUpdating = True
    'vuelvo con código Aneudys
    Windows(NOMBRE).Activate
    ActiveWindow.Close
Application.ScreenUpdating = True
End Sub

Esto es, un formulario que está en el libro "Búsqueda1" con el que yo pueda buscar en el libro "Prueba2" (base de datos) por varios campos (textbox del formulario: dni, nombres,Enviado_a_Servicios, por ejemplo) de entre los más de 15 campos que hay en "Prueba2". El resultado debe aparecer a modo de informe que me muestre en la HOJA1 de "Búsqueda1" (por ejemplo) la información de los campos que yo haya predeterminado (que no tienen porqué coincidir con los que he utilizado para la búsqueda, ni tienen que ser consecutivos en "Prueba2"). Solo vale para esto, el resultado se borrará cuando vuelva a hacer otra búsqueda.

El resultado que obtengo ahora con este código, es que me muestra solo DNI, NOMBRES y el campo ENVIADO_A_SERVICIOS me repite el contenido de NOMBRES. Y lo peor de todo es que solo he conseguido esto porque los campos elegidos para filtrar (DNI, NOMBRES Y ENVIADO_A SERVICIOS) son consecutivos en "Prueba2" y no sé como hacer para filtrar y que me muestre campos  alternos (los campos que elija  tanto para búsqueda como para mostrar en "el informe" será fijos ya para siempre, no se trata de ir variando en cada búsqueda).

Uf, agradecería revisión del código y propuesta al respecto. Un saludo

A ver si entendí lo que necesitas es que busque un código o nombre en tu libro base detos

1 - que esa búsqueda la copien en la celda a1

2 - que la búsqueda la fila b y c se copie en los textbox 1 y 2

3 - se limpie los cambio y para una búsqueda nueva

Prueba con este

Private Sub CommandButton1_Click()

Application.ScreenUpdating = False
Ruta = "H:\BIBLIOTECA\PRUEBAS\aNEUDYS\"
NOMBRE = "prueba2.xlsx"
Workbooks.Open Filename:=Ruta & NOMBRE
    Sheets("hoja1").Select
    Set h = Sheets("hoja1")
    Set b = h.Columns("A").Find(TextBox1)
    If b Is Nothing Then
    TextBox2.Value = h.Cells(b.Row, "B")
    TextBox3.Value = h.Cells(b.Row, "i")
    Else
    MsgBox "DNI no hallado"
    End If    
    Windows(NOMBRE).Activate
    ActiveWindow.Close
Application.ScreenUpdating = True
End Sub

Donde

1 - la búsqueda la hace en la columna A del libro base de datos osea tu libro compartido

2 - el textbox2 se carga con los datos que tengas en la columna B

3 - el texbox3 con lo datos de la columna I

4 - si lo que busca no estas un mensaje DNI no hallado

Eso seria para cargar la búsqueda en el userform

En tu procedimiento tiene un error empiezas abrinedo el libro y luego le dices que lo vuelva abrir

Private Sub CommandButton1_Click()
estas parte
Ruta = "H:\BIBLIOTECA\PRUEBAS\aNEUDYS\"
NOMBRE = "prueba2.xlsx"
Workbooks.Open Filename:=Ruta & NOMBRE
y estas otra hacen lo mismo
Workbooks.Open Filename:="H:\BIBLIOTECA\PRUEBAS\aNEUDYS\PRUEBA2.XLSX"
End Sub

¿Lo qué si quiero sabe es que columnas quieres copier en la hoja porquwe veo que la quieres copier en una hoja?

¡Gracias por tu rapidez en contestar! Le hecho un vistazo en cuanto pueda y te cuento.

Perdón por el retraso.

He estado probando tu propuesta y algo he debido hacer mal porque me da un error. Te lo pongo a continuación como un pantallazo del depurador.

Y ahora intento explicar lo que quiero para contestar a tu pregunta de lo de copiar en qué hoja:

Intento conseguir un buscador que realice un "informe" en el libro "Búsqueda 1" de los resultados de la búsqueda en una base datos "prueba2.xlsx", libro compartido. El botón que abre el formulario de búsqueda está en la "Hoja1" del "búsqueda1", a la derecha y al ejecutar la búsqueda, me mostrará los datos del registro buscado en la misma hoja 1. Pongo otra imagen de lo que necesito:

Los 3 texbox del formulario deberían ser campos de búsqueda (no solo buscar por la columna A que es el DNI) y estos campos no tienen porque ser consecutivos en prueba2.xlsx (yo he puesto ejemplo DNI, NOmbre y Apellidos, pero en realidad aún no he decidido que campos serán, por lo que sería interesante que el código refleje nombre de la columna (A, D, F por ejemplo) para que finalmente yo elija cuales serán criterios de búsqueda. Lo de que metido un campo en un text box me rellene el resto, me da un poco igual porque son campos de búsqueda que deberían ser "complementarios" (condición "o": B´suqueda por DNI y que además tenga este nombre).

El resultado de la búsqueda me devuelve los datos de las columnas del registro que necesite de prueba2.xlsx (en la imagen he elegido 5 campos, que no tienen que ser consecutivos, es decir, que en en el código yo pueda indicar qué campos quiero que me muestre el informe y o me trae las cabeceras o ya las pongo yo directamente ). El llamado "informe" lo muestra por ejemplo en la A3 de la "hoja1" de "Búsqueda1", y mostrará tantos registros como coincidencias haya en los criterios de búsqueda. Este "informe" se sobre escribirá con la siguiente búsqueda, es efímero y para una consulta determinada, que no modifica la base de datos. Solo dura hasta la siguiente búsqueda.

Espero haberme sabido explicar. Muchas gracias por tu interés, espero agradecido tu respuesta.

Perdón por el retraso.

He estado probando tu propuesta y algo he debido hacer mal porque me da un error. Te lo pongo a continuación como un pantallazo del depurador.

Y ahora intento explicar lo que quiero para contestar a tu pregunta de lo de copiar en qué hoja:

Intento conseguir un buscador que realice un "informe" en el libro "Búsqueda 1" de los resultados de la búsqueda en una base datos "prueba2.xlsx", libro compartido. El botón que abre el formulario de búsqueda está en la "Hoja1" del "búsqueda1", a la derecha y al ejecutar la búsqueda, me mostrará los datos del registro buscado en la misma hoja 1. Pongo otra imagen de lo que necesito:

Los 3 texbox del formulario deberían ser campos de búsqueda (no solo buscar por la columna A que es el DNI) y estos campos no tienen porque ser consecutivos en prueba2.xlsx (yo he puesto ejemplo DNI, NOmbre y Apellidos, pero en realidad aún no he decidido que campos serán, por lo que sería interesante que el código refleje nombre de la columna (A, D, F por ejemplo) para que finalmente yo elija cuales serán criterios de búsqueda. Lo de que metido un campo en un text box me rellene el resto, me da un poco igual porque son campos de búsqueda que deberían ser "complementarios" (condición "o": B´suqueda por DNI y que además tenga este nombre).

El resultado de la búsqueda me devuelve los datos de las columnas del registro que necesite de prueba2.xlsx (en la imagen he elegido 5 campos, que no tienen que ser consecutivos, es decir, que en en el código yo pueda indicar qué campos quiero que me muestre el informe y o me trae las cabeceras o ya las pongo yo directamente ). El llamado "informe" lo muestra por ejemplo en la A3 de la "hoja1" de "Búsqueda1", y mostrará tantos registros como coincidencias haya en los criterios de búsqueda. Este "informe" se sobre escribirá con la siguiente búsqueda, es efímero y para una consulta determinada, que no modifica la base de datos. Solo dura hasta la siguiente búsqueda.

Espero haberme sabido explicar. Muchas gracias por tu interés, espero agradecido tu respuesta.

Este es mi correo [email protected]

Escribe la pregunta del tema y el muestrame la hoja del libro de la base de dato

Y las columna que te interesa pára el informe

Hecho, te envié el correo.

¡Gracias por todo!

No olvides valorar la pregunta para cerrar la

¡Gracias!  Es perfecto. Solo lo adapto a los datos reales y con una pequeña modificación de última hora lo dejo funcionando. Muy amable. Respuesta EXCELENTE

¡Gracias! 

Todo correcto y funcionando. Ahora le daré un toquecillo  "personal" y queda perfecto.

 EXCELENTE. ¡Gracias!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas