Excel - BUSCAR DATOS DE RANGOS y MOSTRARLOS EN USEFORM

 
Vista:
sin imagen de perfil
Val: 179
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

BUSCAR DATOS DE RANGOS y MOSTRARLOS EN USEFORM

Publicado por Quico (106 intervenciones) el 02/02/2019 08:43:31
Hola. He creado un botón macro InputBox (lo he llamado 'LOCALIZAR') y que tiene la función de comprobar si existe el dato que le introduzo.
Si no existe, me devuelve un mensaje de error, y si existe: ME HACE UNA SELECCION DE LA CELDA (necesito que me situe el valor sin alterame colores o estilos).
¡Esto funciona correctamente!

Pero se me ha ocurrido, que era buena idea mejorarlo gráficamente a través de una 'UseForm', más bonito gráficamente y dónde podría mejorar a su vez, el que me mostrara más datos en relación al 'valor a buscar'. Y esto, antes de que me HAGA LA LOZALIZACIÓN Y SELECCION DE LA CELDA (que sería la función final del boton 'Buscar' en la Useform)
¡Pero era de esperar.....no he sabido resolverlo! :-(

¿Alguien podría ayudarme con el archivo adjunto?

En teoría, en el TextBox1 he de introducir el 'NombreBuscado', y en relación a:
1. SI EXISTE el valor, me gustaría completar 3 cuadros informativos en relación al 'NombreBuscado' de esta manera:
TextBox2 = Range(C6:hasta dónde termine)
TextBox3 = Range(K6:hasta dónde termine)
TextBox4 = Range(J6:hasta dónde termine)

*nota:Si algún campo esta vacio (pues eso ocurre a menudo), pues no pone nada y ya esta....

2. SI NO EXISTE el valor, hay diseñado en la UseForm un cuadro 'lblMensaje' con una respuesta de que no ha encontrado el 'NombreBuscado' ..

Muchas gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 179
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

BUSCAR DATOS DE RANGOS y MOSTRARLOS EN USEFORM

Publicado por Quico (106 intervenciones) el 03/02/2019 09:02:52
¡Creo que el archivo estaba mal adjunto.!
En todo caso, lo he vuelto a subir.
Esta es la macro que me falla:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
Private Sub CommandButton1_Click()
'
'Declaramos las variables.
Dim busco
Dim filx As Long
Dim Nombre As String
Dim Rango As Range
Dim Titulo As String
'
Titulo = "Workstreams"
 
Set busco = ActiveSheet.Range("B7:B" & ActiveSheet.Range("B" & Rows.Count).End(xlUp).Row).Find(Val(TextBox1), LookIn:=xlValues, LookAt:=xlWhole)
 
'si encuentra el dato en col B copia el resto de los campos en los controles del formulario
If Not busco Is Nothing Then
 
'guardo la fila encontrada
filx = busco.Row
TextBox2 = Range("C" & filx)
TextBox3 = Range("K" & filx)
TextBox4 = Range("J" & filx)
 
Else
'si no encuentra datos deja los controles limpios
TextBox2 = "": TextBox3 = "": TextBox4 = "":
End If
 
'opcional: posicionarse en el primer control
TextBox2.SetFocus
 
'En caso de error...
On Error GoTo ErrorHandler
'
Set Celda = Range("B:B").Find(What:=busco, LookAt:=xlPart)
'
'Validamos si el valor es numérico.
NombreBuscado = Me.TextBox1.Value
If IsNumeric(busco) Then
    busco = CDbl(busco)
End If
'
'Asignamos a la variable Nombre el resultado del BUSCARV.
Nombre = Application.WorksheetFunction.VLookup(busco, Rango, 3, 0)
'
'Pasamos el resultado al cuadro de texto (TextBox).
With Me
    .TextBox2.Value = Nombre
    .lblMensaje.Visible = False
End With
'
Exit Sub
'
'De haberse encontrado un error mostramos mensajes.
ErrorHandler:
If Err.Number = 1004 Then
    With Me
        .lblMensaje.Caption = "No hemos encontrado esta entrada en la lista."
        .lblMensaje.Visible = True
    End With
Else
    MsgBox "Ha ocurrido un error: " & Err.Description, vbExclamation, Titulo
End If
End Sub
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

BUSCAR DATOS DE RANGOS y MOSTRARLOS EN USEFORM

Publicado por Antoni Masana (2477 intervenciones) el 04/02/2019 07:36:37
Primer ERROR

1
2
Set busco = ActiveSheet.Range("B7:B" & ActiveSheet.Range("B" & Rows.Count).End(xlUp).Row). _
                        Find(Val(TextBox1), LookIn:=xlValues, LookAt:=xlWhole)

Si el Story ID es alfanumérico ¿para que haces un VAL()?

Corregido:

1
2
Set busco = ActiveSheet.Range("B7:B" & ActiveSheet.Range("B" & Rows.Count).End(xlUp).Row). _
                        Find(TextBox1.Text, LookIn:=xlValues, LookAt:=xlWhole)


Segundo ERROR

Envías el foco a un objeto que no es editable.


Tercer ERROR

A partir de aqui el código no tiene ni pies ni cabeza:

1
2
3
4
5
6
7
8
9
10
11
12
13
'En caso de error...
On Error GoTo ErrorHandler
'
Set Celda = Range("B:B").Find(What:=busco, LookAt:=xlPart)
'
'Validamos si el valor es numérico.
NombreBuscado = Me.TextBox1.Value
If IsNumeric(busco) Then
    busco = CDbl(busco)
End If
'
'Asignamos a la variable Nombre el resultado del BUSCARV.
Nombre = Application.WorksheetFunction.VLookup(busco, Rango, 3, 0)

¿No hemos dicho que el NombreBuscado es Alfanumérico?
¿Para que pregunta si es número?
¿Que vuelve a buscar?
¿Donde Busca?


Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 179
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

BUSCAR DATOS DE RANGOS y MOSTRARLOS EN USEFORM

Publicado por Quico (106 intervenciones) el 04/02/2019 17:38:34
Hola Antoni.

Gracias por la respuesta.
El origen 'del sin sentido' es porque trate de emular (sin éxito, claro esta!) una macro en la que con solo poner un VALOR (Story ID), el resto de valores se situaban automáticamente en sus correspondientes 'TextBox'.
Cierto que el si el valor es alfanumético, se me pasó ese primer error. :-(
No obstante, no se como llevar correctamente los datos que necesito a su correspondiente 'TextBox', aún dándole los parámetros:

1
2
3
4
5
6
7
TextBox2 = Range("C" & filx)
TextBox3 = Range("K" & filx)
TextBox4 = Range("J" & filx)
Else
'si no encuentra datos deja los controles limpios
TextBox2 = "": TextBox3 = "": TextBox4 = "":
End If

Claro está, que quizá existe una manera más sencilla de crear una macro con la 'UseForm' para buscar todos los datos de una misma fila, solo con el numero 'Story ID'.
No sé por dónde guiarme para darle sentido.....

Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

BUSCAR DATOS DE RANGOS y MOSTRARLOS EN USEFORM

Publicado por Antoni Masana (2477 intervenciones) el 05/02/2019 08:24:04
Este es el código.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
Option Explicit
 
Private Sub UserForm_Initialize()
    '
    'Ocultamos controles.
    With Me
        .TextBox2.Enabled = False
        .lblMensaje.Caption = ""
    End With
    '
End Sub
 
Private Sub CommandButton1_Click()
    Dim busco
    Dim Nombre As String
    Dim Rango As String
 
    Rango = "B7:B" & ActiveSheet.Range("B" & Rows.Count).End(xlUp).Row
    Set busco = ActiveSheet.Range(Rango).Find(TextBox1.Text, LookIn:=xlValues, LookAt:=xlWhole)
 
    If Not busco Is Nothing Then
        TextBox2 = Range("C" & busco.Row)
        TextBox3 = Range("K" & busco.Row)
        TextBox4 = Range("J" & busco.Row)
        lblMensaje.Caption = ""
    Else
        TextBox2.Text = ""
        TextBox3.Text = ""
        TextBox4.Text = "":
        lblMensaje.Caption = "No hemos encontrado esta entrada en la lista."
    End If
    TextBox1.SetFocus
End Sub

Pero hay otra forma de buscar:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Option Explicit
 
Private Sub UserForm_Initialize()
    With Me
        .TextBox2.Enabled = False
        .lblMensaje.Caption = ""
    End With
    '
End Sub
 
Private Sub CommandButton1_Click()
    Dim busco
    Dim Nombre As String
    Dim Rango As String, Fila As Long
 
    TextBox2.Text = ""
    TextBox3.Text = ""
    TextBox4.Text = "":
    lblMensaje.Caption = "No hemos encontrado esta entrada en la lista."
 
    Fila = 7
    While Cells(Fila, "B") <> ""
        If TextBox1.Text = Cells(Fila, "B") Then
            TextBox2 = Range("C" & Fila)
            TextBox3 = Range("K" & Fila)
            TextBox4 = Range("J" & Fila)
            lblMensaje.Caption = ""
        End If
        Fila = Fila + 1
    Wend
    TextBox1.SetFocus
End Sub

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 179
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

BUSCAR DATOS DE RANGOS y MOSTRARLOS EN USEFORM

Publicado por Quico (106 intervenciones) el 06/02/2019 00:09:12
Buenas noches Antonio.

muchas gracias de nuevo.
Esta macro con 'Useform' me cuesta más de entender.
¡Aunque por lo menos ahora, entiendo como indicarle la relación de 'TextBox' respecto a las columnas dónde encontrar la info!

Sin embargo se me escapan 2 cosas:

1. Pensaba que en el 'TextBox1' no hacia falta poner el nombre completo del 'Story ID' y con solo poner el número ya me encontraba la celda. (por ejemplo, si abre mi excel adjunto podrá ver que en el botón-macro 'Localizar', me encuentra la 'Story ID' tanto si pongo 11415, como LFPWS-11415.
¿Como le puedo indicar que con solo los números ya localice la 'Stoy ID'?

2. En la macro, me ha indicado la entrada: lblMensaje.Caption = "No hemos encontrado esta entrada en la lista."
Sin embargo, si introduzo un número inexistemte, no se me muestra ningún mensaje en el campo 'ib1Mensaje'.

Adjunto el excel con la 'Useform' que creo que es como se ve más claro.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

BUSCAR DATOS DE RANGOS y MOSTRARLOS EN USEFORM

Publicado por Antoni Masana (2477 intervenciones) el 06/02/2019 07:41:12
Pregunta 1:

Todo depende de la forma de buscar, en mis dos ejemplos he puesto que la coincidencia sea exacta, ahora te pongo los mismos codigos pero con los cambios para que encuentre si contiene el texto buscado.

CÓDIGO - 1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Option Explicit
 
Private Sub UserForm_Initialize()
    '
    'Ocultamos controles.
    With Me
        .TextBox2.Enabled = False
        .lblMensaje.Caption = ""
    End With
    '
End Sub
 
Private Sub CommandButton1_Click()
    Dim busco
    Dim Nombre As String
    Dim Rango As String
 
    Rango = "B7:B" & ActiveSheet.Range("B" & Rows.Count).End(xlUp).Row
 
'    Set busco = ActiveSheet.Range(Rango).Find(TextBox1.Text, LookIn:=xlValues, LookAt:=xlWhole)
     Set busco = ActiveSheet.Range(Rango).Find(What:=TextBox1.Text, LookAt:=xlPart)
 
    If Not busco Is Nothing Then
        TextBox2 = Range("C" & busco.Row)
        TextBox3 = Range("K" & busco.Row)
        TextBox4 = Range("J" & busco.Row)
        lblMensaje.Caption = ""
    Else
        TextBox2.Text = ""
        TextBox3.Text = ""
        TextBox4.Text = "":
        lblMensaje.Caption = "No hemos encontrado esta entrada en la lista."
    End If
    TextBox1.SetFocus
End Sub

CÓDIGO - 2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
Option Explicit
 
Private Sub UserForm_Initialize()
    With Me
        .TextBox2.Enabled = False
        .lblMensaje.Caption = ""
    End With
    '
End Sub
 
Private Sub CommandButton1_Click()
    Dim busco
    Dim Nombre As String
    Dim Rango As String, Fila As Long
 
    TextBox2.Text = ""
    TextBox3.Text = ""
    TextBox4.Text = "":
    lblMensaje.Caption = "No hemos encontrado esta entrada en la lista."
 
    Fila = 7
    While Cells(Fila, "B") <> "" And Fila <= 2^20
'        If TextBox1.Text = Cells(Fila, "B") Then
        If InStr(Cells(Fila, "B"), TextBox1.Text) > 0 Then
            TextBox2 = Range("C" & Fila)
            TextBox3 = Range("K" & Fila)
            TextBox4 = Range("J" & Fila)
            lblMensaje.Caption = ""
            Fila=2^20
        End If
        Fila = Fila + 1
    Wend
    TextBox1.SetFocus
End Sub

Pregunta 2

En el segundo código antes de buscar limpio los TEXTBOX y pongo el texto en el mensaje, Busca el ID si lo encuentra rellena los TextBox y borra el mensaje si no lo encuentra ya tengo los campos vacíos y el mensaje puesto.
Podría hacerlo al revés, buscar y si no lo encentro limpio y pongo mensaje pero entonces necesito hacer una condición para saber si se encontró el valor.
En el código faltaba un detalle y es salir del bucle si encuentra el dato.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 179
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

BUSCAR DATOS DE RANGOS y MOSTRARLOS EN USEFORM

Publicado por Quico (106 intervenciones) el 06/02/2019 18:10:21
Hola Antonio.
Una vez más, has dado en el clavo.

No obstante:
En el CÓDIGO 2
Siempre se produce un error de depuración en:
While Cells(Fila, "B") <> "" And Fila <= 2 ^ 20

Pero no comprendo esta sintaxis...¡la verdad!

De todas formas, en el CÓDIGO 1 si funciona bien todo. :-)
y entiendo la diferencia para buscar entre:

Set busco = ActiveSheet.Range(Rango).Find(TextBox1.Text, LookIn:=xlValues, LookAt:=xlWhole)
Set busco = ActiveSheet.Range(Rango).Find(What:=TextBox1.Text, LookAt:=xlPart)


Muchas gracias!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

BUSCAR DATOS DE RANGOS y MOSTRARLOS EN USEFORM

Publicado por Antoni Masana (2477 intervenciones) el 06/02/2019 19:50:57
El segundo codigo estaba mal

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Private Sub CommandButton1_Click()
    Dim busco
    Dim Nombre As String
    Dim Rango As String, Fila As Long, Fin As Boolean
 
    TextBox2.Text = ""
    TextBox3.Text = ""
    TextBox4.Text = "":
    lblMensaje.Caption = "No hemos encontrado esta entrada en la lista."
 
    Fila = 6
    Fin = False
    While Cells(Fila, "B") <> "" And Not Fin
        If InStr(Cells(Fila, "B"), TextBox1.Text) > 0 Then
            TextBox1 = Range("B" & Fila)
            TextBox2 = Range("C" & Fila)
            TextBox3 = Range("K" & Fila)
            TextBox4 = Range("J" & Fila)
            lblMensaje.Caption = ""
            Fin = True
        End If
        Fila = Fila + 1
    Wend
    TextBox1.SetFocus
End Sub

La primera linea es la 6 y no la 7
El While tiene dos condiciones mientras encuentre celdas con datos y no termine
Cuando encuentra el primer código que cumple la condición finaliza el bucle modificando la variable Fin.
Además completo el TextBox1

Este método es el tradicional pero me gusta mas el del Find porque seguro que es más rápido.

Yo es que soy muy tradicional y algunas de las cosas de Excel no acaban de ser ciertas del todo.

Por ejemplo si usas los comandos para saber cual es la última fila y columna de datos funciona muy bien hasta que borras la hoja y en lugar de marcar la celda A1 te marca los última posición con datos que recuerda.

Y tengo una hoja, con 700 mil líneas con datos, a principio de año borro 500 mil, me voy a la última línea de datos y se va a la 700 mil y no a la 200 mil.
Lo solucione pero tiene truco.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar