Добрый день подскажите пожалуйста формулу по выборке уникальных значений из столбца (диапазона) по условиям (условий может быть от 2-х до 4-х) Заранее спасибо
Добрый день подскажите пожалуйста формулу по выборке уникальных значений из столбца (диапазона) по условиям (условий может быть от 2-х до 4-х) Заранее спасибоosuna
Спасибо огромное. Оба варианта рабочие правда первый на большой таблице очень долго думает( Pelena, а если не трудно можно про "записать макрорекодером" чуть подробней, потому что операция действительно не разовая.
Спасибо огромное. Оба варианта рабочие правда первый на большой таблице очень долго думает( Pelena, а если не трудно можно про "записать макрорекодером" чуть подробней, потому что операция действительно не разовая.osuna
Я в файле так и сделала, немного подкорректировала и повесила макрос на кнопку. Нажмите Alt+F11.
А записать макрос можно с вкладки Разработчик с помощью кнопки Запись макроса. Нажимаете кнопку, выполняете действия, ещё раз нажимаете кнопку. Дальше через Alt+F11 смотрите текст макроса
Я в файле так и сделала, немного подкорректировала и повесила макрос на кнопку. Нажмите Alt+F11.
А записать макрос можно с вкладки Разработчик с помощью кнопки Запись макроса. Нажимаете кнопку, выполняете действия, ещё раз нажимаете кнопку. Дальше через Alt+F11 смотрите текст макросаPelena
"Черт возьми, Холмс! Но как??!!" Ю-money 41001765434816
А имеет значение количество столбцов и количество условий, а то мне выдается ошибка "Указан недопустимый диапазон базы данных" (очень большая таблица 290 тысяч строк и около 20 столбцов)
А имеет значение количество столбцов и количество условий, а то мне выдается ошибка "Указан недопустимый диапазон базы данных" (очень большая таблица 290 тысяч строк и около 20 столбцов)osuna
таблица на другом листе (хотя наверное это не имеет значения)
Еще как имеет. Расширенный фильтр не выводит значения на другой лист. Но можно обхитрить - с этого другого листа делать расширенный фильтр (то есть мы делаем РФ на том листе, где хотим получить данные).
таблица на другом листе (хотя наверное это не имеет значения)
Еще как имеет. Расширенный фильтр не выводит значения на другой лист. Но можно обхитрить - с этого другого листа делать расширенный фильтр (то есть мы делаем РФ на том листе, где хотим получить данные)._Boroda_
osuna, при таких больших объемах данных имеет смысл делать выборку запросом (встроенными средствами или на VBA с использованием ADO/DAO). Особенно если у вас это не разовая операция, а, например, её надо проделывать по 10 раз в день...
osuna, при таких больших объемах данных имеет смысл делать выборку запросом (встроенными средствами или на VBA с использованием ADO/DAO). Особенно если у вас это не разовая операция, а, например, её надо проделывать по 10 раз в день...AndreTM
Вариант со сводной хорош. Но хотелось бы формулами либо запросом (с формулами явно в голове лучше, запросы это так сказать "слабое место"))) Данную операцию надо будет проводить даже не 10 раз а раз 100 может 200 в день
Если есть возможность помочь или наставить на путь истинный по поводу запроса заранее благодарю.
Хотя в любом случае благодарю за помощь и ответы)
Вариант со сводной хорош. Но хотелось бы формулами либо запросом (с формулами явно в голове лучше, запросы это так сказать "слабое место"))) Данную операцию надо будет проводить даже не 10 раз а раз 100 может 200 в день
Если есть возможность помочь или наставить на путь истинный по поводу запроса заранее благодарю.
Хотя в любом случае благодарю за помощь и ответы)osuna
Запрос - это, по сути, та же сводная. Но значительно сложнее. А сводной - Вы заранее ставите диапазон на 999999 строк (посмотрите у меня в посте выше в файле-примере), заранее ставите все нужные поля в фильтр отчета и делайте сколько хотите раз - только в фильтрах выбирайте нужные значения и всё. Очень удобно и, что немаловажно, очень быстро.
Запрос - это, по сути, та же сводная. Но значительно сложнее. А сводной - Вы заранее ставите диапазон на 999999 строк (посмотрите у меня в посте выше в файле-примере), заранее ставите все нужные поля в фильтр отчета и делайте сколько хотите раз - только в фильтрах выбирайте нужные значения и всё. Очень удобно и, что немаловажно, очень быстро._Boroda_
И то-о-оормозит при каждом изменении на листе-источнике, да если ещё в источнике есть формулы, да ещё если не отключено обновление при открытии-закрытии... Или придется отключать-включать автоперерасчет сводной - а это, по сути, то же самое, что и тыкать в кнопочку "сделать запрос". Конечно, можно объединить подход - формат вывода сделать сводной, отключить её обновление, а затем подвесить это обновление на нужные события - нажатие кнопки, таймер, добавление строк - это макросом...
Ну, это источник данных для сводной - запрос. Причем именно такой, какой вы написали бы "в коде", т.е. его можно из той же сводной взять и использовать уже без неё. Так что не настолько и сложно организовать выборку просто запросом. Но сама сводная ещё и предлагает дополнительный функционал, который в случае "голого" запроса пришлось бы писать отдельныим кодом. Так что все зависит от решаемой задачи в комплексе - иногда в "чистом коде" настроить параметрический запрос удобнее, нежели настраивать-перестраивать параметры сводной.
И то-о-оормозит при каждом изменении на листе-источнике, да если ещё в источнике есть формулы, да ещё если не отключено обновление при открытии-закрытии... Или придется отключать-включать автоперерасчет сводной - а это, по сути, то же самое, что и тыкать в кнопочку "сделать запрос". Конечно, можно объединить подход - формат вывода сделать сводной, отключить её обновление, а затем подвесить это обновление на нужные события - нажатие кнопки, таймер, добавление строк - это макросом...
Ну, это источник данных для сводной - запрос. Причем именно такой, какой вы написали бы "в коде", т.е. его можно из той же сводной взять и использовать уже без неё. Так что не настолько и сложно организовать выборку просто запросом. Но сама сводная ещё и предлагает дополнительный функционал, который в случае "голого" запроса пришлось бы писать отдельныим кодом. Так что все зависит от решаемой задачи в комплексе - иногда в "чистом коде" настроить параметрический запрос удобнее, нежели настраивать-перестраивать параметры сводной.AndreTM
иногда в "чистом коде" настроить параметрический запрос удобнее, нежели настраивать-перестраивать параметры сводной.
Конечно. Если умеешь. Однако в сводной все наглядно, мышой перетащил что нужно куда нужно - и наслаждайся, справится любой. А сколько будет Владимир писать это твое
подвесить это обновление на нужные события - нажатие кнопки, таймер, добавление строк - это макросом...
Тогда уж давай все в Акс засунем, или вообще сразу запросом с родной базы тянуть будем. Да, твой подход безусловно лучше, но вот если с Олимпа спуститься, то вполне может оказаться, что не для всех - многим гораздо комфортнее пользоваться инструментом, пусть и не таким совершенным, но зато знакомым. Сколько раз уже здесь звучало от далеко неглупых людей что-то типа: "Формулу я еще поправить может быть и смогу, а вот чтобы с макросом разобраться, мне придется очень много времени потратить. Да и то не факт, что получится.". Правда, существует еще категория (и я сам к ней отношусь) "Лучше день потерять, зато потом за 5 минут долететь". Вот для них да, это было бы интересно. А когда не просто слова, но и пример еще есть, то в особенности.
иногда в "чистом коде" настроить параметрический запрос удобнее, нежели настраивать-перестраивать параметры сводной.
Конечно. Если умеешь. Однако в сводной все наглядно, мышой перетащил что нужно куда нужно - и наслаждайся, справится любой. А сколько будет Владимир писать это твое
подвесить это обновление на нужные события - нажатие кнопки, таймер, добавление строк - это макросом...
Тогда уж давай все в Акс засунем, или вообще сразу запросом с родной базы тянуть будем. Да, твой подход безусловно лучше, но вот если с Олимпа спуститься, то вполне может оказаться, что не для всех - многим гораздо комфортнее пользоваться инструментом, пусть и не таким совершенным, но зато знакомым. Сколько раз уже здесь звучало от далеко неглупых людей что-то типа: "Формулу я еще поправить может быть и смогу, а вот чтобы с макросом разобраться, мне придется очень много времени потратить. Да и то не факт, что получится.". Правда, существует еще категория (и я сам к ней отношусь) "Лучше день потерять, зато потом за 5 минут долететь". Вот для них да, это было бы интересно. А когда не просто слова, но и пример еще есть, то в особенности._Boroda_
Public Sub RefreshData() 'Created using add-in ActiveTables Dim strConnection As String Dim strSQL As String strConnection = IIf(Val(Application.Version) < 12, "OLEDB;Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties='Excel 8.0;HDR=NO;IMEX=3';", "OLEDB;Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties='Excel 12.0;HDR=NO;IMEX=3';") strSQL = "SELECT DISTINCT 1 AS ТИП, F1 AS ИМЯ, count(*) AS КОЛВО FROM [Расчет долей$a2:d16] GROUP BY F1 union all SELECT DISTINCT 2, F1, count(*) FROM [Расчет долей$a2:d16] WHERE F2='ФО1' GROUP BY F1 union all SELECT DISTINCT 3, F1, count(*) FROM [Расчет долей$a2:d16] WHERE F2='ФО1' AND F3='группа 1' AND F4='тип1' GROUP BY F1" With ThisWorkbook.Sheets.Add With .QueryTables.Add(strConnection, .Range("A1"), strSQL) .Refresh False .Delete End With End With End Sub
[/vba]
[vba]
Код
Public Sub RefreshData() 'Created using add-in ActiveTables Dim strConnection As String Dim strSQL As String strConnection = IIf(Val(Application.Version) < 12, "OLEDB;Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties='Excel 8.0;HDR=NO;IMEX=3';", "OLEDB;Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties='Excel 12.0;HDR=NO;IMEX=3';") strSQL = "SELECT DISTINCT 1 AS ТИП, F1 AS ИМЯ, count(*) AS КОЛВО FROM [Расчет долей$a2:d16] GROUP BY F1 union all SELECT DISTINCT 2, F1, count(*) FROM [Расчет долей$a2:d16] WHERE F2='ФО1' GROUP BY F1 union all SELECT DISTINCT 3, F1, count(*) FROM [Расчет долей$a2:d16] WHERE F2='ФО1' AND F3='группа 1' AND F4='тип1' GROUP BY F1" With ThisWorkbook.Sheets.Add With .QueryTables.Add(strConnection, .Range("A1"), strSQL) .Refresh False .Delete End With End With End Sub