Если вы не возражаете против использования VBA, то «легкий» способ сделать это - динамически генерировать SQL-запрос.
Я довольно широко использую что-то похожее на приведенное ниже для создания специальных панелей мониторинга, которым не требуется ничего сложного, такого как QlikView или Crystal
Например
Скрытый лист «Переменные» содержит таблицу «Table_SQL_SALES_EMPLOYEES». Это заполняется SQL, чтобы просто вернуть минимум, необходимый для выбора параметра. Что-то вроде SELECT DISTINCT AccountDirector FROM InvoicedSales ORDER BY AccountDirector
.
Затем у меня есть именованный диапазон 'Sales_Employees', который его ссылается на as =Table_SQL_SALES_EMPLOYEES[AccountDirector]
. Это сопоставлено с полем со списком, в котором Диапазон ввода установлен в «Sales_Employees». Это отправит номер в ячейку по вашему выбору (E5 в моем случае) элемента в выбранном списке. Чтобы вернуть фактическое значение в соответствии с исходным извлечением SQL, необходимо использовать =OFFSET(Table_SQL_SALES_EMPLOYEES[[#Headers],[AccountDirector]],$E$5,0)
. Это называется «Slp».
.: Теперь у нас есть выпадающий список всех возможных директоров аккаунтов. Есть еще один для финансового квартала, но тот же принцип.
Когда выбор изменяется в поле со списком, он вызывает макрос 'changeFilter()'
Sub changeFilter()
Dim wb As Workbook
Set wb = Excel.ActiveWorkbook
Dim ws As Worksheet
Set ws = Excel.ActiveWorkbook.Sheets("Lookups")
Dim conn As Excel.WorkbookConnection
Dim slp As Name
Set slp = wb.Names("Slp")
Dim qtr As Integer
qtr = wb.Names("qtr").RefersToRange.Value2
Dim query As String
' Adjusted Sales Consolidated
Set conn = wb.Connections("SQL_ADJUSTEDSALES_CONSOLIDATED")
query = "SELECT * FROM InvoicedSales WHERE AccountDirector=" & "'" & slp.RefersToRange.Value2 & "'"
conn.OLEDBConnection.CommandText = query
conn.Refresh
Я в основном предварительно настраиваю таблицы / сводки, подключая их к базе данных с жестко закодированными переменными и выбирая параметры «Обновить данные при открытии файла» и «Удалить данные из диапазона внешних данных перед сохранением рабочей книги» - это сохраняет крошечный размер файла так как на самом деле ничего не спасено.
Затем изменение фильтра перезаписывает жестко закодированную переменную динамически сгенерированным запросом SQL с использованием выбранного параметра, а затем обновляет таблицу.