2016-10-24 7 views
0

Я создал форму под названием «questionario» с флажками и сделал оператор IF для отправки msgbox, если все cheboxes были пустыми. Но когда я запускаю макрос, в цитируемой строке возникает ошибка (ошибка 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 

Если (TypeName (продолжение) = "CheckBox") И (cont.Value = True) Тогда

ind = ind + 1 

End If 
Next 


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

End Sub 
+0

Можете ли вы попробовать выполнить 'If cont.TypeName = ...'? – nbayly

+0

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

ответ

2

делят чек на два этапа:

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 не имеет короткого замыкания в булевом выражении ssions. Таким образом, даже если cont.TypeName <> «CheckBox», выражение по-прежнему пытается запросить свойство .Value тех элементов управления, которые могут не иметь такого свойства.

+1

Я не буду добавлять в качестве ответа, так как этот ответ делает трюк. Например, ярлык не имеет свойства «Значение», поэтому выдается ошибка. Изменить: и user3598756 обратился к этому вопросу сейчас. :) –

+0

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

+0

Спасибо @ DarrenBartrup-Cook –