Msgbox al momento de un error

Hola qué tal. Tengo un formulario para ingresar los datos de una factura.

Me interesa implementar dos tipos de msgBox.

El primero, si el textbox donde se ingresa el numero de factura está en blanco, aparezca un messageBox pidiendo que se ingrese un número de factura, y regresando al formulario.

El segundo, si la fecha de la factura se ingresa en un formato incorrecto, se pida que se inserte la fecha en un formato correcto (dd/mm/aaaa) y se vuelva al formulario.

En ambos casos busco que no se ingresen los datos en mi hoja llamada DB.

A continuación el código.

Private Sub ButtonAdd_Click()
Sheets( DB ).Select
Dim Rango As Range, i As Integer
Set Rango = Range( a:a ).Find( )
i = Rango.Row
If Me.SupplierBox1 = Then
MsgBox Introducir Proveedor , vbInformation, CUIDADO
Me.UserForm1.Show
End If
If Me.InvoiceBox1 = Then
MsgBox Introducir Número de Factura , vbInformation, CUIDADO
Me.UserForm1.Show
End If
If Me.AmountBox1 = Then
MsgBox Introducir Monto de Factura , vbInformation, CUIDADO
Me.UserForm1.Show
End If
If Me.PurchaseOrderBox = Then
MsgBox Introducir Orden de Compra , vbInformation, CUIDADO
Me.UserForm1.Show
End If
ActiveWorkbook.Worksheets( DB ).Cells(i, 1).Value = Date
ActiveWorkbook.Worksheets( DB ).Cells(i, 14).Value = Me.ServiceBox1.Text
ActiveWorkbook.Worksheets( DB ).Cells(i, 15).Value = Me.ConceptoBox.Text
ActiveWorkbook.Worksheets( DB ).Cells(i, 16).Value = Me.ServiceTypeBox1.Text
ActiveWorkbook.Worksheets( DB ).Cells(i, 17).Value = Me.InvoicedToBox1.Text
ActiveWorkbook.Worksheets( DB ).Cells(i, 19).Value = Me.SupplierBox1.Text
ActiveWorkbook.Worksheets( DB ).Cells(i, 21).Value = Me.InvoiceBox1.Text
If Me.ServiceDateBox1 <> Then
ActiveWorkbook.Worksheets( DB ).Cells(i, 22).Value = CDate(Me.ServiceDateBox1.Value)
End If
ActiveWorkbook.Worksheets( DB ).Cells(i, 23).Value = Me.AmountBox1.Value
ActiveWorkbook.Worksheets( DB ).Cells(i, 24).Value = Me.ChargeToBox1.Text
ActiveWorkbook.Worksheets( DB ).Cells(i, 25).Value = Me.PenaltyBox1.Text
ActiveWorkbook.Worksheets( DB ).Cells(i, 26).Value = Me.PenaltyBox2.Value
ActiveWorkbook.Worksheets( DB ).Cells(i, 27).Value = Me.ContractAdjustBox1.Text
ActiveWorkbook.Worksheets( DB ).Cells(i, 28).Value = Me.ContractAdjustBox2.Value
ActiveWorkbook.Worksheets( DB ).Cells(i, 29).Value = Me.DiscountBox1.Text
ActiveWorkbook.Worksheets( DB ).Cells(i, 30).Value = Me.DiscountBox2.Value
ActiveWorkbook.Worksheets( DB ).Cells(i, 31).Value = Me.Comentarios.Text
ActiveWorkbook.Worksheets( DB ).Cells(i, 32).Value = Me.PurchaseOrderBox.Text

end sub

1 Respuesta

Respuesta
1

Mi primer consulta es dónde tenés el botón de la macro, porque con tantos Me y Show... parece como que te salís y volvés a entrar al Userform.

Espero tus aclaraciones para continuar con el tema

Esa era mi opción para buscar que después del message box, regresara al formulario, pero lo reinicia.

Hay alguna manera de que después de regresar al message box regrese al formulario sin seguir ingresando los datos?

La forma correcta de trabajar desde el Userform es ésta:

Se puede controlar cada textbox al momento de llenarlos o al momento de dar clic en un botón como de ACEPTAR o GRABAR.

Allí harías TODOS los controles tal como parece que ya se está haciendo en parte... y recién una vez pasados correctamente estos controles se continúa con el pase a la hoja.

Imagina un botón Aceptar llamado cmdAceptar y estas serían las instrucciones y su explicación :

Private Sub cmdAceptar_Click()
Sheets( DB ).Select 'aquí estás seleccionando la hoja destino-OK
Dim Rango As Range, i As Integer

'se busca la primer fila vacía según col A
Set Rango = Range( a:a ).Find( )
i = Rango.Row
'se revisa el contenido de cada control...no hace falta agregar ME porque estamos dentro del userform activo
If SupplierBox1 = Then
MsgBox Introducir Proveedor , vbInformation, CUIDADO
SupplierBox1.setFocus 'darle el foco al control que hay que completar

Exit Sub 'esta línea te hace salir del botón de Aceptar posicionandote en el control
End If
If InvoiceBox1 = Then
MsgBox Introducir Número de Factura , vbInformation, CUIDADO
InvoiceBox1.SetFocus

Exit Sub
End If

'repetir estas instrucciones con cada control que haya que revisar

'si se llegó hasta aquí es xq están todos los controles correctos y se procede al pase
'como no cambiamos ni de libro ni de hoja solo hace falta mencionarl a la hoja activa
ActiveSheet.Cells(i, 1).Value = Date
ActiveSheet.Cells(i, 14).Value = ServiceBox1.Text
ActiveSheet.Cells(i, 15).Value = ConceptoBox.Text

'así con el resto de las líneas

End Sub

PD) En algún lugar se establece el valor de i como la búsqueda de la celda vacía:

Set Rango = Range( a:a ).Find( )

Otro modo puede ser:

i=ActiveSheet.Range("A65536).end(xlup).Row+1

Sdos. Si el tema quedó resuelto no olvides finalizar

Funciona de maravilla :)

Abusando de su conocimiento :$

Hay un valor que lo convierte a fecha con el comando Cdate().

Si se introduce un formato incorrecto manda un error. Como la sintaxis del msgbox para que despliegue "Revisar formato de fecha" al momento del error?

Si el error se produce durante el pase de datos no conviene cancelar el pase sino pasarlo x algo con On error resume next justo delante de la línea donde estás pasando con Cdate

Otro modo es que analices 'antes' como el resto de los controles con algo así:

If Not IsDate(TextBox1) Then
MsgBox "error en fecha"
TextBox1.SetFocus
Exit Sub
End If

Con esto Excel te aceptará ingresos como 20-10/12 (esto es una fecha), o 5/7/12 también y luego lo convierte según el formato de la celda destino.

Sdos

Elsa

PD) si tenés alguna otra consulta para esta tarea debieras finalizar ésta y dejar la nueva en el tablón. Vamos resolviendo de a 1 x vez para cada usuario, así llegamos a todos.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas