Excel - Error en un macro al editar datos de una base de datos

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

Error en un macro al editar datos de una base de datos

Publicado por Angel (7 intervenciones) el 14/08/2019 01:14:10
Buenas, mi pregunta sería:

Tengo una base de datos (Sheet4) donde a través de un Userform introducía datos de cada empleado. El problema me viene que he añadido unos textbox mas para añadir los titulos de cada empleado.
La funcion insertar, buscar y eliminar funcionan correctamente pero ahora la funcion editar no realiza ninguna accion.

He comprobado los formularios, los nombres de los textbox y no doy con el error.

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
Imágen de perfil de Antoni Masana
Val: 3.758
Plata
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Error en un macro al editar datos de una base de datos

Publicado por Antoni Masana (1218 intervenciones) el 14/08/2019 10:16:25
Veo varias cosas a corregir antes del problema por el que escribes:

- No hay ni un solo comentario y asi es dificil saber que hace ni porque lo hace.
- En el código del botón INSERT (CommandButton1_Click) el primer IF hace referencia a una variable que no existe.
- Por lo expuesto anteriormente es importante añadir al principio de cada modulo esta línea: Option Explicit
- Revisando el código veo que BTT1 es un objeto, si se escribe BTT1.Value queda más claro y funciona igual y ya no te cuento con un comentario.
- Desproteges la hoja antes de escribir, haces verificaciones y sales sin volver a protegerla.
- Deberias hacer las verificaciones, desproteger, escribir y proteger.
- Si un botón no tiene sentido que se ejecute deshabilita, es mejor que poner una condición y un aviso que por regla general el usuario no se lee.

Y no se porque regla de tres se borra la hoja Nombre. Despues de revisar el codigo ya he visto que pasa, no desaparece, se oculta.

El código del botón INSER queda mejor asi y me sigue sobrando el IF

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
Private Sub CommandButton1_Click()
    Dim UltFila As Double
 
    If Btt1 = False Then
        MsgBox "Select INSERT Option", vbExclamation, "FRS"
        Exit Sub
    End If
 
    '************************************************
 
    UltFila = 1
    While Trim(Sheets(4).Cells(UltFila, 1)) <> "": UltFila = UltFila + 1: Wend
 
    Sheet4.Visible = True
    Sheet4.Select
    Sheet4.Unprotect (231278)
 
    Cells(UltFila, 1) = TxtPassport.Value
    Cells(UltFila, 2) = TxtName.Value
    Cells(UltFila, 3) = TxtSurname.Value
    Cells(UltFila, 4) = ComboRank.Value
    Cells(UltFila, 5) = TxtNationality.Value
    Cells(UltFila, 6) = Format(TxtBirth, "dd-mmm-yy")
    Cells(UltFila, 7) = TxtPlace.Value
    Cells(UltFila, 8) = TxtCompany.Value
    Cells(UltFila, 9) = TxtSeamanbook.Value
    Cells(UltFila, 10) = TextoID.Value
    Cells(UltFila, 11) = Format(TxtVISA, "dd-mmm-yy")
    Cells(UltFila, 12) = Format(TxtCompetency, "dd-mmm-yy")
    Cells(UltFila, 13) = Format(TxtWatch, "dd-mmm-yy")
    Cells(UltFila, 14) = Format(TxtBasic, "dd-mmm-yy")
    Cells(UltFila, 15) = Format(TxtPax, "dd-mmm-yy")
    Cells(UltFila, 16) = Format(TxtCraft, "dd-mmm-yy")
    Cells(UltFila, 17) = Format(TxtFire, "dd-mmm-yy")
    Cells(UltFila, 18) = Format(TxtFRB, "dd-mmm-yy")
    Cells(UltFila, 19) = Format(TxtAid, "dd-mmm-yy")
    Cells(UltFila, 20) = Format(TxtCare, "dd-mmm-yy")
    Cells(UltFila, 21) = Format(TxtMedical, "dd-mmm-yy")
    Cells(UltFila, 22) = Format(TxtForklift, "dd-mmm-yy")
    Cells(UltFila, 23) = Format(TxtArpa, "dd-mmm-yy")
    Cells(UltFila, 24) = Format(TxtGmdss, "dd-mmm-yy")
    Cells(UltFila, 25) = Format(TxtHSC, "dd-mmm-yy")
    Cells(UltFila, 26) = Format(TxtAssist, "dd-mmm-yy")
    Cells(UltFila, 27) = Format(TxtSecurity, "dd-mmm-yy")
    Cells(UltFila, 28) = Format(TxtEcdis, "dd-mmm-yy")
    Cells(UltFila, 29) = Format(TxtCook, "dd-mmm-yy")
 
    Sheet4.Protect (231278)
    Sheet4.Visible = False
    Sheet1.Select
End Sub

El código es confuso,
¿Porque no asignas el contenido de la celda directamente al objeto TextBox y viceversa?
¿Que necesidad hay de crear tantas variables y pasar de la celda a la variable y de está al objeto?

El código es demasiado largo y confuso y hace que se pierda mucho tiempo.
Vale que en tu caso son 500 microsegundos pero si aprendes a programar bien cuando tienes que tratar procesos que pueden llegar a tardar minutos, de que tarde 10 a que tarde 5 hay una gran diferencia.

Te adjunto el código que ejecuta el botón EDITAR corregido y con una observación que puede ser por donde 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
Sub EditCrew()
    Dim UltFila As Long, rango As String, FilaRegistro As Long, ans As Integer
 
    UltFila = Range("A" & Rows.Count).End(xlUp).Row
    rango = "A2:A" & UltFila
 
    If Len(frmCrew.TxtPassport) = 0 Then
        MsgBox "Write True Passport", vbExclamation, "FRS"
        Exit Sub
    End If
 
    If TxtVISA = "" Then   ' <---- Por aqui sale sin avisar
        Exit Sub
    End If
 
    FilaRegistro = filaexisteregistro(frmCrew.TxtPassport, rango)
    If FilaRegistro = 0 Then
        MsgBox "ID don´t exist", vbExclamation, "FRS"
        Exit Sub
    End If
 
    Sheet4.Visible = True
    Sheet4.Unprotect ("231278")
 
    Sheet4.Cells(FilaRegistro, 2)  = frmCrew.TxtName
    Sheet4.Cells(FilaRegistro, 3)  = frmCrew.TxtSurname
    Sheet4.Cells(FilaRegistro, 4)  = frmCrew.ComboRank
    Sheet4.Cells(FilaRegistro, 5)  = frmCrew.TxtNationality
    Sheet4.Cells(FilaRegistro, 6)  = frmCrew.TxtBirth
    Sheet4.Cells(FilaRegistro, 7)  = frmCrew.TxtPlace
    Sheet4.Cells(FilaRegistro, 8)  = frmCrew.TxtCompany
    Sheet4.Cells(FilaRegistro, 9)  = frmCrew.TxtSeamanbook
    Sheet4.Cells(FilaRegistro, 10) = frmCrew.TextoID
    Sheet4.Cells(FilaRegistro, 11) = frmCrew.TxtVISA
    Sheet4.Cells(FilaRegistro, 12) = frmCrew.TxtCompetency
    Sheet4.Cells(FilaRegistro, 13) = frmCrew.TxtWatch
    Sheet4.Cells(FilaRegistro, 14) = frmCrew.TxtBasic
    Sheet4.Cells(FilaRegistro, 15) = frmCrew.TxtPax
    Sheet4.Cells(FilaRegistro, 16) = frmCrew.TxtCraft
    Sheet4.Cells(FilaRegistro, 17) = frmCrew.TxtFire
    Sheet4.Cells(FilaRegistro, 18) = frmCrew.TxtFRB
    Sheet4.Cells(FilaRegistro, 19) = frmCrew.TxtAid
    Sheet4.Cells(FilaRegistro, 20) = frmCrew.TxtCare
    Sheet4.Cells(FilaRegistro, 21) = frmCrew.TxtMedical
    Sheet4.Cells(FilaRegistro, 22) = frmCrew.TxtForklift
    Sheet4.Cells(FilaRegistro, 23) = frmCrew.TxtArpa
    Sheet4.Cells(FilaRegistro, 24) = frmCrew.TxtGmdss
    Sheet4.Cells(FilaRegistro, 25) = frmCrew.TxtHSC
    Sheet4.Cells(FilaRegistro, 26) = frmCrew.TxtAssist
    Sheet4.Cells(FilaRegistro, 27) = frmCrew.TxtSecurity
    Sheet4.Cells(FilaRegistro, 28) = frmCrew.TxtEcdis
    Sheet4.Cells(FilaRegistro, 29) = frmCrew.TxtCook
 
    MsgBox "EDIT Crew OK", vbInformation, "FRS"
 
    Sheet4.Visible = False
    Sheet4.Protect ("231278")
    Sheet1.Select
End Sub


Y lo dejo aquí porque se está haciendo muy largo. Te adjunto el libro con algunos cambios por si los quieres aplicar.

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: 23
Ha aumentado su posición en 97 puestos en Excel (en relación al último mes)
Gráfica de Excel

Error en un macro al editar datos de una base de datos

Publicado por Angel (7 intervenciones) el 14/08/2019 16:57:38
Muchas gracias Antoni.
El problema es que mis conocimientos son limitados, y entoces voy buscando informacion y adaptando a mis necesidades.

La actualizacion de Edit va genial, como dices ahorro tiempo y lios de busqueda, lo que ahora me da problemas el SEARCH, que lo uso poniendo el numero de pasaporte "TxtPassport" me de el resto de datos del empleado.

Nuevamente 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
sin imagen de perfil
Val: 115
Ha aumentado su posición en 111 puestos en Excel (en relación al último mes)
Gráfica de Excel

Error en un macro al editar datos de una base de datos

Publicado por Dirk (33 intervenciones) el 14/08/2019 17:22:20
Hola Angel, el programa entra en el IF que revisa el TxtVisa, que está vacía, y se sale del sub, esto pasa porque esta creando la variable TxtVisa en vez de usar el control frmCrew.TxtVisa, que como se puede apreciar en la ventana Inmediato si tiene información...

Imagen2

Sugerencia, como te comentó Antoni usa la opción para declarar variables Option Explicit para evitar este tipo de errores.

Salu2
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: 23
Ha aumentado su posición en 97 puestos en Excel (en relación al último mes)
Gráfica de Excel

Error en un macro al editar datos de una base de datos

Publicado por Angel (7 intervenciones) el 14/08/2019 22:38:54
Muchas gracias a ambos.
Pero como decia antes en conocimientos de macro estoy limitado, lo que ocurre ahora que adapte las mejoras de Antoni, pero el problema sigue y ademas en la hoja DATA cuando pongo un ID el automaticamente me da los datos y ahora me pasa que cuando inserto valores en la tabla de los cursos me pone N/A#.
Encima tengo 2 hojas Nombre y el programa se me vuelve loco.
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: 3.758
Plata
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Error en un macro al editar datos de una base de datos

Publicado por Antoni Masana (1218 intervenciones) el 15/08/2019 09:53:29
Te adjunto el archivo sin las dos hojas de Nombre.

En realidad las dos hojas no se llamaban igual aunque para el observador parece que si:

Una, la buena se llama "Nombre"
La otra, la mala se llama "Nombre "

Como se puede observar hay un espacio después de la e que el ojo no es capaz de distinguir.
Otro problema es que una de la hojas, la buena, estaba oculta y no podía mostrarla, he recuperado el primer fichero que has enviado y le he cambiado las macros.

Ahora que el libro esta correcto, en hojas, no acabo de entender el problema que tienes.
No se cuando ni como insertas los datos en la hoja DATA, que dicho sea de paso está protegida.

Otro detalle a tener en cuenta, cuando insertas los datos en la hoja, los modificas o los borras debes limpiar el formulario.
No se como llamas al formulario.

Hay tres procedimientos y una función en el Module3 que no veo que utilidad tienen como macros ya que dependen del formulario y deberían estar con el resto de código del formulario frmCrew.


Sigo repasando el código y te voy a comentar una proceso:

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
Sub DeleteCrew()
    Sheet4.Visible = True
    Sheet4.Unprotect ("231278")
 
    Dim UltFila As Long, rango As String, FilaRegistro As Long
 
    UltFila = Range("A" & Rows.Count).End(xlUp).Row
    rango = "A2:A" & UltFila
 
    If Len(frmCrew.TxtPassport) = 0 Then
        MsgBox "Write True Passport", vbExclamation, "FRS"
        Exit Sub
    End If
 
    FilaRegistro = filaexisteregistro(frmCrew.TxtPassport, rango)
    If FilaRegistro = 0 Then
        ans = MsgBox("ID don´t exist", vbExclamation, "FRS")
        Exit Sub
    End If
 
    Sheet4.Rows(FilaRegistro).ClearContents
    Sheet4.Visible = False
    Sheet4.Protect ("231278")
    Sheet1.Select
End Sub

Aquí hay varias cosas que están mal:

- Desproteges la hoja al principio cuando tienes que hacer verificaciones, lo que da como resultado que sales dejando la hoja visible y desprotegida.
- Haces referencia a una celda ¿De que hoja? ¿Cual es la hoja activa en este momento?
- Cuando leas el registro guarda la fila donde están los datos y así no tendrás que volver a buscarla, y cuando termines pones la variable a cero.
- No utilices el nombre interno de la hoja porque este puede cambiar, es más correcto el que le diste, en esta caso Nombre
El código con algunos cambios.

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
Sub DeleteCrew()
    Dim UltFila As Long, rango As String, FilaRegistro As Long
 
    With Sheets("Nombre")
        UltFila = .Range("A" & Rows.Count).End(xlUp).Row
        rango = "A2:A" & UltFila
 
        If Len(frmCrew.TxtPassport) = 0 Then
            MsgBox "Write True Passport", vbExclamation, "FRS"
            Exit Sub
        End If
 
        FilaRegistro = filaexisteregistro(frmCrew.TxtPassport, rango)
        If FilaRegistro = 0 Then
            ans = MsgBox("ID don´t exist", vbExclamation, "FRS")
            Exit Sub
        End If
 
        .Visible = True
        .Unprotect ("231278")
        .Rows(FilaRegistro).ClearContents
        .Visible = False
        .Protect ("231278")
    End With
    Sheets("Data").Select
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: 23
Ha aumentado su posición en 97 puestos en Excel (en relación al último mes)
Gráfica de Excel

Error en un macro al editar datos de una base de datos

Publicado por Angel (7 intervenciones) el 15/08/2019 13:45:03
Muchas gracias Antoni

Lo que ocurre ahora es que en la hoja Data toma los valores de la hoja Nombre en base al numero de ID que yo coloco. Ahora cuando Edito y coloco algun dato mas, sobre todo en la segunda parte que son los titulos "Seafarer Cretificate" (userform) me los coloca perfectamente en la hoja Nombre pero despues no me los lee en la hoja Data.

Añado el archivo de como esta actualmente y puedes ver el problema
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: 115
Ha aumentado su posición en 111 puestos en Excel (en relación al último mes)
Gráfica de Excel

Error en un macro al editar datos de una base de datos

Publicado por dirk (33 intervenciones) el 15/08/2019 17:03:25
Angel, por lo visto tienes conocimientos como para resolver, pero si a ti te cuesta... cuanto crees que le costarà a alguien mas si no comentas el código? sigue los consejos, sigue visitando el foro para adquirir buenas practicas y nuevas o mejores formas de resolver problemas, deja una hoja con las instrucciones para usar el archivo, por ahora usa una constante para guardar el código para bloquear / desbloquear las hojas, así no tienes que escribirla en el código con la posibilidad de equivocarte en algún procedimiento, si tienes que agregar borrar personas muy frecuente usa una variable para llevar la fila donde debes agregar el registro y creo que en la forma tienes un control con ese dato, puedes usar una hoja "Parametros" donde guardes información como la ultima fila de los nombre con un COUNT() y si le pones un Nombre puedes tener acceso desde otras hojas, cualquier modulo o desde la forma....

Mientras a seguir solucionando...

Salu2
Dirk
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
Revisar política de publicidad