Что происходит в этой очереди?

#excel #vba #userform

#excel #vba #пользовательская форма

Вопрос:

Я создал форму с именем «questionario» с флажками и сделал инструкцию IF для отправки msgbox, если все поля были пустыми. Но когда я запускаю макрос, в строке, заключенной в кавычки, возникает ошибка (error 438).

 Private Sub CommandButton1_Click()

Dim ind As Integer
Dim cont As MSForms.Control
ind = 0

If questionario.resp1.Value = True Then
Range("E8").Value = Range("E8").Value   1
End If
If questionario.resp2.Value = True Then
Range("F8").Value = Range("F8").Value   1
End If
If questionario.resp3.Value = True Then
Range("G8").Value = Range("G8").Value   1
End If


For Each cont In questionario.Controls
  

If (Имя_Типа(продолжение) = «Флажок») И (продолжение.Значение = True) Затем

 ind = ind   1

End If
Next


If ind = 0 Then
MsgBox "mmm"
Else
questionario.Hide
Set questionario = Nothing
End If

End Sub
  

Комментарии:

1. Можете ли вы попробовать сделать If cont.TypeName = ... ?

2. Я пытался, но думаю, проблема в And (cont.Value = True) части

Ответ №1:

разделите проверку на два этапа:

 For Each cont In questionario.Controls
    If TypeName(cont) = "CheckBox" Then
        If cont.Value Then '<-- a checkbox control has a Value property
            ind = ind   1
            Exit For '<-- no need to go on
        End If
    End If
Next
  

Причина этого в том, что некоторые типы элементов управления не имеют .Value свойства, а VBA не выполняет замыкание логических выражений. Итак, даже если cont.TypeName <> «Флажок» установлен, выражение все равно пытается запросить .Value свойство тех элементов управления, которые могут не обладать таким свойством.

Комментарии:

1. Я не буду добавлять в качестве ответа, поскольку этот ответ делает свое дело. Например, у метки нет Value свойства, поэтому она выдаст ошибку. Редактировать: и пользователь3598756 уже решил эту проблему. 🙂

2. Это сработало, спасибо! Вы знаете, почему это не работает, когда я не разделяю на два шага?

3. Спасибо @DarrenBartrup-Cook

4. добро пожаловать. Это из-за того, что я поместил в комментарий (возможно, слишком лаконичный), и @DarrenBartrup-Кук прояснил более подробно: не все элементы управления userform имеют Value свойство while If (TypeName(cont) = "CheckBox") And (cont.Value = True) Then , оператор будет проверять оба условия, чтобы вернуть свой результат, таким образом пытаясь получить доступ к Value свойству Control , даже если TypeName(cont) = "CheckBox" часть вернет False