Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Посчитать смены из базы данных - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Посчитать смены из базы данных
Romka Дата: Суббота, 14.07.2012, 20:10 | Сообщение № 1
Группа: Пользователи
Ранг: Прохожий
Сообщений: 2
Репутация: 0 ±
Замечаний: 0% ±

Помогите составить формулу для подсчёта кол-ва дней по каждому сотруднику
К сообщению приложен файл: 7655993.rar (70.7 Kb)
 
Ответить
СообщениеПомогите составить формулу для подсчёта кол-ва дней по каждому сотруднику

Автор - Romka
Дата добавления - 14.07.2012 в 20:10
MCH Дата: Суббота, 14.07.2012, 20:44 | Сообщение № 2
Группа: Админы
Ранг: Старожил
Сообщений: 2004
Репутация: 752 ±
Замечаний: ±

что именно нужно сосчитать? Поясните подробнее.

Может нужно кол-во уникальных дней по каждому сотуднику?
Формала массива (вводится нажатием ctrl+shift+enter)
Code
=СЧЁТ(1/ЧАСТОТА(ЕСЛИ($A$2:$A$6741=F2;--$C$2:$C$6741);--$C$2:$C$6741))


для такого кол-ва данных формулы массива будут медленно работать, лучше использовать сводные таблицы


Сообщение отредактировал MCH - Суббота, 14.07.2012, 20:55
 
Ответить
Сообщениечто именно нужно сосчитать? Поясните подробнее.

Может нужно кол-во уникальных дней по каждому сотуднику?
Формала массива (вводится нажатием ctrl+shift+enter)
Code
=СЧЁТ(1/ЧАСТОТА(ЕСЛИ($A$2:$A$6741=F2;--$C$2:$C$6741);--$C$2:$C$6741))


для такого кол-ва данных формулы массива будут медленно работать, лучше использовать сводные таблицы

Автор - MCH
Дата добавления - 14.07.2012 в 20:44
ABC Дата: Суббота, 14.07.2012, 20:54 | Сообщение № 3
Группа: Друзья
Ранг: Обитатель
Сообщений: 397
Репутация: 112 ±
Замечаний: 0% ±

Excel 2007
сводной + формула
Excel 2007 и более
К сообщению приложен файл: 7237855.rar (86.2 Kb)


MS Excel 2007 and 2010...
-------------------------------
С Уважением, Даулет
 
Ответить
Сообщениесводной + формула
Excel 2007 и более

Автор - ABC
Дата добавления - 14.07.2012 в 20:54
Gustav Дата: Суббота, 14.07.2012, 21:45 | Сообщение № 4
Группа: Админы
Ранг: Участник клуба
Сообщений: 2797
Репутация: 1161 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
Я бы по-простому дважды использовал расширенный фильтр (в 2007: Данные - Сортировка и фильтр - Дополнительно). В первый раз отбираем уникальные сочетания Продавец и Дата продажи. Во второй раз отбираем из результатов первого раза уникальные значения Продавец и справа добавляем к ним колонку формул с функцией СЧЁТЕСЛИ.
К сообщению приложен файл: Podschet_03.rar (98.3 Kb)


МОИ: Ник, Tip box: 41001663842605
 
Ответить
СообщениеЯ бы по-простому дважды использовал расширенный фильтр (в 2007: Данные - Сортировка и фильтр - Дополнительно). В первый раз отбираем уникальные сочетания Продавец и Дата продажи. Во второй раз отбираем из результатов первого раза уникальные значения Продавец и справа добавляем к ним колонку формул с функцией СЧЁТЕСЛИ.

Автор - Gustav
Дата добавления - 14.07.2012 в 21:45
Romka Дата: Суббота, 14.07.2012, 22:29 | Сообщение № 5
Группа: Пользователи
Ранг: Прохожий
Сообщений: 2
Репутация: 0 ±
Замечаний: 0% ±

Действительно нужно кол-во уникальных дней по каждому сотруднику. Данных может доходить до 20 тыс . строк. Нужно сформировать из этих данных рейтинг продавцов с количеством отработанных дней. Вот и завис как быстро просчитывать эти дни. Со сводной таблицей не очень удобно. Наверное оптимально использовать форму массива. Спасибо. Если вдруг получатся другие варианты, буду благодарен.
 
Ответить
СообщениеДействительно нужно кол-во уникальных дней по каждому сотруднику. Данных может доходить до 20 тыс . строк. Нужно сформировать из этих данных рейтинг продавцов с количеством отработанных дней. Вот и завис как быстро просчитывать эти дни. Со сводной таблицей не очень удобно. Наверное оптимально использовать форму массива. Спасибо. Если вдруг получатся другие варианты, буду благодарен.

Автор - Romka
Дата добавления - 14.07.2012 в 22:29
Gustav Дата: Воскресенье, 15.07.2012, 02:55 | Сообщение № 6
Группа: Админы
Ранг: Участник клуба
Сообщений: 2797
Репутация: 1161 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
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"
                  
           'формирование строки подключения (ConnectionString)
           cnnStr = cnnStr & "Provider=Microsoft.Jet.OLEDB.4.0;" 'для Excel до 2007
           'cnnStr = cnnStr & "Provider=Microsoft.ACE.OLEDB.12.0;" 'для Excel c 2007
           cnnStr = cnnStr & "Data Source=" & fullFileName & ";"
           cnnStr = cnnStr & "Extended Properties="
           cnnStr = cnnStr & "'Excel 8.0;HDR=Yes'" 'для Excel до 2007
           'cnnStr = cnnStr & "'Excel 12.0;HDR=Yes'" 'для Excel c 2007
                  
           'формирование запроса 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"), то это была бы вообще чума!
К сообщению приложен файл: Podschet_04.rar (61.2 Kb)


МОИ: Ник, Tip box: 41001663842605

Сообщение отредактировал Gustav - Воскресенье, 15.07.2012, 03:23
 
Ответить
Сообщение
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"
                  
           'формирование строки подключения (ConnectionString)
           cnnStr = cnnStr & "Provider=Microsoft.Jet.OLEDB.4.0;" 'для Excel до 2007
           'cnnStr = cnnStr & "Provider=Microsoft.ACE.OLEDB.12.0;" 'для Excel c 2007
           cnnStr = cnnStr & "Data Source=" & fullFileName & ";"
           cnnStr = cnnStr & "Extended Properties="
           cnnStr = cnnStr & "'Excel 8.0;HDR=Yes'" 'для Excel до 2007
           'cnnStr = cnnStr & "'Excel 12.0;HDR=Yes'" 'для Excel c 2007
                  
           'формирование запроса 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
Дата добавления - 15.07.2012 в 02:55
Pelena Дата: Воскресенье, 15.07.2012, 08:23 | Сообщение № 7
Группа: Админы
Ранг: Местный житель
Сообщений: 19404
Репутация: 4555 ±
Замечаний: ±

Excel 365 & Mac Excel
Quote (Gustav)
Результат получается с помощью SQL-запроса к листу Excel как к таблице БД

Первая мысль, которая пришла в голову, когда я прочитала исходное условие, была "как легко эта задача решилась бы в Access запросом". Оказывается Excel можно заставить работать с SQL-запросами! Класс!


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
Сообщение
Quote (Gustav)
Результат получается с помощью SQL-запроса к листу Excel как к таблице БД

Первая мысль, которая пришла в голову, когда я прочитала исходное условие, была "как легко эта задача решилась бы в Access запросом". Оказывается Excel можно заставить работать с SQL-запросами! Класс!

Автор - Pelena
Дата добавления - 15.07.2012 в 08:23
Gustav Дата: Воскресенье, 15.07.2012, 12:36 | Сообщение № 8
Группа: Админы
Ранг: Участник клуба
Сообщений: 2797
Репутация: 1161 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
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  ' +
         #        ')  ' );
[/vba]


МОИ: Ник, Tip box: 41001663842605

Сообщение отредактировал Gustav - Воскресенье, 15.07.2012, 12:44
 
Ответить
Сообщение
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  ' +
         #        ')  ' );
[/vba]

Автор - Gustav
Дата добавления - 15.07.2012 в 12:36
Serge_007 Дата: Воскресенье, 15.07.2012, 12:59 | Сообщение № 9
Группа: Админы
Ранг: Местный житель
Сообщений: 16475
Репутация: 2749 ±
Замечаний: ±

Excel 2016
Quote (Pelena)
Excel можно заставить работать с SQL-запросами!

Вы забыли про сводные таблицы?


ЮMoney:41001419691823 | WMR:126292472390
 
Ответить
Сообщение
Quote (Pelena)
Excel можно заставить работать с SQL-запросами!

Вы забыли про сводные таблицы?

Автор - Serge_007
Дата добавления - 15.07.2012 в 12:59
Pelena Дата: Воскресенье, 15.07.2012, 14:04 | Сообщение № 10
Группа: Админы
Ранг: Местный житель
Сообщений: 19404
Репутация: 4555 ±
Замечаний: ±

Excel 365 & Mac Excel
Quote (Serge_007)
Вы забыли про сводные таблицы?

К сожалению, моих познаний в Excel не хватило, чтобы решить эту задачу с помощью сводной таблицы sad


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
Сообщение
Quote (Serge_007)
Вы забыли про сводные таблицы?

К сожалению, моих познаний в Excel не хватило, чтобы решить эту задачу с помощью сводной таблицы sad

Автор - Pelena
Дата добавления - 15.07.2012 в 14:04
Serge_007 Дата: Воскресенье, 15.07.2012, 14:08 | Сообщение № 11
Группа: Админы
Ранг: Местный житель
Сообщений: 16475
Репутация: 2749 ±
Замечаний: ±

Excel 2016
Я не об этом (файл не смотрел, не могу, временно нет Excel). Я о том, что сводные таблицы, во всех случаях, используют SQL-запросы. Именно поэтому они и работают так быстро


ЮMoney:41001419691823 | WMR:126292472390
 
Ответить
СообщениеЯ не об этом (файл не смотрел, не могу, временно нет Excel). Я о том, что сводные таблицы, во всех случаях, используют SQL-запросы. Именно поэтому они и работают так быстро

Автор - Serge_007
Дата добавления - 15.07.2012 в 14:08
Pelena Дата: Воскресенье, 15.07.2012, 14:22 | Сообщение № 12
Группа: Админы
Ранг: Местный житель
Сообщений: 19404
Репутация: 4555 ±
Замечаний: ±

Excel 365 & Mac Excel
Quote (Serge_007)
сводные таблицы, во всех случаях, используют SQL-запросы

С каждым разом я всё больше убеждаюсь, как мало я знаю об Excel sad


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
Сообщение
Quote (Serge_007)
сводные таблицы, во всех случаях, используют SQL-запросы

С каждым разом я всё больше убеждаюсь, как мало я знаю об Excel sad

Автор - Pelena
Дата добавления - 15.07.2012 в 14:22
Serge_007 Дата: Воскресенье, 15.07.2012, 14:36 | Сообщение № 13
Группа: Админы
Ранг: Местный житель
Сообщений: 16475
Репутация: 2749 ±
Замечаний: ±

Excel 2016
Ну да. Не Вы одна. Даже вывели правило: Чем больше знаешь - тем меньше знаешь smile
Правда сводные - это не совсем Excel. Точнее совсем не Excel, как и VBA.


ЮMoney:41001419691823 | WMR:126292472390
 
Ответить
СообщениеНу да. Не Вы одна. Даже вывели правило: Чем больше знаешь - тем меньше знаешь smile
Правда сводные - это не совсем Excel. Точнее совсем не Excel, как и VBA.

Автор - Serge_007
Дата добавления - 15.07.2012 в 14:36
Gustav Дата: Понедельник, 16.07.2012, 10:04 | Сообщение № 14
Группа: Админы
Ранг: Участник клуба
Сообщений: 2797
Репутация: 1161 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
Quote (Gustav)
Вначале файл из архива следует сохранить на диске. Затем откройте его в Excel, перейдите в редактор VB (по Alt+F11) и пропишите в переменную fullFileName свой полный путь к этому файлу.

А впрочем что-то я... есть же замечательное свойство ThisWorkbook.FullName, которое позволит работать с файлом прямо из архива без явного сохранения. Исправил строку для fullFileName. К сожалению, не смог сделать это прямо в сообщении №6 - вероятно есть какое-то ограничение по времени на правку сообщения. В прилагаемом к этому сообщению файле - в исправленном виде, можно запускать макрос по Alt+F8 "прямо в архиве".
К сообщению приложен файл: Podschet_05.rar (59.4 Kb)


МОИ: Ник, Tip box: 41001663842605

Сообщение отредактировал Gustav - Понедельник, 16.07.2012, 10:06
 
Ответить
Сообщение
Quote (Gustav)
Вначале файл из архива следует сохранить на диске. Затем откройте его в Excel, перейдите в редактор VB (по Alt+F11) и пропишите в переменную fullFileName свой полный путь к этому файлу.

А впрочем что-то я... есть же замечательное свойство ThisWorkbook.FullName, которое позволит работать с файлом прямо из архива без явного сохранения. Исправил строку для fullFileName. К сожалению, не смог сделать это прямо в сообщении №6 - вероятно есть какое-то ограничение по времени на правку сообщения. В прилагаемом к этому сообщению файле - в исправленном виде, можно запускать макрос по Alt+F8 "прямо в архиве".

Автор - Gustav
Дата добавления - 16.07.2012 в 10:04
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!