Страницы: 1
RSS
Удалить выпадающий список по условию, Требуется удалить выпадающий список при изменении значения в ячейке.
 
Требуется удалять выпадающие списки из одних ячеек при изменении значения в других ячейках. При этом нужно обнулять значения в ячейках, в которых остались значения от последнего выбора из этих выпадающих списков. Как это реализовать формулами?
Ну на крайний случай можно макросом, если формулами никак.
Пример прилагаю.
Изменено: Yuriy575 - 15.02.2020 11:52:59
 
Макросом
Код
Private Sub Worksheet_Change(ByVal Target As Range)
        Dim Cell As Range
        If Not Intersect(Target, Range("B3:B5")) Is Nothing Then 'Если ячейка пересекается с указанным диапазоном, то
            For Each Cell In Range("B3:B5")
                If Cell.Value = "" Then
                    Range("E" & Cell.Row).Value = ""
                End If
            Next Cell
        End If
End Sub
 
Niko.x87, неплохо бы добавить отключение отслеживания событий.
 
Попробую разобраться) С макросами мало опыта)  
Изменено: Yuriy575 - 15.02.2020 13:32:53
 
Юрий М,Как это сделать?  
 
Перед циклом вставить строку
Код
Application.EnableEvents = False
А перед выходом из процедуры вернуть в True
 
Эту строку вставляем перед " For Each Cell In Range(....." - да?
А возвращаем в True перед End Sub - да?
 
Всё верно.
Только я не понимаю, зачем там цикл - зачем каждый раз перебирать ВСЕ ячейки столбца В, если нужно удалить выпадающий список только в одной строке?
И не вижу в коде удаления выпадающего списка. Есть только удаление значения.
 
Я тоже не вижу удаление выпадающего списка) Но в принципе код подходит, мне главное значения обнулять. В проверке данных я вставил функцию
=ЕСЛИ(Значение в ячейке B<>"";диапазон для выпадающего списка;"") - как-то так решил сделать, т.к. пока не знаю как удалять выпадающие списки.
Если их можно удалить как-то  -  было бы неплохо, только обязательно назад вернуть при условии что в столбце B появляются какие-либо значения.
 
Код
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Cell As Range
    If Not Intersect(Target, Range("B3:B5")) Is Nothing Then 'Если ячейка пересекается с указанным диапазоном, то
        Application.EnableEvents = False
        If Target = "" Then
            With Target.Offset(0, 3) 'Применительно к ячейке, смещённой на три столбца вправо
                .Validation.Delete 'Удаляем выпадающий
                .Value = ""
            End With
        End If
    End If
Application.EnableEvents = True
End Sub
 
Но как его (выпадающий) обратно вернуть, если пользователь опять ставит значения в столбце B?)
 
Уходим от темы про УДАЛЕНИЕ ))
Включите макрорекордер и запишите вставку выпадающего списка. - получите код. Останется добавить:
Код
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Cell As Range
    If Not Intersect(Target, Range("B3:B5")) Is Nothing Then 'Если ячейка пересекается с указанным диапазоном, то
        Application.EnableEvents = False
        If Target = "" Then
            With Target.Offset(0, 3) 'Применительно к ячейке, смещённой на три столбца вправо
                .Validation.Delete 'Удаляем выпадающий
                .Value = ""
            End With
        Else
            'Здесь строка добавления выпадающего
        End If
    End If
Application.EnableEvents = True
End Sub
 
Код
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Cell As Range
    If Not Intersect(Target, Range("B3:B5")) Is Nothing Then 'Если ячейка пересекается с указанным диапазоном, то
        Application.EnableEvents = False
        If Target = "" Then
            With Target.Offset(0, 3) 'Применительно к ячейке, смещённой на три столбца вправо
                .Validation.Delete 'Удаляем выпадающий
                .Value = ""
            End With
        Else
            Target.Offset(0, 3).Validation.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="+,-"
        End If
    End If
Application.EnableEvents = True
End Sub

И столбец G уже не нужен )
Страницы: 1
Наверх