Excel - Ayuda de comparación

 
Vista:
Imágen de perfil de Jorge

Ayuda de comparación

Publicado por Jorge (39 intervenciones) el 14/09/2021 22:31:00
Buenas tardes, en mi sistema de expedientes se me presenta un problema y no hallo solucionarlo, así que requiero un poco de ayuda extra. El problema en el sistema ocurre cuando voy a modificar un registro en la hoja "otros" que es la que almacena la información de los otros involucrados en el informe, "otros" se relaciona con la hoja "data" mediante el ID (la única relación que existen entre ambas hojas es solo los datos ID, el ID en la hoja "data" es único y en la hoja "otros" puede repetirse).

Para poner de ejemplo, puedo seleccionar un registro existente que no tenga otros involucrados (solo uno que es el principal) pero resulta que por equis razón en el proceso de la investigación se determino que existen otros involucrados en el mismo caso, de tal manera que abro el registro 1 y agrego los demás involucrados (el sistema en excel realiza este proceso correctamente). Cuando llega el expediente, requiero actualizar la información con el resto de los datos para culminar el registro, es a donde viene el problema, cuando utilizo el botón modificar, en el proceso de guardado, si existe otros involucrados en el listbox1 (que es el cuadro de lista que contiene la información de los otros involucrados que se encuentra en la hoja "otros"), debería hacer una comparación entre el listbox1 y la hoja "otros" que si ya existe una cédula con el mismo ID, me salto esa fila del listbox1 y prosiga a la siguiente fila, y asi consecutivamente el bucle y me guarde la información del listbox1 que no se encuentre en la hoja "otros".

Se que es un poco confusa la explicación pero creo que explique un poco bien lo que trato de hacer, aquí dejo el código que fue la ultima prueba que ice la cual no tuve éxito, también unas fotos y el documento excel:

Para acceder al documento excel ya que estoy diseñando un sistema de acceso de usuario, estos son los datos:
usuario: diaz
contraseña: diaz23

Screenshot_1
Screenshot_2
Screenshot_3

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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
'Evento para MODIFICAR los registros en la base de datos de acuerdo al ID del registro
'
Private Sub editar_Click(): On Error Resume Next
Dim fila, otros, e As Long, i_editar
Dim MENSAJE, VALORID, VALORCIV As String
 
'Impide hacer nuevos registros si se esta modificando
If solo_modifica <= 0 Then
    MsgBox "Debe abrir un registro para poder modificarlo", vbCritical, "DATAPAD 3.3"
    Exit Sub
End If
 
fila = Hoja1.Range("A" & Rows.Count).End(xlUp).Row + 1
otros = Hoja4.Range("A" & Rows.Count).End(xlUp).Row + 1
 
MENSAJE = MsgBox("¿Estás seguro de editar este registro?", vbQuestion + vbYesNo, "DATAPAD 3.3")
 
If MENSAJE = vbYes Then
    For i_editar = 2 To fila - 1
        If Val(ID) = Val(Hoja1.Cells(i_editar, 1)) Then
            Hoja1.Cells(i_editar, 1) = Val(ID)
            Hoja1.Cells(i_editar, 2) = Val(cedula)
            Hoja1.Cells(i_editar, 3) = siglas
            Hoja1.Cells(i_editar, 4) = involucrado
            Hoja1.Cells(i_editar, 5) = unidad
            Hoja1.Cells(i_editar, 6) = graduacion
            Hoja1.Cells(i_editar, 7) = instituto
            Hoja1.Cells(i_editar, 8) = promocion
 
            With ListBox1
                If .ListIndex < 0 Then
                    For e = 0 To .ListCount - 1
                        otros = otros + 1
 
                        VALORID = InStr(e, ID, Hoja4.Cells(otros, 1), vbTextCompare)
                        VALORCIV = InStr(e, .List(e, 1), Hoja4.Cells(otros, 2), vbTextCompare)
 
                        MsgBox VALORID & ", " & VALORCIV & " - " & .List(e, 1)
 
                    Next e
                End If
            End With
 
            Exit Sub
 
            Hoja1.Cells(i_editar, 9) = cargo_laboral
            Hoja1.Cells(i_editar, 10) = fecha_registro
            Hoja1.Cells(i_editar, 11) = emision_rin
            Hoja1.Cells(i_editar, 12) = nro_rin
            Hoja1.Cells(i_editar, 13) = fecha_hecho
            Hoja1.Cells(i_editar, 14) = causa
            Hoja1.Cells(i_editar, 15) = descripcion_causa
            Hoja1.Cells(i_editar, 16) = fiscalia
            Hoja1.Cells(i_editar, 17) = detencion
            Hoja1.Cells(i_editar, 18) = orden
            Hoja1.Cells(i_editar, 19) = nomenclatura
            Hoja1.Cells(i_editar, 20) = nro_orden
            Hoja1.Cells(i_editar, 21) = nro_oficio
            Hoja1.Cells(i_editar, 22) = sustanciador
            Hoja1.Cells(i_editar, 23) = cargo_sustanciador
            Hoja1.Cells(i_editar, 24) = apertura
            Hoja1.Cells(i_editar, 25) = vencimiento
 
            If estado = "ENTREGADO" Then
                Hoja1.Cells(i_editar, 26) = lapsos
            Else
                Hoja1.Cells(i_editar, 26).FormulaR1C1 = "=DAYS360(TODAY(),RC[-1])"
            End If
            '+++++++++
            If estado = "ENTREGADO" Then
                Hoja1.Cells(i_editar, 27) = estado
            Else
                Hoja1.Cells(i_editar, 27).FormulaR1C1 = "=IF(RC[-1]<=0,""VENCIDO"",IF(RC[-1]<=70,""ALERTA"",""PENDIENTE""))"
            End If
            '+++++++++
            Hoja1.Cells(i_editar, 28) = fecha_recepcion
            Hoja1.Cells(i_editar, 29) = nro_recepcion
            Hoja1.Cells(i_editar, 30) = recibe
            Hoja1.Cells(i_editar, 31) = revisa
            Hoja1.Cells(i_editar, 32) = estatus_expediente
            Hoja1.Cells(i_editar, 33) = nro_acta
            Hoja1.Cells(i_editar, 34) = destino
            Hoja1.Cells(i_editar, 35) = decision
            'Foto de Perfil
            If Hoja1.Cells(i_editar, 36) = "" Then
                Hoja1.Cells(i_editar, 36) = foto_perfil 'es una variable publica
            End If
            'Foto del RIN
            If Hoja1.Cells(i_editar, 37) = "" Then
                Hoja1.Cells(i_editar, 37) = foto_rin 'es una variable publica
            End If
            'Foto de la Orden de Incio
            If Hoja1.Cells(i_editar, 38) = "" Then
                Hoja1.Cells(i_editar, 38) = foto_orden 'es una variable publica
            End If
            'Fotol archivo
            If Hoja1.Cells(i_editar, 39) = "" Then
                Hoja1.Cells(i_editar, 39) = foto_archivo 'es una variable publica
            End If
        End If
 
    Next i_editar
 
    MsgBox "REGISTRO EXITOSO", vbExclamation, "DATAPAD 3.3"
 
    'Refresca el libro Excel antes de GUARDAR
    'ActiveWorkbook.Save
    reload
Else
    MsgBox "OPERACIÓN CANCELADA", vbExclamation, "DATAPAD 3.3"
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 Nolberto
Val: 84
Ha aumentado su posición en 6 puestos en Excel (en relación al último mes)
Gráfica de Excel

Ayuda de comparación

Publicado por Nolberto (121 intervenciones) el 15/09/2021 21:55:18
Una buena opción es generar un array con los ID de la hoja "otros", luego por cada ciclo del listbox, comprobar si el ID del listbox en turno esta en el array generado de la hoja "Otros".

Cuando el ID del listbox en turno no se encuentre en el array, entonces este hay que meterlo en otro array, que sera el array de los no encontrados.

Primero hay que definir las variables.

1
2
3
4
Dim arrOtros() As Variant ' array de IDs de la hoja otros
Dim otro As Variant 'para recorrer arrOtros con un For Each
Dim arrOtrosNoIncluidos() As Variant 'array de los no encontrados
Dim filaArr As Integer 'para redimensionar el array de los no encontrados

El array de los IDs de la hoja otros se puede obtener con este código.

1
arrOtros = Hoja4.Range("A2:A" & otros).Value

para comprobar si un dato especifico esta en cierto array, se puede usar una función como esta.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
'comprobar si un dato se encuentra en un array
Function IsInArray(ByVal datoBuscado As Variant, arr As Variant) As Boolean
    Dim dato As Variant
    Dim conteo As Long
    On Error Resume Next
    For Each dato In arr
      If CStr(dato) = CStr(datoBuscado) Then
          conteo = conteo + 1
          Exit For
      End If
    Next dato
 
    If conteo > 0 Then IsInArray = True
End Function

Esa función se puede reutilizar en otras secciones del programa.

El código para la iteración del listbox queda así.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
With ListBox1
    If .ListIndex < 0 Then
        For e = 0 To .ListCount - 1
            If Not IsInArray(.List(e, 0), arrOtros) Then
                ReDim Preserve arrOtrosNoIncluidos(filaArr)
                arrOtrosNoIncluidos(filaArr) = .List(e, 0)
                filaArr = filaArr + 1
            End If
        Next e
 
        For Each otro In arrOtrosNoIncluidos
            Debug.Print otro
        Next otro
 
        'MsgBox VALORID & ", " & VALORCIV & " - " & .List(e, 1)
    End If
End With

Los no encontrados están en arrOtrosNoIncluidos, e n tu caso no se que se requiere hacer con eso, en este ejemplo solo hago que se imprima en la ventana inmediato mediante
1
Debug.Print

1
editar_Click()
queda de la siguiente manera, tu tendrás que adaptar la parte de lo que se tiene que hacer con el array de los no encontrados.

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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
Private Sub editar_Click(): On Error Resume Next
Dim fila, otros, e As Long, i_editar
Dim MENSAJE, VALORID, VALORCIV As String
Dim arrOtros() As Variant ' array de IDs de la hoja otros
Dim otro As Variant 'para recorrer arrOtros con un For Each
Dim arrOtrosNoIncluidos() As Variant 'array de los no encontrados
Dim filaArr As Integer 'para redimensionar el array de los no encontrados
 
 
'Impide hacer nuevos registros si se esta modificando
If solo_modifica <= 0 Then
    MsgBox "Debe abrir un registro para poder modificarlo", vbCritical, "DATAPAD 3.3"
    Exit Sub
End If
 
fila = Hoja1.Range("A" & Rows.Count).End(xlUp).Row + 1
otros = Hoja4.Range("A" & Rows.Count).End(xlUp).Row + 1
arrOtros = Hoja4.Range("A2:A" & otros).Value
 
MENSAJE = MsgBox("¿Estás seguro de editar este registro?", vbQuestion + vbYesNo, "DATAPAD 3.3")
 
If MENSAJE = vbYes Then
    For i_editar = 2 To fila - 1
        If Val(ID) = Val(Hoja1.Cells(i_editar, 1)) Then
            Hoja1.Cells(i_editar, 1) = Val(ID)
            Hoja1.Cells(i_editar, 2) = Val(cedula)
            Hoja1.Cells(i_editar, 3) = siglas
            Hoja1.Cells(i_editar, 4) = involucrado
            Hoja1.Cells(i_editar, 5) = unidad
            Hoja1.Cells(i_editar, 6) = graduacion
            Hoja1.Cells(i_editar, 7) = instituto
            Hoja1.Cells(i_editar, 8) = promocion
 
            With ListBox1
                If .ListIndex < 0 Then
                    For e = 0 To .ListCount - 1
                        If Not IsInArray(.List(e, 0), arrOtros) Then
                            ReDim Preserve arrOtrosNoIncluidos(filaArr)
                            arrOtrosNoIncluidos(filaArr) = .List(e, 0)
                            filaArr = filaArr + 1
                        End If
                    Next e
 
                    For Each otro In arrOtrosNoIncluidos
                        Debug.Print otro
                    Next otro
 
                    'MsgBox VALORID & ", " & VALORCIV & " - " & .List(e, 1)
                End If
            End With
 
            Exit Sub
 
            Hoja1.Cells(i_editar, 9) = cargo_laboral
            Hoja1.Cells(i_editar, 10) = fecha_registro
            Hoja1.Cells(i_editar, 11) = emision_rin
            Hoja1.Cells(i_editar, 12) = nro_rin
            Hoja1.Cells(i_editar, 13) = fecha_hecho
            Hoja1.Cells(i_editar, 14) = causa
            Hoja1.Cells(i_editar, 15) = descripcion_causa
            Hoja1.Cells(i_editar, 16) = fiscalia
            Hoja1.Cells(i_editar, 17) = detencion
            Hoja1.Cells(i_editar, 18) = orden
            Hoja1.Cells(i_editar, 19) = nomenclatura
            Hoja1.Cells(i_editar, 20) = nro_orden
            Hoja1.Cells(i_editar, 21) = nro_oficio
            Hoja1.Cells(i_editar, 22) = sustanciador
            Hoja1.Cells(i_editar, 23) = cargo_sustanciador
            Hoja1.Cells(i_editar, 24) = apertura
            Hoja1.Cells(i_editar, 25) = vencimiento
 
            If estado = "ENTREGADO" Then
                Hoja1.Cells(i_editar, 26) = lapsos
            Else
                Hoja1.Cells(i_editar, 26).FormulaR1C1 = "=DAYS360(TODAY(),RC[-1])"
            End If
            '+++++++++
            If estado = "ENTREGADO" Then
                Hoja1.Cells(i_editar, 27) = estado
            Else
                Hoja1.Cells(i_editar, 27).FormulaR1C1 = "=IF(RC[-1]<=0,""VENCIDO"",IF(RC[-1]<=70,""ALERTA"",""PENDIENTE""))"
            End If
            '+++++++++
            Hoja1.Cells(i_editar, 28) = fecha_recepcion
            Hoja1.Cells(i_editar, 29) = nro_recepcion
            Hoja1.Cells(i_editar, 30) = recibe
            Hoja1.Cells(i_editar, 31) = revisa
            Hoja1.Cells(i_editar, 32) = estatus_expediente
            Hoja1.Cells(i_editar, 33) = nro_acta
            Hoja1.Cells(i_editar, 34) = destino
            Hoja1.Cells(i_editar, 35) = decision
            'Foto de Perfil
            If Hoja1.Cells(i_editar, 36) = "" Then
                Hoja1.Cells(i_editar, 36) = foto_perfil 'es una variable publica
            End If
            'Foto del RIN
            If Hoja1.Cells(i_editar, 37) = "" Then
                Hoja1.Cells(i_editar, 37) = foto_rin 'es una variable publica
            End If
            'Foto de la Orden de Incio
            If Hoja1.Cells(i_editar, 38) = "" Then
                Hoja1.Cells(i_editar, 38) = foto_orden 'es una variable publica
            End If
            'Fotol archivo
            If Hoja1.Cells(i_editar, 39) = "" Then
                Hoja1.Cells(i_editar, 39) = foto_archivo 'es una variable publica
            End If
        End If
 
    Next i_editar
 
    MsgBox "REGISTRO EXITOSO", vbExclamation, "DATAPAD 3.3"
 
    'Refresca el libro Excel antes de GUARDAR
    'ActiveWorkbook.Save
    reload
Else
    MsgBox "OPERACIÓN CANCELADA", vbExclamation, "DATAPAD 3.3"
End If
 
End Sub

La estrella aquí es la función para comprobar si un dato esta o no en un array, de ese modo puedes decidir si metes no el dato en el otro array, ese otro array contendrá todos los registros del listbox que no están en la hoja otros y luego tu decides que hacer con el.
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