Я бы по-простому дважды использовал расширенный фильтр (в 2007: Данные - Сортировка и фильтр - Дополнительно). В первый раз отбираем уникальные сочетания Продавец и Дата продажи. Во второй раз отбираем из результатов первого раза уникальные значения Продавец и справа добавляем к ним колонку формул с функцией СЧЁТЕСЛИ.
Я бы по-простому дважды использовал расширенный фильтр (в 2007: Данные - Сортировка и фильтр - Дополнительно). В первый раз отбираем уникальные сочетания Продавец и Дата продажи. Во второй раз отбираем из результатов первого раза уникальные значения Продавец и справа добавляем к ним колонку формул с функцией СЧЁТЕСЛИ.Gustav
Действительно нужно кол-во уникальных дней по каждому сотруднику. Данных может доходить до 20 тыс . строк. Нужно сформировать из этих данных рейтинг продавцов с количеством отработанных дней. Вот и завис как быстро просчитывать эти дни. Со сводной таблицей не очень удобно. Наверное оптимально использовать форму массива. Спасибо. Если вдруг получатся другие варианты, буду благодарен.
Действительно нужно кол-во уникальных дней по каждому сотруднику. Данных может доходить до 20 тыс . строк. Нужно сформировать из этих данных рейтинг продавцов с количеством отработанных дней. Вот и завис как быстро просчитывать эти дни. Со сводной таблицей не очень удобно. Наверное оптимально использовать форму массива. Спасибо. Если вдруг получатся другие варианты, буду благодарен.Romka
Если вдруг получатся другие варианты, буду благодарен.
Могу предложить вариант с макросом, использующим объекты библиотеки ADO. Результат получается с помощью SQL-запроса к листу Excel как к таблице БД. Данные результата возвращаются в ту же рабочую книгу на другой лист при помощи эффектного метода CopyFromRecordset объекта Range:
[vba]
Code
Sub selectData()
'ВАЖНО: в Tools \ References нужна ссылка на: 'Microsoft ActiveX Data Objects 2.8 Library '(или с другим близким к 2.8 номером версии)
Dim cnn As New ADODB.Connection Dim rst As New ADODB.Recordset Dim rng As Range Dim fullFileName As String Dim cnnStr As String Dim sqlStmt As String Dim i As Integer
'полное имя файла - подправить для своего случая! fullFileName = "C:\KKU\ExcelWorld\Подсчёт смен 2.xls"
'формирование запроса SQL sqlStmt = sqlStmt & "SELECT Продавец AS ФИО, Count(*) AS [отработано смен] " sqlStmt = sqlStmt & "FROM (" sqlStmt = sqlStmt & "SELECT Продавец, [Дата продажи] FROM [Лист1$] " sqlStmt = sqlStmt & "GROUP BY Продавец, [Дата продажи]" sqlStmt = sqlStmt & ") GROUP BY Продавец"
'готовим объекты ADODB: Connection и Recordset cnn.Open cnnStr rst.Open sqlStmt, cnn
'выводим собственно данные Set rng = Worksheets("Лист2").Range("A2") rng.CopyFromRecordset rst
'прописываем заголовки и подгоняем ширину колонок For i = 0 To rst.Fields.Count - 1 With rng.Offset(-1, i) .Value = rst.Fields(i).Name .Font.Bold = True End With Next i rng.CurrentRegion.Columns.AutoFit
End Sub
[/vba] Внимание! Вначале файл из архива следует сохранить на диске. Затем откройте его в Excel, перейдите в редактор VB (по Alt+F11) и пропишите в переменную fullFileName свой полный путь к этому файлу. Далее запустите макрос прямо в редакторе (по F5) - результат появится на Листе2. Обратите внимание, что благодаря GROUP BY в запросе данные получаем сразу в отсортированном виде.
Необходимость обязательного сохранения файла на диске - на мой взгляд, единственное неудобство данного подхода. Если бы SQL-запросы можно было бы делать к листам несохраненной книги (пока она еще называется "Книга1" или "Book1"), то это была бы вообще чума!
Quote (Romka)
Если вдруг получатся другие варианты, буду благодарен.
Могу предложить вариант с макросом, использующим объекты библиотеки ADO. Результат получается с помощью SQL-запроса к листу Excel как к таблице БД. Данные результата возвращаются в ту же рабочую книгу на другой лист при помощи эффектного метода CopyFromRecordset объекта Range:
[vba]
Code
Sub selectData()
'ВАЖНО: в Tools \ References нужна ссылка на: 'Microsoft ActiveX Data Objects 2.8 Library '(или с другим близким к 2.8 номером версии)
Dim cnn As New ADODB.Connection Dim rst As New ADODB.Recordset Dim rng As Range Dim fullFileName As String Dim cnnStr As String Dim sqlStmt As String Dim i As Integer
'полное имя файла - подправить для своего случая! fullFileName = "C:\KKU\ExcelWorld\Подсчёт смен 2.xls"
'формирование запроса SQL sqlStmt = sqlStmt & "SELECT Продавец AS ФИО, Count(*) AS [отработано смен] " sqlStmt = sqlStmt & "FROM (" sqlStmt = sqlStmt & "SELECT Продавец, [Дата продажи] FROM [Лист1$] " sqlStmt = sqlStmt & "GROUP BY Продавец, [Дата продажи]" sqlStmt = sqlStmt & ") GROUP BY Продавец"
'готовим объекты ADODB: Connection и Recordset cnn.Open cnnStr rst.Open sqlStmt, cnn
'выводим собственно данные Set rng = Worksheets("Лист2").Range("A2") rng.CopyFromRecordset rst
'прописываем заголовки и подгоняем ширину колонок For i = 0 To rst.Fields.Count - 1 With rng.Offset(-1, i) .Value = rst.Fields(i).Name .Font.Bold = True End With Next i rng.CurrentRegion.Columns.AutoFit
End Sub
[/vba] Внимание! Вначале файл из архива следует сохранить на диске. Затем откройте его в Excel, перейдите в редактор VB (по Alt+F11) и пропишите в переменную fullFileName свой полный путь к этому файлу. Далее запустите макрос прямо в редакторе (по F5) - результат появится на Листе2. Обратите внимание, что благодаря GROUP BY в запросе данные получаем сразу в отсортированном виде.
Необходимость обязательного сохранения файла на диске - на мой взгляд, единственное неудобство данного подхода. Если бы SQL-запросы можно было бы делать к листам несохраненной книги (пока она еще называется "Книга1" или "Book1"), то это была бы вообще чума!Gustav
Результат получается с помощью SQL-запроса к листу Excel как к таблице БД
Первая мысль, которая пришла в голову, когда я прочитала исходное условие, была "как легко эта задача решилась бы в Access запросом". Оказывается Excel можно заставить работать с SQL-запросами! Класс!
Quote (Gustav)
Результат получается с помощью SQL-запроса к листу Excel как к таблице БД
Первая мысль, которая пришла в голову, когда я прочитала исходное условие, была "как легко эта задача решилась бы в Access запросом". Оказывается Excel можно заставить работать с SQL-запросами! Класс!Pelena
"Черт возьми, Холмс! Но как??!!" Ю-money 41001765434816
Оказывается Excel можно заставить работать с SQL-запросами!
Да еще с какими многоэтажными! Вот здесь http://axforum.info/forums/showthread.php?p=131767#post131767 я показывал запрос к листу Excel (язык, правда, не VBA), который возвращает фамилии, начинающиеся на 3-ю по "популярности" (ранг) первую букву поля Name (полное ФИО):
[vba]
Code
# doc.setRecordSource( # 'SELECT * FROM [EmplTable$] WHERE Left([Name],1) IN ' + # '( ' + # ' SELECT TOP 1 FirstLetter FROM ' + # ' ( ' + # ' SELECT TOP 3 FirstLetter, Count(*) AS CountOfFirstLetter ' + # ' FROM ' + # ' ( ' + # ' SELECT Left([Name],1) AS FirstLetter, [EmplTable$].* ' + # ' FROM [EmplTable$] ' + # ' ) ' + # ' GROUP BY FirstLetter ' + # ' ORDER BY Count(*) DESC ' + # ' ) ' + # ' ORDER BY CountOfFirstLetter ' + # ') ' );
[/vba]
Quote (Pelena)
Оказывается Excel можно заставить работать с SQL-запросами!
Да еще с какими многоэтажными! Вот здесь http://axforum.info/forums/showthread.php?p=131767#post131767 я показывал запрос к листу Excel (язык, правда, не VBA), который возвращает фамилии, начинающиеся на 3-ю по "популярности" (ранг) первую букву поля Name (полное ФИО):
[vba]
Code
# doc.setRecordSource( # 'SELECT * FROM [EmplTable$] WHERE Left([Name],1) IN ' + # '( ' + # ' SELECT TOP 1 FirstLetter FROM ' + # ' ( ' + # ' SELECT TOP 3 FirstLetter, Count(*) AS CountOfFirstLetter ' + # ' FROM ' + # ' ( ' + # ' SELECT Left([Name],1) AS FirstLetter, [EmplTable$].* ' + # ' FROM [EmplTable$] ' + # ' ) ' + # ' GROUP BY FirstLetter ' + # ' ORDER BY Count(*) DESC ' + # ' ) ' + # ' ORDER BY CountOfFirstLetter ' + # ') ' );
Я не об этом (файл не смотрел, не могу, временно нет Excel). Я о том, что сводные таблицы, во всех случаях, используют SQL-запросы. Именно поэтому они и работают так быстро
Я не об этом (файл не смотрел, не могу, временно нет Excel). Я о том, что сводные таблицы, во всех случаях, используют SQL-запросы. Именно поэтому они и работают так быстроSerge_007
Ну да. Не Вы одна. Даже вывели правило: Чем больше знаешь - тем меньше знаешь Правда сводные - это не совсем Excel. Точнее совсем не Excel, как и VBA.
Ну да. Не Вы одна. Даже вывели правило: Чем больше знаешь - тем меньше знаешь Правда сводные - это не совсем Excel. Точнее совсем не Excel, как и VBA.Serge_007
Вначале файл из архива следует сохранить на диске. Затем откройте его в Excel, перейдите в редактор VB (по Alt+F11) и пропишите в переменную fullFileName свой полный путь к этому файлу.
А впрочем что-то я... есть же замечательное свойство ThisWorkbook.FullName, которое позволит работать с файлом прямо из архива без явного сохранения. Исправил строку для fullFileName. К сожалению, не смог сделать это прямо в сообщении №6 - вероятно есть какое-то ограничение по времени на правку сообщения. В прилагаемом к этому сообщению файле - в исправленном виде, можно запускать макрос по Alt+F8 "прямо в архиве".
Quote (Gustav)
Вначале файл из архива следует сохранить на диске. Затем откройте его в Excel, перейдите в редактор VB (по Alt+F11) и пропишите в переменную fullFileName свой полный путь к этому файлу.
А впрочем что-то я... есть же замечательное свойство ThisWorkbook.FullName, которое позволит работать с файлом прямо из архива без явного сохранения. Исправил строку для fullFileName. К сожалению, не смог сделать это прямо в сообщении №6 - вероятно есть какое-то ограничение по времени на правку сообщения. В прилагаемом к этому сообщению файле - в исправленном виде, можно запускать макрос по Alt+F8 "прямо в архиве".Gustav