Есть ли способ отключить несколько кнопок одновременно? - PullRequest
6 голосов
/ 08 апреля 2011

У меня есть пользовательская форма vba с 36 кнопками. Я хотел бы отключить все кнопки, когда значение в одной из моих таблиц достигает определенного числа. Прямо сейчас с каждым нажатием кнопки число увеличивается на единицу в таблице, на которую я ссылаюсь. Когда число достигает трех, я бы хотел отключить все кнопки.

Ответы [ 3 ]

5 голосов
/ 08 апреля 2011
Dim oCtrl As Control
Dim oButton As CommandButton

For Each oCtrl In MyForm.Controls
    If oCtrl.Tag = "SomeValue" Then
        Set oButton = oCtrl
        oButton.Enabled = False
    End If
Next

Set oCtrl = Nothing
Set oButton = Nothing

Если у вас есть другие кнопки, которые вы не хотите отключать, решение состоит в том, чтобы использовать свойство Tag. Установите для свойства Tag все кнопки, которые вы хотите включить или отключить вместе, на одно и то же значение. Затем вы можете проверить это значение в виде и включить / отключить их. Другой способ - присвоить им одинаковый префикс или суффикс и проверить это в своем коде.

Добавление

Кстати, у объекта Control нет свойства Enabled. Так что вы должны «привести» его к CommandButton, чтобы отключить . По-видимому, у объекта Control есть свойство Enabled, но оно не отображается в intellisense. Однако вы все равно должны попытаться привести Control к CommandButton, чтобы убедиться, что это то, что у вас есть. Вот расширенная версия:

Dim oCtrl As Control
Dim oButton As CommandButton

For Each oCtrl In MyForm.Controls
    If oCtrl.Tag = "SomeValue" Then
        On Error Resume Next
        Set oButton = oCtrl
        On Error GoTo 0

        If Not oButton Is Nothing Then
            oButton.Enabled = False
        End If
    End If
Next

Set oCtrl = Nothing
Set oButton = Nothing
5 голосов
/ 08 апреля 2011

Поместите все кнопки в объект Frame, а затем просто отключите весь кадр.Это также отключит все, что находится внутри фрейма.

В качестве альтернативы, основываясь на вашем последнем вопросе, вы можете использовать этот код:

Dim counter As Integer

Private Sub btn1_Click()
    CaptureImage (btn1.Name)
End Sub

Private Sub btn2_Click()
    CaptureImage (btn2.Name)
End Sub

Private Sub btn3_Click()
    CaptureImage (btn3.Name)
End Sub

Private Sub UserForm_Activate()
    counter = 1
End Sub

Private Sub CaptureImage(ByVal btnName As String)
    Controls("capture" & counter).Picture = Controls(btnName).Picture
    counter = counter + 1
    If counter > 3 Then
        DisableButtons
    End If
End Sub

Private Sub DisableButtons()
    Dim ctl As Control
    For Each ctl In UserForm1.Controls
        If Left(ctl.Name, 3) = "btn" Then
            ctl.Enabled = False
        End If
    Next
End Sub

В идеале, вы хотели бы привести объекты Control к кнопкамкак Томас предлагает.

0 голосов
/ 08 апреля 2011

@ Майк: Попробуйте -

If Sheets("Sheet1").Range("A1").Value = 3 Then 
    UserForm1.CommandButton1.Enabled = True 
Else 
    UserForm1.CommandButton1.Enabled = False 
End If

(замените Sheet1, A1, UserForm1 и CommandButton1 на правильные для вашей книги)

...