Excel - Valores de un listbox relacionado con otro listbox

 
Vista:
Imágen de perfil de Jorge

Valores de un listbox relacionado con otro listbox

Publicado por Jorge (39 intervenciones) el 12/08/2021 06:36:02
Hola amigos programadores, espero me ayuden con este problema que tengo... He estado diseñando una aplicación en Excel referente a registros de expedientes y he estado utilizando todos los conocimientos que he ido adquiriendo en este trabajo. Mi siguiente consulta es la siguiente y tratare de ser lo más breve, para ello prepare una especie de mapa mental de acuerdo a la funcionalidad de la aplicación y lo que deseo que haga la aplicación:

rect1126

Tal como trato de explicar en la imagen, tengo una hoja llamada "data" que es donde se almacena la información que ingreso en el formulario, debido a que es una base de datos referente a expedientes, pueden haber mas involucrados, de tal manera que cada registro en "data" cuenta con un "ID" único y para relacionar el involucrado principal con los involucrados secundarios tengo en mi formulario "ListBox1" que cumple la función de cargar y mostrarme los demás involucrados, dicha información se almacena en otra hoja por nombre "otros" que cuentan con el "ID" de mi registro principal en mi hoja "data".

Cuando hago una consulta de una cédula, "ListBox2" me muestra todos los informes que se le han aperturado a esa persona, sin embargo, si en algún informe hay otros involucrados, "ListBox1" me va a tener que mostrar la información de esas otras personas indicando en el indice el "ID" del registro a la cual esta vinculado.

Pido disculpas por el alargue, ahora la consulta: El problema esta en "ListBox1" que debe mostrarme simplemente los registros vinculados a los informes que se presentan en "ListBox2" que corresponden a la cédula.

He intentado hacerlo de mil maneras pero no obtengo el resultado deseado, en este caso utilice este código que fue el mas cercano al resultado que esperaba, sin embargo "ListBox1" me sigue arrojando registros de la hoja "otros" que no están relacionados al informe o los informes que corresponden al involucrado principal.

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
'Código para buscar y captar los datos del involucrado al presionar la tecla "INTRO" de acuerdo a la cédula
'
Private Sub cedula_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer): On Error Resume Next
Dim Fila As Long, DATAPAD As Long, otros As Long, i As Long
 
DATAPAD = Hoja1.Range("A" & Rows.Count).End(xlUp).Row 'hoja "data"
Fila = Hoja3.Range("A" & Rows.Count).End(xlUp).Row 'hoja "personal"
otros = Hoja4.Range("A" & Rows.Count).End(xlUp).Row 'hoja "otros"
 
ListBox1.Clear
ListBox2.Clear
 
If KeyCode = 13 Then
     'Función BUSCARV al VLookup:
     With WorksheetFunction
     siglas = .VLookup(Val(cedula), Hoja3.Range("A2:E" & Fila), 2, 0)
     involucrado = .VLookup(Val(cedula), Hoja3.Range("A2:E" & Fila), 3, 0)
     unidad = .VLookup(Val(cedula), Hoja3.Range("A2:E" & Fila), 4, 0)
     estatus = .VLookup(Val(cedula), Hoja3.Range("A2:H" & Fila), 5, 0)
 
     'Busca alguna coincidencia en DATAPAD que facilite el autollenado de datos
     graduacion = .VLookup(Val(cedula), Hoja1.Range("B2:H" & DATAPAD), 5, 0)
     instituto = .VLookup(Val(cedula), Hoja1.Range("B2:H" & DATAPAD), 6, 0)
     promocion = .VLookup(Val(cedula), Hoja1.Range("B2:H" & DATAPAD), 7, 0)
     foto.Picture = LoadPicture(.VLookup(Val(cedula), Hoja1.Range("B2:AI" & DATAPAD), 34, 0))
     End With
 
    'Aqui añadimos los datos al listbox2
    For i = 2 To DATAPAD + 1
        If UCase(Hoja1.Cells(i, 2)) Like "*" & UCase(cedula) & "*" Then
            With ListBox2
                .AddItem
                .List(.ListCount - 1, 0) = Hoja1.Cells(i, 1) 'ID
                .List(.ListCount - 1, 1) = Hoja1.Cells(i, 18) 'Tipo de Informe
                If Hoja1.Cells(i, 21) = "" Then
                .List(.ListCount - 1, 2) = Hoja1.Cells(i, 19) & " " & Hoja1.Cells(i, 20) 'Número de Informe
                Else
                .List(.ListCount - 1, 2) = Hoja1.Cells(i, 21) 'Nro. Oficio (Breve o Nota Informativa)
                End If
                .List(.ListCount - 1, 3) = Hoja1.Cells(i, 24) 'Fecha de emision
                .List(.ListCount - 1, 4) = Hoja1.Cells(i, 14) 'Causa
                .List(.ListCount - 1, 5) = Hoja1.Cells(i, 34) 'Decision
            End With
 
            'Aqui añadimos los datos relacionados de los registros al listbox1
            'la cual me esta arrojando registros que no se relacionan a los informes del involucrado principal
            '
            With ListBox1
                .AddItem
                .List(.ListCount - 1, 0) = Hoja4.Cells(i, 1) 'ID
                .List(.ListCount - 1, 1) = Hoja4.Cells(i, 2) 'CEDULA
                .List(.ListCount - 1, 2) = Hoja4.Cells(i, 3) 'SIGLAS
                .List(.ListCount - 1, 3) = Hoja4.Cells(i, 4) 'NOMBRE
            End With
 
        End If
    Next i
End If
 
End Sub
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
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

Valores de un listbox relacionado con otro listbox

Publicado por Antoni Masana (2478 intervenciones) el 12/08/2021 17:10:46
Si lo que quieres es que lo que tenga el ListBox1 corresponda a lo que tiene el ListBox2.

Pregunta:

El ListBox2 lo rellenas en función del filtro de la CEDULA ¿Correcto? Para una misma ID en las dos hojas (DATA y OTROS) ¿tienen la misma CEDULA?. Si la respuesta es SI llena el ListBox1 con el mismo filtro. Si la respuesta es NO no lo entiendo.

Otra opción rellena el ListBox2 después al rellenar el ListBox1 para cada ID verifica que este el el ListBox2.

En el primer caso tu macro debería funcionar pero por la imagen la CEDULA, que no se lo que es, no hay una relación entre las ID de una hoja y la otra.

Te pongo el codigo de la segunda opción:

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
Private Sub cedula_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer): On Error Resume Next
    Dim Fila As Long, DATAPAD As Long, otros As Long, i As Long
    Dim Tabla_ID as String
 
    DATAPAD = Hoja1.Range("A" & Rows.Count).End(xlUp).Row 'hoja "data"
    Fila = Hoja3.Range("A" & Rows.Count).End(xlUp).Row 'hoja "personal"
    otros = Hoja4.Range("A" & Rows.Count).End(xlUp).Row 'hoja "otros"
 
    ListBox1.Clear
    ListBox2.Clear
 
    If KeyCode = 13 Then
        ...
 
        ' ---&--- Aqui añadimos los datos al listbox2
 
        For i = 2 To DATAPAD + 1
            If UCase(Hoja1.Cells(i, 2)) Like "*" & UCase(cedula) & "*" Then
                Tabla_ID = Tabla_ID & Hoja1.Cells(i, 1) & "·"
                With ListBox2
                    .AddItem
                    .List(.ListCount - 1, 0) = Hoja1.Cells(i, 1) 'ID
                    .List(.ListCount - 1, 1) = Hoja1.Cells(i, 18) 'Tipo de Informe
                    If Hoja1.Cells(i, 21) = "" Then
                        .List(.ListCount - 1, 2) = Hoja1.Cells(i, 19) & " " & Hoja1.Cells(i, 20) 'Número de Informe
                    Else
                        .List(.ListCount - 1, 2) = Hoja1.Cells(i, 21) 'Nro. Oficio (Breve o Nota Informativa)
                    End If
                    .List(.ListCount - 1, 3) = Hoja1.Cells(i, 24) 'Fecha de emision
                    .List(.ListCount - 1, 4) = Hoja1.Cells(i, 14) 'Causa
                    .List(.ListCount - 1, 5) = Hoja1.Cells(i, 34) 'Decision
                End With
            End If
        Next i
 
        ' ---&--- Aqui añadimos los datos relacionados de los registros al listbox1
 
        For i=2 to Otros
            if Instr(Tabla_ID, Hoja4.Cells(i,"A")) > 0 Then
                With ListBox1
                    .AddItem
                    .List(.ListCount - 1, 0) = Hoja4.Cells(i, 1) 'ID
                    .List(.ListCount - 1, 1) = Hoja4.Cells(i, 2) 'CEDULA
                    .List(.ListCount - 1, 2) = Hoja4.Cells(i, 3) 'SIGLAS
                    .List(.ListCount - 1, 3) = Hoja4.Cells(i, 4) 'NOMBRE
                End With
            End If
        Next
    End If
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
Imágen de perfil de Jorge

Valores de un listbox relacionado con otro listbox

Publicado por Jorge (39 intervenciones) el 12/08/2021 19:42:43
Buenas tardes profesor Antoni... tengo que agradecerle toda la ayuda que he venido recibiendo de usted, es un genio. El código funciona perfectamente, maravillado totalmente... nuevamente un millón de gracias por su gran ayuda.
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