Tengo el siguiente problema: He creado un formulario para grabar contactos dentro de una hoja de datos llamada "CONTACTOS" y cada vez que introduzco algún dato incorrecto, de manera alguna el formulario vuelve a grabar el mismo registro tantas veces como haya fallado dentro de la hoja de datos.
Muestro por aquí mi formulario...
Como se puede observar en la imagen adjunta, tiene un casillero inicial para elegir el tipo de contacto ("Proveedor" o "Cliente") y el resto de los datos están dispuestos en modo multipágina. "Denominación" para grabar los datos fiscales, "Domiciliación" para los datos de localización y "Comunicación" para los datos de contacto.
Bueno, eso es lo de menos...
Fíjaros lo que me pasa. Lo explíco con un ejemplo: Supongamos que introduzco una cadena de caracteres en el casillero del "Código Postal", y me salta un mensaje de alerta que me notifica del error cometido, para lo cual vuelvo a introducir de nuevo los datos esta vez sí en formato numérico.
Nos vamos a la página de contactos. Y podemos observar que el mismo registro ha sido grabado dos veces. Esto se debe porque me he equivocado una vez al introducir un código postal con caracteres de texto en vez de con números. Si me hubiera equivocado tres veces, se grababa el mismo dato tres veces, y si fueran mil, pues mil veces...
Adjunto mi código aquí...
Option Explicit
Private Sub UserForm_Initialize()
' Adjuntamos la lista de perfiles...
With tbContacto
.AddItem "Proveedor"
.AddItem "Cliente"
.AddItem "Otro..."
End With
' Y adjuntamos la lista de países...
With tbPais
.AddItem "Alemania"
.AddItem "España"
.AddItem "Estados Unidos"
.AddItem "Francia"
.AddItem "Gran Bretaña"
.AddItem "Países Bajos"
End With
End Sub
Private Sub cbGrabar_Click()
Application.ScreenUpdating = False
' Tratamos los errores de la aplicación ofimática...
On Error GoTo error
' Declaramos las variables de ámbito local...
Dim fila As Long
Dim deseaContinuar As Byte
inicio:
' Comprobamos que el cuadro combinado del código postal no está vacío...
If (tbContacto = "Cliente" And tbCodigoPostal.Value = "") Or _
(tbContacto = "Cliente" And IsNumeric(tbCodigoPostal.Value) = False) Then
FormularioDeContactos.Hide
MsgBox Prompt:="Upps, parece que hubo un error... Por favor, debe introducir un código postal " & _
"para ubicar al cliente.", _
Buttons:=vbExclamation, _
Title:=" CODIGO POSTAL INCORRECTO"
FormularioDeContactos.Show
GoTo inicio
' Comprobamos que el cuadro combinado de la provincia no está vacía...
ElseIf tbProvincia.Value = "" Then
FormularioDeContactos.Hide
MsgBox Prompt:="Upps, parece que hubo un error... Por favor, debe introducir una provincia " & _
"para ubicar al " & _
IIf(tbContacto.Value = "Proveedor", "proveedor.", "cliente."), _
Buttons:=vbExclamation, _
Title:=" PROVINCIA INCORRECTA"
FormularioDeContactos.Show
GoTo inicio
' Comprobamos que el cuadro combinado del país no está vacío...
ElseIf tbPais.Value = "" Then
FormularioDeContactos.Hide
MsgBox Prompt:="Upps, parece que hubo un error... Por favor, debe introducir un país " & _
"para ubicar al " & _
IIf(tbContacto.Value = "Proveedor", "proveedor.", "cliente."), _
Buttons:=vbExclamation, _
Title:=" PAIS INCORRECTO"
FormularioDeContactos.Show
GoTo inicio
End If
' Grabamos toda la información actual dentro de la hoja de contactos...
fila = Sheets("CONTACTOS").Range("A1048576").End(xlUp).Row + 1
With Sheets("CONTACTOS")
.Cells(fila, 1) = tbContacto.Value ' Tipo de contacto
.Cells(fila, 2) = tbCodigo.Value ' Código (PK)
.Cells(fila, 3) = tbDniCif.Value ' DNI / CIF
.Cells(fila, 4) = tbNombre.Value ' Nombre y apellidos / Nombre comercial
.Cells(fila, 5) = tbNombreFiscal.Value ' Nombre fiscal
.Cells(fila, 6) = tbDireccionPostal.Value ' Dirección postal
.Cells(fila, 7) = tbCodigoPostal.Value ' Código postal
.Cells(fila, 8) = tbPoblacion.Value ' Población
.Cells(fila, 9) = tbProvincia.Value ' Provincia
.Cells(fila, 10) = tbPais.Value ' País
.Cells(fila, 11) = tbWeb.Value ' Sitio web
.Cells(fila, 12) = tbWeb2.Value ' Otros sitios web
.Cells(fila, 13) = tbEmail.Value ' Correo electrónico
.Cells(fila, 14) = tbTelefonoFijo.Value ' Teléfono fijo
.Cells(fila, 15) = tbTelefonoMovil.Value ' Teléfono móvil
.Cells(fila, 16) = tbFax.Value ' Fax
End With
' Ocultamos el formulario de contactos...
FormularioDeContactos.Hide
' Mostramos un mensaje de alerta para notificar al usuario de que el registro se ha grabado correctamente...
deseaContinuar = MsgBox(Prompt:="El contacto ha sido grabado correctamente." & vbCr & _
"¿Desea continuar grabando datos?", _
Buttons:=vbYesNo + vbInformation, _
Title:=" AVISO IMPORTANTE")
' Si la respuesta es afirmativa...
If deseaContinuar = vbYes Then
' Mostramos el formulario de contactos...
FormularioDeContactos.Show
' Pero si la respuesta es negativa...
Else
' Activamos la hoja correspondiente...
Sheets("CONTACTOS").Activate
' Salimos del procedimiento...
GoTo salir
End If
salir:
' Y salimos del procedimiento...
Exit Sub
error:
' Mostramos por pantalla el tipo de error y la descripción del mismo...
MsgBox Prompt:="Upps, parece que hubo un error... Por favor, póngase directamente " & _
"en contacto con su programador informático." & vbCr & vbCr & _
"El error producido es: [" & Err.Number & "] - " & Err.Description, _
Buttons:=vbCritical, _
Title:=" AVISO IMPORTANTE"
' Sacamos el error fuera de la pila de errores...
Resume salir
End Sub
Private Sub cbSalir_Click()
' Cerramos el formulario de contactos...
Unload FormularioDeContactos
End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
' Habilitamos única y exclusivamente el control a través de los botones del formulario...
If CloseMode = vbFormControlMenu Then
MsgBox Prompt:="Por favor, utilice los botones 'Grabar' y 'Salir' para navegar por el formulario " & _
"de contactos.", _
Buttons:=vbExclamation, _
Title:=" AVISO IMPORTANTE"
Cancel = True
End If
End Sub
Normalmente, esto lo solucionaba con la propiedad variable.Cancel o variable.Default con valor igual a "True". Es decir, algo como esto...
...
If (tbContacto = "Cliente" And tbCodigoPostal.Value = "") Or _
(tbContacto = "Cliente" And IsNumeric(tbCodigoPostal.Value) = False) Then
FormularioDeContactos.Hide
MsgBox Prompt:="Upps, parece que hubo un error... Por favor, debe introducir un código postal " & _
"para ubicar al cliente.", _
Buttons:=vbExclamation, _
Title:=" CODIGO POSTAL INCORRECTO"
FormularioDeContactos.Show
tbCodigoPostal.Default = True ' Reestablecemos la variable en el valor inicial por defecto...
GoTo inicio
...
Por aquí continúa el código anterior...
Pero en esta ocasión, no me funciona.
Creo haberme explicado bien. Si necesitáis más detalles, dejadme un comentario.
Necesito que alguien me arroje algo de lucidez sobre este tema, porque el formulario funciona correctamente tal y como habéis visto. El problema es que cuando alguien comete un error al grabar los datos, es como si el mismo registro se grabara tantas veces como errores cometiera al grabar el registro.
Muchísimas gracias por vuestro tiempo.
Featured Replies
Archivado
Este tema está ahora archivado y está cerrado a más respuestas.
Hola a todos,
Tengo el siguiente problema: He creado un formulario para grabar contactos dentro de una hoja de datos llamada "CONTACTOS" y cada vez que introduzco algún dato incorrecto, de manera alguna el formulario vuelve a grabar el mismo registro tantas veces como haya fallado dentro de la hoja de datos.
Muestro por aquí mi formulario...
Como se puede observar en la imagen adjunta, tiene un casillero inicial para elegir el tipo de contacto ("Proveedor" o "Cliente") y el resto de los datos están dispuestos en modo multipágina. "Denominación" para grabar los datos fiscales, "Domiciliación" para los datos de localización y "Comunicación" para los datos de contacto.
Bueno, eso es lo de menos...
Fíjaros lo que me pasa. Lo explíco con un ejemplo: Supongamos que introduzco una cadena de caracteres en el casillero del "Código Postal", y me salta un mensaje de alerta que me notifica del error cometido, para lo cual vuelvo a introducir de nuevo los datos esta vez sí en formato numérico.
Nos vamos a la página de contactos. Y podemos observar que el mismo registro ha sido grabado dos veces. Esto se debe porque me he equivocado una vez al introducir un código postal con caracteres de texto en vez de con números. Si me hubiera equivocado tres veces, se grababa el mismo dato tres veces, y si fueran mil, pues mil veces...
Adjunto mi código aquí...
Option Explicit Private Sub UserForm_Initialize() ' Adjuntamos la lista de perfiles... With tbContacto .AddItem "Proveedor" .AddItem "Cliente" .AddItem "Otro..." End With ' Y adjuntamos la lista de países... With tbPais .AddItem "Alemania" .AddItem "España" .AddItem "Estados Unidos" .AddItem "Francia" .AddItem "Gran Bretaña" .AddItem "Países Bajos" End With End Sub Private Sub cbGrabar_Click() Application.ScreenUpdating = False ' Tratamos los errores de la aplicación ofimática... On Error GoTo error ' Declaramos las variables de ámbito local... Dim fila As Long Dim deseaContinuar As Byte inicio: ' Comprobamos que el cuadro combinado del código postal no está vacío... If (tbContacto = "Cliente" And tbCodigoPostal.Value = "") Or _ (tbContacto = "Cliente" And IsNumeric(tbCodigoPostal.Value) = False) Then FormularioDeContactos.Hide MsgBox Prompt:="Upps, parece que hubo un error... Por favor, debe introducir un código postal " & _ "para ubicar al cliente.", _ Buttons:=vbExclamation, _ Title:=" CODIGO POSTAL INCORRECTO" FormularioDeContactos.Show GoTo inicio ' Comprobamos que el cuadro combinado de la provincia no está vacía... ElseIf tbProvincia.Value = "" Then FormularioDeContactos.Hide MsgBox Prompt:="Upps, parece que hubo un error... Por favor, debe introducir una provincia " & _ "para ubicar al " & _ IIf(tbContacto.Value = "Proveedor", "proveedor.", "cliente."), _ Buttons:=vbExclamation, _ Title:=" PROVINCIA INCORRECTA" FormularioDeContactos.Show GoTo inicio ' Comprobamos que el cuadro combinado del país no está vacío... ElseIf tbPais.Value = "" Then FormularioDeContactos.Hide MsgBox Prompt:="Upps, parece que hubo un error... Por favor, debe introducir un país " & _ "para ubicar al " & _ IIf(tbContacto.Value = "Proveedor", "proveedor.", "cliente."), _ Buttons:=vbExclamation, _ Title:=" PAIS INCORRECTO" FormularioDeContactos.Show GoTo inicio End If ' Grabamos toda la información actual dentro de la hoja de contactos... fila = Sheets("CONTACTOS").Range("A1048576").End(xlUp).Row + 1 With Sheets("CONTACTOS") .Cells(fila, 1) = tbContacto.Value ' Tipo de contacto .Cells(fila, 2) = tbCodigo.Value ' Código (PK) .Cells(fila, 3) = tbDniCif.Value ' DNI / CIF .Cells(fila, 4) = tbNombre.Value ' Nombre y apellidos / Nombre comercial .Cells(fila, 5) = tbNombreFiscal.Value ' Nombre fiscal .Cells(fila, 6) = tbDireccionPostal.Value ' Dirección postal .Cells(fila, 7) = tbCodigoPostal.Value ' Código postal .Cells(fila, 8) = tbPoblacion.Value ' Población .Cells(fila, 9) = tbProvincia.Value ' Provincia .Cells(fila, 10) = tbPais.Value ' País .Cells(fila, 11) = tbWeb.Value ' Sitio web .Cells(fila, 12) = tbWeb2.Value ' Otros sitios web .Cells(fila, 13) = tbEmail.Value ' Correo electrónico .Cells(fila, 14) = tbTelefonoFijo.Value ' Teléfono fijo .Cells(fila, 15) = tbTelefonoMovil.Value ' Teléfono móvil .Cells(fila, 16) = tbFax.Value ' Fax End With ' Ocultamos el formulario de contactos... FormularioDeContactos.Hide ' Mostramos un mensaje de alerta para notificar al usuario de que el registro se ha grabado correctamente... deseaContinuar = MsgBox(Prompt:="El contacto ha sido grabado correctamente." & vbCr & _ "¿Desea continuar grabando datos?", _ Buttons:=vbYesNo + vbInformation, _ Title:=" AVISO IMPORTANTE") ' Si la respuesta es afirmativa... If deseaContinuar = vbYes Then ' Mostramos el formulario de contactos... FormularioDeContactos.Show ' Pero si la respuesta es negativa... Else ' Activamos la hoja correspondiente... Sheets("CONTACTOS").Activate ' Salimos del procedimiento... GoTo salir End If salir: ' Y salimos del procedimiento... Exit Sub error: ' Mostramos por pantalla el tipo de error y la descripción del mismo... MsgBox Prompt:="Upps, parece que hubo un error... Por favor, póngase directamente " & _ "en contacto con su programador informático." & vbCr & vbCr & _ "El error producido es: [" & Err.Number & "] - " & Err.Description, _ Buttons:=vbCritical, _ Title:=" AVISO IMPORTANTE" ' Sacamos el error fuera de la pila de errores... Resume salir End Sub Private Sub cbSalir_Click() ' Cerramos el formulario de contactos... Unload FormularioDeContactos End Sub Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) ' Habilitamos única y exclusivamente el control a través de los botones del formulario... If CloseMode = vbFormControlMenu Then MsgBox Prompt:="Por favor, utilice los botones 'Grabar' y 'Salir' para navegar por el formulario " & _ "de contactos.", _ Buttons:=vbExclamation, _ Title:=" AVISO IMPORTANTE" Cancel = True End If End Sub
Normalmente, esto lo solucionaba con la propiedad variable.Cancel o variable.Default con valor igual a "True". Es decir, algo como esto...
... If (tbContacto = "Cliente" And tbCodigoPostal.Value = "") Or _ (tbContacto = "Cliente" And IsNumeric(tbCodigoPostal.Value) = False) Then FormularioDeContactos.Hide MsgBox Prompt:="Upps, parece que hubo un error... Por favor, debe introducir un código postal " & _ "para ubicar al cliente.", _ Buttons:=vbExclamation, _ Title:=" CODIGO POSTAL INCORRECTO" FormularioDeContactos.Show tbCodigoPostal.Default = True ' Reestablecemos la variable en el valor inicial por defecto... GoTo inicio ... Por aquí continúa el código anterior...
Pero en esta ocasión, no me funciona.
Creo haberme explicado bien. Si necesitáis más detalles, dejadme un comentario.
Necesito que alguien me arroje algo de lucidez sobre este tema, porque el formulario funciona correctamente tal y como habéis visto. El problema es que cuando alguien comete un error al grabar los datos, es como si el mismo registro se grabara tantas veces como errores cometiera al grabar el registro.
Muchísimas gracias por vuestro tiempo.