Страницы: 1
RSS
Как обработать в цикле пары "ячейка" - "именованный диапазон"
 
Здравствуйте!

Есть диапазоны с контрольными значениями A1, B1, C1, куда из выпадающего списка выбираются значения "открыто" или "закрыто"
И есть диапазоны, которые нужно защитить от редактирования: A2:A5, B2:B5, C2:C5.
То есть, если А1 = "закрыто", то защитить диапазон A2:A5 и т.д. по оставшимся двум парам диапазонов.

На данный момент выполнение задачи у меня реализовано посредством повтора нижеуказанного кода для каждого из диапазонов:
Код
        If Range("A1") = "закрыто" Then
                Range("A2:A5").Locked = True
            Else
                Range("A2:A5").Locked = False
        End If

Знаю, что можно, но пока что не умею, — диапазоны объединить в два массива и решить задачу через цикл, выбирая каждую пару из массива и применяя к ней параметр защиты.

Просьба помочь с наводками, а может и с готовым решением! Заранее спасибо!
Изменено: vikttur - 24.06.2021 13:20:18
 
Код
Sub ddd()
    For Each x In Range("A1:C1")
        With x.Offset(1).Resize(4)
            If x.Value = "закрыто" Then .Locked = True Else .Locked = False
        End With
    Next
End Sub
 
или немного короче)
Код
Sub ddd()
  For Each x In Range("A1:C1"): x.Offset(1).Resize(4).Locked = x = "закрыто": Next
End Sub
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Бахтиёр, спасибо, ваше решение очень изящно! Я привёл конкретный упрощённый примёр и получил конкретный код...

Но если всё же нужно оставить названия диапазонов (которые в моём примере как A1, B1, C1 и A2:A5, B2:B5, C2:C5)?

В конкретной трудовой задаче каждому из диапазонов будут даны Имена, которые будут образовывать пары, например:
"проверкаA" — "диапазонA"
"проверкаB" — "диапазонB"
"проверкаC" — "диапазонC"

Т.е. видоизмененный мой код для первой пары тогда будет выглядеть так:
Код
        If Range("проверкаA") = "закрыто" Then
                Range("диапазонA").Locked = True
            Else
                Range("диапазонA").Locked = False
        End If

И поэтому хочется иметь цикл, который бы перебирал пары в двух массивах, содержащих Имена диапазонов. Количество пар изменяться не будет, а сами диапазоны я буду редактировать через "Диспетчер имен", без необходимости задавать диапазоны через VBA.

 
Концептуально если смотреть, думаю, должно быть что-то в таком духе, но 7-я строка меня коробит  :oops:
Код
Dim проверки As Range
Dim диапазоны As Range      
проверки = Range("проверкаА", "проверкаB", "проверкаC")      
диапазоны = Range("диапазонА", "диапазонB", "диапазонC")      
      
For Each x in диапазоны      
   If Each y in проверки = "закрыто" Then   
      x.Locked = True
   Else   
      x.Locked = False
Next
 
Код
Sub dd()
arr = Array("А", "Б", "В", "Г", "Д")
    For Each x In arr
        Range("Диапазон" & x).Locked = Range("Проверка" & x).Value = "закрыто"
    Next
End Sub
 
PrimalGroudo,
все диапазоны будут Locked если "проверкаC" = "закрыто" не зависимо от состояния "проверкаА", "проверкаB"
можете писать туда что угодно, состояние диапазонов зависит ТОЛЬКО от состояния "проверкаC" (в соотв. с текстом макроса, который вы написали)
Изменено: Ігор Гончаренко - 23.06.2021 21:04:35
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Бахтиёр, благодарю, это именно то, что нужно!!
Цитата
Ігор Гончаренко написал:
(в соотв. с текстом макроса, который вы написали)
Да, приведенный мной макрос некорректный. Конечно же нужно чтобы проверялась и защищалась каждая из пар "проверка-диапазон" A, B, C.
Изменено: vikttur - 24.06.2021 10:11:10
 
Предложение по переименованию темы: Как обработать в цикле пары "Проверяемая именованная ячейка" - "Соответствующий именованный диапазон"
Страницы: 1
Наверх