Detener la macro si no han contestado una pregunta (selección de checkbox)

Hola expertos
tengo un problema, estoy formulado un cuestionario el cual contiene 10 preguntas, y en cada pregunta hay 3 checkbox para contestar, al final tengo un botón que debe verificar que todas las preguntas estén contestadas para que pueda guardar el archivo y llevarme a otro formato, mi pregunta es como puedo hacer para que el botón haga esa verificación y si una de las preguntas esta sin contestar mande un mensaje, especificando que pregunta falta por contestar (solo debe de haber un checkbox seleccionado por pregunta)
Gracias por su ayuda
Saludos!!

1 Respuesta

Respuesta
1

Desconozco el nombre de tus objetos, pero supongamos que son algo así como "p01chk1", "p01chk2", "p01chk3", "p02chk1", etc... para la pregunta 01 checkbox 1, 2 y 3, pregunta 02 checkbox 1, etc...

Y el botón se llama "btnOk".

En el evento "click" del botón tendrías que poner algo así:

Option Explicit
Private Sub btnOk_Click()
' Lo primero es comprobar que no haya errores en los datos de la página
' lo haremos en una función separada para que esté más claro
If Not snOkValoresRespuestas() Then Exit Sub
' A partir de aquí vendría tu código....
' ......................................
' ......................................
' ......................................
End Sub
Private Function snOkValoresRespuestas() As Boolean
' Esta función comprueba que hay 1 y sólo un checkbox activo en cada pregunta
Dim n As Integer
Dim i As Integer
Dim aux As String
Dim sh As Worksheet
Set sh = ThisWorkbook.ActiveSheet()
' Diremos que los datos están mal hasta que se demuestre lo contrario
snOkValoresRespuestas = False
For i = 1 To 10 ' Hay 10 preguntas
' Montamos sobre "aux" el nombre del checkbox sin el número final (1, 2 o 3)
aux = "p" & Format$(i, "00") & "chk"
' Comprobamos que existan los 3 objecto checkbox con el nombre correcto.
If Not existenObjetosChk(sh, aux) Then Exit Function
n = 0 ' No hay ningún control verificado
If sh.OLEObjects(aux & "1").Object.Value <> 0 Then n = n + 1 ' chk1 de la pregunta "i" marcado
If sh.OLEObjects(aux & "2").Object.Value <> 0 Then n = n + 1 ' chk2 de la pregunta "i" marcado
If sh.OLEObjects(aux & "3").Object.Value <> 0 Then n = n + 1 ' chk3 de la pregunta "i" marcado
If n <> 1 Then
If n = 0 Then
MsgBox "La pregunta " & i & " no tiene marcada ninguna casilla cuando debe tener una."
Else
MsgBox "La pregunta " & i & " tiene marcados " & n & " casillas cuando tiene que haber una sola."
End If
Exit Function
End If
Next i
snOkValoresRespuestas = True
End Function
Function existenObjetosChk(ByRef sh As Worksheet, ByVal nomChk As String) As Boolean
' Esta función comprueba los nombres de los 3 checkbox.
Dim snOk As Boolean
Dim aux As Variant
snOk = True ' Hasta que encontremos algún error
On Error Resume Next ' Desactivamos el control de errores de VB
aux = sh.OLEObjects(nomChk & "1").objext.Value
aux = sh.OLEObjects(nomChk & "2").objext.Value
aux = sh.OLEObjects(nomChk & "3").objext.Value
If Err <> 0 Then snOk = False ' Se ha producido un error.
On Error GoTo 0 ' Devolvemos el control de errores al VB
If Not snOk Then
MsgBox "ERROR INTERNO. Alguno de los 3 controles " & _
"'" & nomChk & "1', '" & nomChk & "2' o " & _
"'" & nomChk & "3' no existen." & vbCrLf & vbCrLf & _
"Proceso cancelado"
End If
existenObjetosChk = snOk
End Function

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas