Включение/отключение кнопки на основе условия в Excel VBA

У меня возникают проблемы с включением/отключением кнопки (управление формой) в зависимости от того, заполнены все 4 ячейки или нет (A2, A4, B2 и B4). Вот мой код, все они находятся в одном модуле листа.

Sub Disable_Button()

Dim myshape As Shape
Set myshape = ThisWorkbook.Worksheets("FORM").Shapes("Button")
With myshape
    .ControlFormat.Enabled = False    '---> Disable the button
    .TextFrame.Characters.Font.ColorIndex = 15    '---> Grey out button label
    .OnAction = ""
End With
End Sub

Sub Enable_Button()

Dim myshape As Shape
Set myshape = ThisWorkbook.Worksheets("FORM").Shapes("Button")
With myshape
    .ControlFormat.Enabled = True    '---> Enable the button
    .TextFrame.Characters.Font.ColorIndex = 1    '---> Highlight button label
    .OnAction = "Module1.TEST"
End With
End Sub

Private Sub Test_Button(ByVal Target As Range)

If Target.Address= 'I'm not sure what to put here since it won't accept multiple ranges
    Application.EnableEvents = False
    If Target.Value = "" Then
    Disable_Button
    Else
    Enable_Button
    End If
    Application.EnableEvents = True
End If
End Sub

Module1.TEST просто выводит «УСПЕХ» в ячейке C1. Я протестировал Disable_Button и Enable_Button по отдельности и подтвердил, что они работают. Однако у меня возникли проблемы с написанием кода, так что кнопка активируется только тогда, когда все 4 ячейки (A2, A4, B2 и B4) заполнены. Я не уверен, подходит ли ByVal Target As Range. Спасибо за любую помощь.

Используйте and() для проверки ячеек, укажите условие для каждой: and(A1="yes",B1="Blue") и т. д.

Solar Mike 22.04.2022 18:46

Если вы хотите реагировать на изменения значений ячеек, вам нужно использовать событие Worksheet_Change. Тонны предыдущих сообщений здесь на эту тему.

Tim Williams 22.04.2022 18:54
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
2
39
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это войдет в модуль кода рабочего листа:

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim rng As Range
    
    Set rng = Me.Range("A2:B2,A4:B4") 'the cells to monitor
    'check if any of the cells in `rng` are in `Target`
    If Not Application.Intersect(Target, rng) Is Nothing Then
        ToggleButton (Application.CountA(rng) = 4) 'toggle button
    End If
End Sub

'switch button between enabled/disabled according to `bEnable`
Sub ToggleButton(bEnable As Boolean)
    With Me.Shapes("Button")
        .ControlFormat.Enabled = bEnable
        .TextFrame.Characters.Font.ColorIndex = IIf(bEnable, 1, 15)
        .OnAction = IIf(bEnable, "Module1.TEST", "")
    End With
End Sub

Другие вопросы по теме