#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
свойство whileIf (TypeName(cont) = "CheckBox") And (cont.Value = True) Then
, оператор будет проверять оба условия, чтобы вернуть свой результат, таким образом пытаясь получить доступ кValue
свойствуControl
, даже еслиTypeName(cont) = "CheckBox"
часть вернетFalse