#excel #vba #excel-2019
#excel #vba #excel-2019
Вопрос:
Мой инструмент Excel позволяет мне рассчитывать цены. В этой ячейке выпадающего списка указан продукт, а в другой ячейке выпадающего списка указан город, куда он должен быть доставлен, но я хотел бы заморозить ячейку страны (установить для нее одно значение), если для продукта выбрано определенное значение.
Работа с Excel 2019
Ответ №1:
Вы ищете Worksheet.Защита и диапазон.Заблокировано.
После того, как пользователь ввел значение для продукта, и вы хотите заблокировать ячейки страны, вам нужно будет сделать что-то вроде следующего:
Activesheet.Unprotect
Range("Everything Except Country").Locked = False
Range("Country").Locked = True
Activesheet.Protect
Как только вы защитите лист, значение по умолчанию для всех ячеек будет заблокировано, поэтому вам нужно только определить области, в которых оно должно быть доступно для редактирования. Если вы хотите продолжать блокировать дополнительные ячейки по мере ввода пользователем дополнительных данных, вам нужно будет снять защиту с листа, переопределить заблокированные диапазоны, а затем повторно защитить лист.
Я бы предложил использовать событие Worksheet_Change с чем-то вроде следующего:
Private Sub Worksheet_Change(ByVal Target As Range)
if Target.Address = Range("Product").Address then
Activesheet.Unprotect
Range("Everything Except Country").Locked = False
Range("Country").Locked = True
Activesheet.Protect
end if
End Sub
Вы также можете добавить событие или кнопку, при которой лист может быть сброшен до всех незащищенных ячеек.
Комментарии:
1.
I don't really know how to apply it to my data. If I have a dropdown list of products {Rings,Earrings,Necklaces} and another dropdown list of countries {France, Germany, Spain, Italy}, how can I do when in other cells C18 for example when selecting Rings the country cell C20 can only be France ?
2. Ячейки C18 и C20 не являются начальными ячейками выпадающего списка, они разделены для расчета окончательной цены
3. @BrokenStrings Я не уверен, что вы имеете в виду, но если вы хотите заморозить ячейки на основе входных данных других ячеек, то мое решение — это то, что вы ищете. Вам просто нужно будет динамически определять диапазоны для защиты и снятия защиты на основе того, что пользователь ввел. Я бы предложил сохранить защищенный диапазон и незащищенный диапазон в качестве переменной уровня модуля, чтобы ее можно было сохранять между событиями и легко изменять.