Страницы: 1
RSS
Запуск макроса по нескольким условиям
 
Всех приветствую!
Может кто поможет новичку или направит на путь истинный)
Итак задача : Имеется лист содержащий в себе протокол испытаний, куда оператор в будущем будет вводить полученные данные. В зависимости от выбранных условий наполнение протокола должно меняться. Создал отдельный лист, назвал его "Forms", на этот лист поместил заранее подготовленные таблички. В модуле листа прописал реакцию на событие изменения ячейки, сначала запускаются макросы которые удаляют содержимое на листе, потом запускаются макросы которые копируют и вставляют таблички из листа "Forms". Собственно все работает, но возникла вторая задача. После того как лист оформился, оператор должен выбрать дополнительные условия, которые также влияют на форматирование листа.
Как должно работать : В ячейке B19 выпадающий список, два условия "с регулированием" и "без регулирования", при выборе одного их них происходит "пересборка" документа. Это реализовано.
В ячейке AF6 есть выпадающий список с выбором "Y/Y; Y/D; D/D;D/Y", после того как пользователь сделал выбор в ячейке B19 и файл перестроился, в зависимости от выбранного в AF6 некоторые таблицы должны перестраиваться. Собственно, как это реализовать? Поскольку в модуле листа событие Worksheet_Change уже занято, а второе такое добавить не получается. Надеюсь смысл объяснил понятно) Если нет постараюсь более внятно написать.
 
Цитата
l0nerwave написал: Поскольку в модуле листа событие Worksheet_Change уже занято, а второе такое добавить не получается.
Обычно делается примерно так
Код
Private Sub Worksheet_Change(ByVal Target As Range)
'обрабатываем изменение 'B19'
If Not Intersect(Target, Range("B19")) Is Nothing Then
  If Target = "С регулированием" Then
    deleteNoLoadNCells
    deleteNoRegCells
    writeRegCells
    writeNoLoadCells
  End If
  Application.EnableEvents = True
  If Target = "Без регулирования" Then
    deleteNoLoadCells
    deleteRegCells
    writeNoRegCells
    writeNoLoadNCells
    Application.EnableEvents = True
  End If
End If
'обрабатываем изменение 'AF6'
If Not Intersect(Target, Range("AF6")) Is Nothing Then
  MsgBox "Изменено значение ячейки " & Target.Address(0, 0)
End If
End Sub
Согласие есть продукт при полном непротивлении сторон
 
Цитата
написал:
Обычно делается
Благодарю Вас за ответ. Действительно, дополнил код - заработало. Но в процессе тестирования обнаружил две серьезные проблемы:
1. Пользователь может дважды запустить одни и те же макросы. Например, в ячейке B19 пользователь выбрал "Без регулирования" , таблица перестроилась, но если пользователь шаловливый и ещё раз нажмёт на тоже самое значение, вновь запускается "перестройка" и уже ломает таблицу.
2. Нужно как - то привязать обработку изменений в ячейке AF6 к ячейке B19. Пример:
есть 6 макросов которые реагируют на изменение в ячейке AF6, тем временем в ячейке В19 стоит значение " С регулированием" , выбирая значения в ячейке AF6 будут работать только макросы 1,2,3. Изменив значение в ячейке В19 на "Без регулирования", при изменении значения в ячейке AF6 будут работать уже макросы 4,5,6, в то время как макросы 1,2,3 станут доступны только после возврата значения в ячейке B19.

Может быть у Вас есть идеи по реализации подобных механизмов защиты? Был бы очень сильно благодарен. А вообще ещё возникла идея, может будет проще заранее наклепать шаблонов на разных листах, затем все листы скрыть , создать некий первичный лист для пользователя в котором он задает условия, тыкает на большую красивую кнопку, запускается макрос который отображает листы соответствующие выбранным условиям. Как думаете может такой сценарий был бы проще чем постоянно перерисовывать один и тот же лист?
Изменено: l0nerwave - 11.12.2024 15:08:14
Страницы: 1
Наверх