Скрыть объект на основе значения ячейки

У меня есть объект (то есть прямоугольник под названием «Форма») в электронной таблице, который я хотел бы скрыть на основе значения ячейки (A1). Вот что я пробовал после поиска в Интернете, но это не работает. Прошу прощения, я ни в коем случае не специалист по VBA. Обычно я могу разобраться, основываясь на поиске в Интернете, но этот ставит меня в тупик.

Private Sub HideShape(ByVal Target As Range)
    If Target.Row = 1 And Target.Column = 1 Then _
        Me.Shapes("Shape").Visible = (Cells(1, 1).Value = 1)
End Sub

На самом деле у меня есть шесть объектов, которые я хочу обрабатывать аналогичным образом на основе шести значений ячеек. Вот код, который я пробовал:

Private Sub Worksheet_Calculate()
    Me.Shapes("ProjMgmt").Visible = (Me.Cells(101, 3).Value = 0)
    Me.Shapes("Planning").Visible = (Me.Cells(102, 3).Value = 0)
    Me.Shapes("Implementation").Visible = (Me.Cells(103, 3).Value = 0)
    Me.Shapes("Supplier").Visible = (Me.Cells(104, 3).Value = 0)
    Me.Shapes("Process").Visible = (Me.Cells(105, 3).Value = 0)
    Me.Shapes("Customer").Visible = (Me.Cells(106, 3).Value = 0)
End Sub

Он работает с одной формой, но не работает с этими шестью формами.


person Daniel LeSaux    schedule 27.03.2020    source источник
comment
Вы пытались использовать событие Worksheet_Change? Если это так, вы не можете изменить Worksheet_Change на HideShape.   -  person BigBen    schedule 27.03.2020
comment
Спасибо за этот вклад. Есть ли макрос, который я мог бы использовать для получения того же результата?   -  person Daniel LeSaux    schedule 27.03.2020
comment
Измените HideShape обратно на Worksheet_Change.   -  person BigBen    schedule 27.03.2020
comment
Ух ты! Это сработало! Большое спасибо БигБен!   -  person Daniel LeSaux    schedule 27.03.2020
comment
Как мне официально отблагодарить вас на этой доске?   -  person Daniel LeSaux    schedule 27.03.2020
comment
Я добавлю это как ответ - затем вы можете нажать на галочку, чтобы принять его.   -  person BigBen    schedule 27.03.2020
comment
Последний поворот. Требуется ли изменение кода, если A1 было вычисляемым полем? Код работает, если я ввожу 0 или 1 в A1, но если вычисляется значение A1, код больше не работает.   -  person Daniel LeSaux    schedule 27.03.2020
comment
Вы должны использовать для этого Worksheet_Calculate вместо Worksheet_Change.   -  person BigBen    schedule 27.03.2020
comment
Какие у вас формулы в C101:C106?   -  person BigBen    schedule 27.03.2020
comment
Формулы вычисляют суммы с другого листа. Они следующие: C101 =СУММ('Вопросы аудита'!I7:L13) C102 =СУММ('Вопросы аудита'!I16:L20) C103 =СУММ('Вопросы аудита'!I23:L30) C104 =СУММ('Вопросы аудита'!I23:L30) Вопросы'!I33:L39) C105 =SUM('Вопросы проверки'!I43:L47,'Вопросы проверки'!I50:L54,'Вопросы проверки'!I57:L59,'Вопросы проверки'!I62:L66,'Вопросы проверки '!I69:L72,'Вопросы аудита'!I75:L78) C106 =SUM('Вопросы аудита'!I81:L85)   -  person Daniel LeSaux    schedule 27.03.2020
comment
Вы уверены, что они точно равны нулю, и нет маленького десятичного числа из-за ошибки с плавающей запятой?   -  person BigBen    schedule 27.03.2020
comment
Они были бы равны нулю. Они читают из таблицы двоичных значений (т.е. если ячейка равна этому, чем 1, иначе 0)   -  person Daniel LeSaux    schedule 27.03.2020
comment
Я не могу воспроизвести это поведение... Вы могли бы Debug.Print Me.Cells(101, 3).Value и так далее, чтобы, возможно, увидеть, каково их значение на самом деле.   -  person BigBen    schedule 27.03.2020
comment
Я сохранил рабочий лист, закрыл Excel, выключил компьютер, перезагрузился, и по какой-то причине все заработало. Я не могу отблагодарить вас, БигБен!   -  person Daniel LeSaux    schedule 27.03.2020
comment
Хм... интересно. Может расчет был ручной?   -  person BigBen    schedule 27.03.2020
comment
Нет, все формулы рассчитываются автоматически. Хотя теперь это работает, как задумано. Очень гладко! Спасибо еще раз!   -  person Daniel LeSaux    schedule 27.03.2020
comment
Ааа - возможно, события не были включены ... В любом случае, не стесняйтесь щелкать галочкой рядом с ответом, чтобы принять его, спасибо.   -  person BigBen    schedule 27.03.2020


Ответы (1)


Если вы пытаетесь использовать событие Worksheet_Change, вы не можете изменить Worksheet_Change на HideShape... оно должно быть Worksheet_Change.

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Row = 1 And Target.Column = 1 Then _
        Me.Shapes("Shape").Visible = (Me.Cells(1, 1).Value = 1)
End Sub

Если в A1 есть формула, то нужно использовать Worksheet_Calculate:

Private Sub Worksheet_Calculate()
    Me.Shapes("Shape").Visible = (Me.Cells(1, 1).Value = 1)
End Sub
person BigBen    schedule 27.03.2020
comment
Как мне настроить код, чтобы сделать то же самое для нескольких фигур и значений ячеек? У меня есть шесть фигур, которые я хотел бы сделать видимыми или невидимыми на основе шести вычисленных значений ячеек. - person Daniel LeSaux; 27.03.2020
comment
Скопируйте строку Me.Shapes("Shape").Visible = (Me.Cells(1, 1).Value = 1) и измените параметры Cells и ожидаемое значение. - person BigBen; 27.03.2020
comment
Привет Биг Бен. Я пробовал это, но, похоже, это не работает: - person Daniel LeSaux; 27.03.2020
comment
Private Sub Worksheet_Calculate() Me.Shapes(ProjMgmt).Visible = (Me.Cells(101, 3).Value = 0) Me.Shapes(Planning).Visible = (Me.Cells(102, 3).Value = 0 ) Me.Shapes(Реализация).Visible = (Me.Cells(103, 3).Value = 0) Me.Shapes(Поставщик).Visible = (Me.Cells(104, 3).Value = 0) Me.Shapes (Процесс).Visible = (Me.Cells(105, 3).Value = 0) Me.Shapes(Customer).Visible = (Me.Cells(106, 3).Value = 0) End Sub - person Daniel LeSaux; 27.03.2020
comment
Возможно, отредактируйте свой вопрос, указав, что вы пробовали, и ошибки, которые вы получаете, если они есть. - person BigBen; 27.03.2020