Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.05.2012, 00:41   #1
Radmir_Tzareff
Новичок
Джуниор
 
Регистрация: 28.05.2012
Сообщений: 5
По умолчанию Сравнение списка по 2 параметрам и увеличение счетчика на 1

Доброго времени суток всем. Помогите, пожалуйста, не могу разобраться с задачкой.
Есть 2 таблицы.
1. Перечень что у кого есть.
Имя Техника
Вася Трактор
Вася Косилка
Петя Кран
Ваня Отбойник
2. Заказ
Вася Трактор
Петя Кран
Ваня Отбойник
Вася Трактор
Задача: посчитать сколько и какой техники было заказано у определенного человека.
Помогите понять принцип как это сделать.
Radmir_Tzareff вне форума Ответить с цитированием
Старый 28.05.2012, 01:15   #2
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

Учитывая,что писал в блокноте,лень создавать файл,строку запроса подкорректируете под себя.

Результат
Имя......Техника.......Количество
Ваня.....Отбойник......... 1
Вася.....Трактор...........2
Петя.....Кран................1

Код:
Private Sub CommandButton1_Click()
strSql = " SELECT Имя, Техника, Count(Техника) AS [Количество] FROM [Лист1$A1:B65000] GROUP BY Имя, Техника;"
ADO_R strSql
End Sub
Sub ADO_R_Dmitry(ByVal strSql$)
        FilePath$ = ThisWorkbook.FullName
        Dim sCon As String, FieldName As String
        Dim rs As Object, cn As Object
        Set rs = CreateObject("ADODB.Recordset")
        Set cn = CreateObject("ADODB.Connection")
        Select Case CLng(Split(Application.Version, ".")(0))
        Case Is < 12
                sCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & FilePath & ";Extended Properties=""Excel 8.0;HDR=YES;IMEX=1"";"
        Case Is >= 12
                sCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & FilePath & ";Extended Properties=""Excel 12.0;HDR=YES;IMEX=1"";"
        End Select
        cn.Open sCon
        If Not cn.State = 1 Then Exit Sub
        On Error Resume Next
        Set rs = cn.Execute(strSql)
        If Err.Number <> 0 Then Exit Sub
        Лист2.Range("A1").CopyFromRecordset rs
        ADO_R = rs.GetRows
        rs.Close: cn.Close
        Set cn = Nothing: Set rs = Nothing
End Sub
;
Анализ,обработка данных Недорого
doober вне форума Ответить с цитированием
Старый 29.05.2012, 00:34   #3
Radmir_Tzareff
Новичок
Джуниор
 
Регистрация: 28.05.2012
Сообщений: 5
По умолчанию

Спасибо doober, сегодня попробую.
Radmir_Tzareff вне форума Ответить с цитированием
Старый 29.05.2012, 01:25   #4
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

Выделенное красным удалите.

Код:
      If Err.Number <> 0 Then Exit Sub
        Лист2.Range("A1").CopyFromRecordset rs
        ADO_R = rs.GetRows
        rs.Close: cn.Close
        Set cn = Nothing: Set rs = Nothing
End Sub
Анализ,обработка данных Недорого
doober вне форума Ответить с цитированием
Старый 29.05.2012, 09:36   #5
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

Принцип может быть такой -
1. перебираем данные циклом и заносим в словарь строку "Вася Трактор", в item 1.
3. если строка уже есть в словаре - увеличиваем её item на 1.
4. в конце содержимое словаря выгружаем куда угодно.

Как вариант - к словарю параллельно "подвязать" массив, куда складывать вась и трактора, и там же считать повторы. А в словаре держать строки и их позицию в массиве. Массив в итоге выгрузить.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 30.05.2012, 00:58   #6
Radmir_Tzareff
Новичок
Джуниор
 
Регистрация: 28.05.2012
Сообщений: 5
По умолчанию

Извините ребят, что-то я даже стартануть его не могу. Я макросами раньше вообще не пользовался, но думал вставлю текст и все заработает, а он мне пишет в ответ: Compile error expected end sub. Можно если не затруднит пример файлом, я хоть бы по примеру начал разбираться. А нельзя эту задачку стандартными функциями решить? Спасибо.
Radmir_Tzareff вне форума Ответить с цитированием
Старый 30.05.2012, 01:00   #7
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

Создайте файлик с записями,прикрепите к сообщению и получите готовое решение.
PS:Я за вас свою работу делать не буду
Анализ,обработка данных Недорого
doober вне форума Ответить с цитированием
Старый 30.05.2012, 01:40   #8
Radmir_Tzareff
Новичок
Джуниор
 
Регистрация: 28.05.2012
Сообщений: 5
По умолчанию

Спасибо doober, за труды. Но я тут щас копался и нашел классную функцию делает именно то, что надо =СЧЁТЕСЛИМН(интервал1;условие1;инте рвал2;условие2). Спасибо всем за ответы. Думаю макросы начать чуть позже осваивать.
Radmir_Tzareff вне форума Ответить с цитированием
Старый 30.05.2012, 02:24   #9
Radmir_Tzareff
Новичок
Джуниор
 
Регистрация: 28.05.2012
Сообщений: 5
По умолчанию

Первая задача комплит, теперь висит вопрос, а можно ли сделать авто сортировку на страницу по количеству? А то руками приходится нажимать "сортировка" при изменении значений кол-ва заказов. Смысл в том, что бы ексель выдавал на первом месте наибольшее кол-во заказанной техники автоматом перемещая победителей вверх страницы.
Radmir_Tzareff вне форума Ответить с цитированием
Старый 30.05.2012, 08:39   #10
staniiislav
Форумчанин
 
Аватар для staniiislav
 
Регистрация: 16.04.2010
Сообщений: 695
По умолчанию

Цитата:
Сообщение от doober Посмотреть сообщение
Учитывая,что писал в блокноте,лень создавать файл,строку запроса подкорректируете под себя.

Результат
Имя......Техника.......Количество
Ваня.....Отбойник......... 1
Вася.....Трактор...........2
Петя.....Кран................1

Код:
Private Sub CommandButton1_Click()
strSql = " SELECT Имя, Техника, Count(Техника) AS [Количество] FROM [Лист1$A1:B65000] GROUP BY Имя, Техника;"
ADO_R strSql
End Sub
Sub ADO_R_Dmitry(ByVal strSql$)
        FilePath$ = ThisWorkbook.FullName
        Dim sCon As String, FieldName As String
        Dim rs As Object, cn As Object
        Set rs = CreateObject("ADODB.Recordset")
        Set cn = CreateObject("ADODB.Connection")
        Select Case CLng(Split(Application.Version, ".")(0))
        Case Is < 12
                sCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & FilePath & ";Extended Properties=""Excel 8.0;HDR=YES;IMEX=1"";"
        Case Is >= 12
                sCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & FilePath & ";Extended Properties=""Excel 12.0;HDR=YES;IMEX=1"";"
        End Select
        cn.Open sCon
        If Not cn.State = 1 Then Exit Sub
        On Error Resume Next
        Set rs = cn.Execute(strSql)
        If Err.Number <> 0 Then Exit Sub
        Лист2.Range("A1").CopyFromRecordset rs
        ADO_R = rs.GetRows
        rs.Close: cn.Close
        Set cn = Nothing: Set rs = Nothing
End Sub
;
Вы не могли бы расписать по строкам что в них происходит?
Единственный способ стать умнее, играть с более умным противником...
staniiislav вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
накрутка счетчика megostudent Свободное общение 13 15.04.2012 18:38
Сравнение листов по нескольким параметрам. Daragor Microsoft Office Excel 4 05.10.2011 14:52
Алгоритм счетчика Niksan Visual C++ 1 10.06.2011 21:24
Увеличение счетчика при сохранении файлов artemavd Общие вопросы Delphi 20 20.11.2010 11:36
Установка счетчика doober Microsoft Office Access 3 21.02.2010 23:15