У меня есть столбец, который использует значения из предопределенного набора (раскрывающийся список), реализованный с помощьюПроверки данных. Сейчасесли я изменю какое-то значение в списке, раскрывающийся список (при открытии) немедленно предложит это новое значение. Однако,таблица не будет обновляться автоматически, что означает, что некоторые значения в столбце будут недействительными, пока я не исправлю их вручную.
Я видел решения, основанные на макросах/VBA, но разве нет какого-то разумного способа прямо в пользовательском интерфейсе Excel?
решение1
Как я уже упоминал в комментариях, единственный способ сделать это — использовать VBA.
Вот один из вариантов. Я добавил комментарии по всему коду. Это предполагает, что вы используете именованный диапазон для списка проверки с именем "Список" и что он находится на том же листе, что и проверяемые ячейки.
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim cell As Range
Dim isect As Range
Dim vOldValue As Variant, vNewValue As Variant
Set isect = Application.Intersect(Target, ThisWorkbook.Names("List").RefersToRange)
If Not isect Is Nothing Then
' Get previous value of this cell
Application.EnableEvents = False
With Target
vNewValue = .Value
Application.Undo
vOldValue = .Value
.Value = vNewValue
End With
' For every cell with validation
For Each cell In Me.UsedRange.SpecialCells(xlCellTypeAllValidation)
With cell
' If it has list validation AND the validation formula matches AND the value is the old value
If .Validation.Type = 3 And .Validation.Formula1 = "=List" And .Value = vOldValue Then
' Change the cell value
cell.Value = vNewValue
End If
End With
Next cell
Application.EnableEvents = True
End If
End Sub
Вы также можете скачатьпример электронной таблицыЯ собрал это, чтобы протестировать. (Содержит макросы!)
решение2
но разве нет какого-то умного способа прямо в пользовательском интерфейсе Excel?
Думаю, я знаю один — по крайней мере, он отвечает всем вашим запросам:
- Вам нужно установитьдинамически изменяющийся Именованный Регионв качестве источника для проверки данных. Этого можно добиться с помощью
OFFSET
функции. Предположим, у вас есть список значений для раскрывающегося списка в столбце ASheet1
(имя имеет значение только для формулы), ячейкаA1
имеет заголовок, напримерList of values
, и значения размещаются начинаяA2
и ниже, вам следует сделать следующее: перейти на лентуFormulas > Name Manager
, создать новый регион (назовем егоItems
) и установить его регион НЕ указывающим на ячейки, а используя следующую формулу:=OFFSET(Sheet1!$A$2;0;0;COUNTA(Sheet1!$A:$A)-1;1)
. - НаборВалидация данныхправила: вместо указания диапазона ячеек для списка введите
=Items
- таким образом, ваш именованный регион будет использоваться в качестве источника элементов списка. - В результате вышесказанного вы получите действительно динамический список, который соответствует всем вашим требованиям: вы можете свободно изменять/добавлять элементы в столбец A, и эти изменения будут немедленно отражены в раскрывающемся списке при следующем его использовании. При этом старые значения останутся нетронутыми.
Я использую это решение около 2 лет в своей работе. Надеюсь, оно также будет вам полезным!
P.S. Вот сам пример файла:Динамическое выпадающее меню