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!!

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