
У меня есть таблица Excel со столбцом за несколько лет и заголовком:
Years
1993
1993
1994
1994
1994
...
2011
2011
Имеются повторяющиеся значения по годам, и со временем будут добавлены дополнительные строки.
У меня есть еще одна ячейка, в которой нужно показать раскрывающийся список для лет, но только уникальные годы. Я пробовал использовать функцию проверки данных в Excel 2011, но у нее есть 2 проблемы:
- Он отображает повторяющиеся годы.
- Я говорю ему использовать весь столбец, и он включает пустые ячейки в раскрывающийся список.
Как получить раскрывающийся список лет, который будет отображать только уникальные значения и автоматически обновляться по мере добавления дополнительных строк?
Редактировать: немного больше информации. Раскрывающийся список используется на отдельном листе для отображения расчетных данных, как в форме Access. Пользователь может выбрать диапазон лет, и данные будут обновлены соответствующим образом. Исходный лист — это просто список всех данных.
решение1
Для такого рода проверок я использую VBA + один грязный трюк:
Сначала откройте редактор VBA с помощью Alt+F11. Затем я вставляю свой «Код проверки динамического списка» (tm) :) на соответствующий рабочий лист.
Private Sub Worksheet_SelectionChange(ByVal rTarget As Excel.Range)
On Error GoTo noVal
With rTarget.Validation
.Modify xlValidateList, xlValidAlertStop, xlBetween, Excel.Evaluate(.ErrorTitle)
End With
noVal:
End Sub
Этот код обновляет список проверки ячеек списком, сгенерированным формулой, введенной в Данные->Проверка->Сообщение об ошибке->Заголовок. Таким образом, каждая ячейка с проверкой списка может иметь свою собственную формулу.
Затем я добавляю модуль (Вставка->Модуль) и помещаю этот код в новый модуль:
Function GenDynList(rRng As Range)
sRet = ""
For Each rCell In rRng
If Not IsEmpty(rCell.Value) And InStr(sRet, rCell.Value) = 0 Then
sRet = sRet & "," & rCell.Value
End If
Next
GenDynList = Mid(sRet, 2)
End Function
Эта функция возвращает все ячейки в диапазоне без пробелов и повторений. Затем в каждой ячейке с проверкой списка я добавляю GenDynList(range) в заголовок сообщения об ошибке проверки данных.
решение2
Грязно. Нет встроенного способа сделать это автоматически обновляемым. Было бы проще просто создать отдельный список со всеми возможными годами, которые могут вас заинтересовать, а не пытаться ограничить его теми, которые есть в вашем наборе данных.
решение3
Добавьте сводную таблицу из данных на другом листе. Используйте годы в качестве строк, остальная часть таблицы не имеет значения. Отсортируйте и отфильтруйте строки по мере необходимости (например, явно отфильтруйте OUT "[blank]"). Сделайте ячейки, в которых находятся метки строк, целью проверки данных.
Используйте расширяемый именованный диапазон, чтобы всегда использовать все новые метки: http://www.ozgrid.com/Excel/DynamicRanges.htm
Повторите для других столбцов, таких как страна, штат и т. д. Если вы основываете все сводки на одном и том же диапазоне данных, они все будут обновляться вместе, когда вы обновляете любую из них. Теперь ваш процесс будет таким: добавить новые данные, обновить сводки, использовать проверку обновленных данных.
Дальнейшие мысли: Использование таблицы для исходных данных облегчит обновление сводных таблиц, поскольку они всегда будут использовать всю таблицу. В качестве альтернативы используйте расширяющийся именованный диапазон в качестве источника данных, чтобы избежать проблем при добавлении дополнительных строк.
Обратите внимание, что вы можете использовать диапазон из другого рабочего листа в качестве источника для проверки данных, если вы делаете это, определяя именованный диапазон. Вы не можете использовать обычный диапазон, явно ссылающийся на другой лист.