Используйте событие *_Change
для каждого элемента управления (и, необязательно, событие UserForm_Activate
), чтобы установить свойство .Enabled
для кнопки управления.
Например, на простой пользовательской форме с 1 ComboBox (ComboBox1
), 2 TextBoxes (TextBox1
и TextBox2
) и 1 CommandButton (CommandButton1
), следующий код гарантирует, что CommandButton1
отключен если нет данных в каждом из 3 других элементов управления:
Option Explicit
Private Sub CheckMandatoryFields()
'Is a separate sub to make it easy to edit for all Controls at the same time
If Len(TextBox1.Value) > 0 And Len(TextBox2.Value) > 0 And Len(ComboBox1.Value) > 0 Then
CommandButton1.Enabled = True
Else
CommandButton1.Enabled = False
End If
End Sub
Private Sub CommandButton1_Click()
MsgBox "Button is enabled!"
End Sub
Private Sub ComboBox1_Change()
CheckMandatoryFields
End Sub
Private Sub TextBox1_Change()
CheckMandatoryFields
End Sub
Private Sub TextBox2_Change()
CheckMandatoryFields
End Sub
Private Sub UserForm_Activate()
CheckMandatoryFields
End Sub
Если ваши кнопки и элементы управления находятся на рабочем листе, вам нужно изменить UserForm_Activate
на Worksheet_Activate
. Если они находятся на разных листах, или на листе, а на другом - в пользовательской форме, вам потребуется полностью квалифицировать ваши ссылки (например, Sheet1.Textbox1.Value
)
Если вы используете элементы управления формой на рабочем листе вместо элементов управления ActiveX, то вы не можете использовать события _Change
, и способ ссылки на объекты отличается:
Sheet1.Shapes("TextBox1").TextFrame2.TextRange.Text 'The value of TextBox1
Sheet1.Shapes("ComboBox1").ControlFormat.Value 'Which Number item in ComboBox1 is selected
Sheet1.Shapes("ComboBox1").ControlFormat.List(n) 'The value of the nth item in ComboBox1
Кнопка «Управление формой» не имеет свойства Enabled
- однако, если у вас есть макрос «Ничего не делать», вы можете использовать его следующим образом:
Sub DoNothing()
'As it says
End Sub
Sub MakeASound()
Beep
End Sub
Sub ToggleButton()
If Sheet1.Shapes("Button 1").OnAction = "Sheet1!DoNothing" Then 'Disable Button 1
Sheet1.Shapes("Button 1").OLEFormat.Object.Font.ColorIndex = 16 'Font colour = Grey
Sheet1.Shapes("Button 1").OnAction = "Sheet1!DoNothing"
Else 'Enable Button 1
Sheet1.Shapes("Button 1").OLEFormat.Object.Font.ColorIndex = 1 'Font colour = Black
Sheet1.Shapes("Button 1").OnAction = "Sheet1!MakeASound"
End If
End Sub