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

Вход

Регистрация

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

 

= Мир MS Excel/Собрать данные с суммой повторов - Мир MS Excel

Старая форма входа
  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Собрать данные с суммой повторов (Макросы/Sub)
Собрать данные с суммой повторов
ZamoK Дата: Пятница, 28.11.2014, 22:16 | Сообщение № 1
Группа: Проверенные
Ранг: Обитатель
Сообщений: 268
Репутация: 4 ±
Замечаний: 0% ±

Excel 2003-2016
Пытался сам не вышло, сделал нелепое подобие задачи (не хотел извращаться над рабочим документом), но её решение не дало нужного результата, поэтому максимально облегчил рабочую книгу. В ней порядка 30 листов, но это не так важно. Суть помощи, если она конечно возможна, сделать чтоб данные с листа "Сбор" перекочевали на лист "Выполнено", при совпадении Номера детали и операции кол-во суммировалось. Т.е мне нужны только 3,4 и 6 столбцы.
Ручной труд тяжёл, готов прислушаться к любому решению данной загигулины. :)
К сообщению приложен файл: 3105076.xlsm (55.2 Kb)


Я не Гуру, но стремлюсь!

Сообщение отредактировал ZamoK - Пятница, 28.11.2014, 22:18
 
Ответить
СообщениеПытался сам не вышло, сделал нелепое подобие задачи (не хотел извращаться над рабочим документом), но её решение не дало нужного результата, поэтому максимально облегчил рабочую книгу. В ней порядка 30 листов, но это не так важно. Суть помощи, если она конечно возможна, сделать чтоб данные с листа "Сбор" перекочевали на лист "Выполнено", при совпадении Номера детали и операции кол-во суммировалось. Т.е мне нужны только 3,4 и 6 столбцы.
Ручной труд тяжёл, готов прислушаться к любому решению данной загигулины. :)

Автор - ZamoK
Дата добавления - 28.11.2014 в 22:16
gling Дата: Пятница, 28.11.2014, 22:52 | Сообщение № 2
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2525
Репутация: 678 ±
Замечаний: 0% ±

2010
Посмотрите файл, может правильно понял.
К сообщению приложен файл: 5844768.xlsm (70.0 Kb)


ЯД-41001506838083
 
Ответить
СообщениеПосмотрите файл, может правильно понял.

Автор - gling
Дата добавления - 28.11.2014 в 22:52
doober Дата: Пятница, 28.11.2014, 23:21 | Сообщение № 3
Группа: Друзья
Ранг: Ветеран
Сообщений: 947
Репутация: 323 ±
Замечаний: 0% ±

Excel 2010
Беру плохой пример у котов <_<
[vba]
Код
Sub Gav()
       Dim Sh As Worksheet, Key As String, R_Out
       Set dict = CreateObject("scripting.dictionary")
       Set Sh = ThisWorkbook.Worksheets("Сбор")
       LastRow = Sh.Cells(Sh.Rows.Count, 3).End(xlUp).Row
       dx = Sh.Range("C2:F" & LastRow)
       For n = 1 To UBound(dx)
           Key = dx(n, 1) & "||" & dx(n, 2)
           If dx(n, 4) <> "" Then
               If dict.Exists(Key) Then
                   dict.Item(Key) = CDbl(dict.Item(Key)) + dx(n, 4)
               Else
                   dict.Item(Key) = CDbl(dx(n, 4))
               End If
           End If
       Next
       ReDim R_Out(1 To dict.Count, 1 To 3)

       Keys = dict.Keys
       For n = 0 To dict.Count - 1
           R_Out(n + 1, 1) = Split(Keys(n), "||")(0)
           R_Out(n + 1, 2) = Split(Keys(n), "||")(1)
           R_Out(n + 1, 3) = CDbl(dict.Item(Keys(n)))
       Next
       ThisWorkbook.Worksheets("Выполнено").Range("A2").Resize(dict.Count, 3) = R_Out
End Sub
[/vba]




Сообщение отредактировал doober - Пятница, 28.11.2014, 23:24
 
Ответить
СообщениеБеру плохой пример у котов <_<
[vba]
Код
Sub Gav()
       Dim Sh As Worksheet, Key As String, R_Out
       Set dict = CreateObject("scripting.dictionary")
       Set Sh = ThisWorkbook.Worksheets("Сбор")
       LastRow = Sh.Cells(Sh.Rows.Count, 3).End(xlUp).Row
       dx = Sh.Range("C2:F" & LastRow)
       For n = 1 To UBound(dx)
           Key = dx(n, 1) & "||" & dx(n, 2)
           If dx(n, 4) <> "" Then
               If dict.Exists(Key) Then
                   dict.Item(Key) = CDbl(dict.Item(Key)) + dx(n, 4)
               Else
                   dict.Item(Key) = CDbl(dx(n, 4))
               End If
           End If
       Next
       ReDim R_Out(1 To dict.Count, 1 To 3)

       Keys = dict.Keys
       For n = 0 To dict.Count - 1
           R_Out(n + 1, 1) = Split(Keys(n), "||")(0)
           R_Out(n + 1, 2) = Split(Keys(n), "||")(1)
           R_Out(n + 1, 3) = CDbl(dict.Item(Keys(n)))
       Next
       ThisWorkbook.Worksheets("Выполнено").Range("A2").Resize(dict.Count, 3) = R_Out
End Sub
[/vba]

Автор - doober
Дата добавления - 28.11.2014 в 23:21
ZamoK Дата: Пятница, 28.11.2014, 23:24 | Сообщение № 4
Группа: Проверенные
Ранг: Обитатель
Сообщений: 268
Репутация: 4 ±
Замечаний: 0% ±

Excel 2003-2016
gling, Спасибо за оперативный отклик, вариант очень хороший, но данные обновляются несколько раз в течении рабочей смены, и копирование данных не совсем удобная штука. С помощью массива я уже пробовал. Вопрос размещён в теме VBA и хотелось бы решить с помощью макроса и заветной кнопочки. Да и книга максимально облегчена, не хотелось бы протягивать каждый раз формулу :) , но все ровно большое спасибо !


Я не Гуру, но стремлюсь!
 
Ответить
Сообщениеgling, Спасибо за оперативный отклик, вариант очень хороший, но данные обновляются несколько раз в течении рабочей смены, и копирование данных не совсем удобная штука. С помощью массива я уже пробовал. Вопрос размещён в теме VBA и хотелось бы решить с помощью макроса и заветной кнопочки. Да и книга максимально облегчена, не хотелось бы протягивать каждый раз формулу :) , но все ровно большое спасибо !

Автор - ZamoK
Дата добавления - 28.11.2014 в 23:24
ZamoK Дата: Пятница, 28.11.2014, 23:31 | Сообщение № 5
Группа: Проверенные
Ранг: Обитатель
Сообщений: 268
Репутация: 4 ±
Замечаний: 0% ±

Excel 2003-2016
doober, Отлично, вот только надо куда-то засунуть .Value а то искажает формат


Я не Гуру, но стремлюсь!
 
Ответить
Сообщениеdoober, Отлично, вот только надо куда-то засунуть .Value а то искажает формат

Автор - ZamoK
Дата добавления - 28.11.2014 в 23:31
doober Дата: Пятница, 28.11.2014, 23:33 | Сообщение № 6
Группа: Друзья
Ранг: Ветеран
Сообщений: 947
Репутация: 323 ±
Замечаний: 0% ±

Excel 2010
Никуда ничего совать без проверки не надо :D
[vba]
Код

       R_Out(n + 1, 1) ="'" &  Split(Keys(n), "||")(0)
       R_Out(n + 1, 2) ="'" &  Split(Keys(n), "||")(1)
[/vba]


 
Ответить
СообщениеНикуда ничего совать без проверки не надо :D
[vba]
Код

       R_Out(n + 1, 1) ="'" &  Split(Keys(n), "||")(0)
       R_Out(n + 1, 2) ="'" &  Split(Keys(n), "||")(1)
[/vba]

Автор - doober
Дата добавления - 28.11.2014 в 23:33
ZamoK Дата: Пятница, 28.11.2014, 23:37 | Сообщение № 7
Группа: Проверенные
Ранг: Обитатель
Сообщений: 268
Репутация: 4 ±
Замечаний: 0% ±

Excel 2003-2016
Отлично hands все стало на свои места.


Я не Гуру, но стремлюсь!
 
Ответить
СообщениеОтлично hands все стало на свои места.

Автор - ZamoK
Дата добавления - 28.11.2014 в 23:37
ZamoK Дата: Пятница, 28.11.2014, 23:59 | Сообщение № 8
Группа: Проверенные
Ранг: Обитатель
Сообщений: 268
Репутация: 4 ±
Замечаний: 0% ±

Excel 2003-2016
Не посчитайте за дерзость :) , но можно ли добавить чтоб в ячейке справа через запятую были бы фамилии тех кто делал т.е. фамилии с второго столбца, если нет то и так уже прогресс огромное спасибо


Я не Гуру, но стремлюсь!
 
Ответить
СообщениеНе посчитайте за дерзость :) , но можно ли добавить чтоб в ячейке справа через запятую были бы фамилии тех кто делал т.е. фамилии с второго столбца, если нет то и так уже прогресс огромное спасибо

Автор - ZamoK
Дата добавления - 28.11.2014 в 23:59
doober Дата: Суббота, 29.11.2014, 00:28 | Сообщение № 9
Группа: Друзья
Ранг: Ветеран
Сообщений: 947
Репутация: 323 ±
Замечаний: 0% ±

Excel 2010
Можно
[vba]
Код
Sub Gav_Modern()
   Dim Sh As Worksheet, Key As String, R_Out
     Set dict = CreateObject("scripting.dictionary")
      Set Фио = CreateObject("scripting.dictionary")
     Set Sh = ThisWorkbook.Worksheets("Сбор")
     LastRow = Sh.Cells(Sh.Rows.Count, 3).End(xlUp).Row
     dx = Sh.Range("B2:F" & LastRow)
     For n = 1 To UBound(dx)
         Key = dx(n, 1) & "||" & dx(n, 3)
         If dx(n, 5) <> "" Then
             If dict.Exists(Key) Then
                 dict.Item(Key) = CDbl(dict.Item(Key)) + dx(n, 5)
             Else
                 dict.Item(Key) = CDbl(dx(n, 5))
                  Фио.Item(Key) = dx(n, 1)
             End If
         End If
     Next
     ReDim R_Out(1 To dict.Count, 1 To 4)

     Keys = dict.Keys
     For n = 0 To dict.Count - 1
         R_Out(n + 1, 1) = "'" & Split(Keys(n), "||")(0)
         R_Out(n + 1, 2) = "'" & Split(Keys(n), "||")(1)
         R_Out(n + 1, 3) = CDbl(dict.Item(Keys(n)))
         R_Out(n + 1, 4) = Фио.Item(Keys(n))
     Next
     ThisWorkbook.Worksheets("Выполнено").Range("A2").Resize(dict.Count, 4) = R_Out
End Sub
[/vba]


 
Ответить
СообщениеМожно
[vba]
Код
Sub Gav_Modern()
   Dim Sh As Worksheet, Key As String, R_Out
     Set dict = CreateObject("scripting.dictionary")
      Set Фио = CreateObject("scripting.dictionary")
     Set Sh = ThisWorkbook.Worksheets("Сбор")
     LastRow = Sh.Cells(Sh.Rows.Count, 3).End(xlUp).Row
     dx = Sh.Range("B2:F" & LastRow)
     For n = 1 To UBound(dx)
         Key = dx(n, 1) & "||" & dx(n, 3)
         If dx(n, 5) <> "" Then
             If dict.Exists(Key) Then
                 dict.Item(Key) = CDbl(dict.Item(Key)) + dx(n, 5)
             Else
                 dict.Item(Key) = CDbl(dx(n, 5))
                  Фио.Item(Key) = dx(n, 1)
             End If
         End If
     Next
     ReDim R_Out(1 To dict.Count, 1 To 4)

     Keys = dict.Keys
     For n = 0 To dict.Count - 1
         R_Out(n + 1, 1) = "'" & Split(Keys(n), "||")(0)
         R_Out(n + 1, 2) = "'" & Split(Keys(n), "||")(1)
         R_Out(n + 1, 3) = CDbl(dict.Item(Keys(n)))
         R_Out(n + 1, 4) = Фио.Item(Keys(n))
     Next
     ThisWorkbook.Worksheets("Выполнено").Range("A2").Resize(dict.Count, 4) = R_Out
End Sub
[/vba]

Автор - doober
Дата добавления - 29.11.2014 в 00:28
ZamoK Дата: Суббота, 29.11.2014, 00:34 | Сообщение № 10
Группа: Проверенные
Ранг: Обитатель
Сообщений: 268
Репутация: 4 ±
Замечаний: 0% ±

Excel 2003-2016
doober, Оё ёй вместо номеров фамилии стали [vba]
Код
№детали    №опер.    Выполнено  
БригадаШтамп    070 (010)    0    БригадаШтамп
Подорванов  0    Подорванов
Рыженкова    000    20    Рыженкова
Рыженкова    070    30    Рыженкова
Артамонов    080    30    Артамонов
[/vba]


Я не Гуру, но стремлюсь!

Сообщение отредактировал ZamoK - Суббота, 29.11.2014, 00:44
 
Ответить
Сообщениеdoober, Оё ёй вместо номеров фамилии стали [vba]
Код
№детали    №опер.    Выполнено  
БригадаШтамп    070 (010)    0    БригадаШтамп
Подорванов  0    Подорванов
Рыженкова    000    20    Рыженкова
Рыженкова    070    30    Рыженкова
Артамонов    080    30    Артамонов
[/vba]

Автор - ZamoK
Дата добавления - 29.11.2014 в 00:34
doober Дата: Суббота, 29.11.2014, 00:45 | Сообщение № 11
Группа: Друзья
Ранг: Ветеран
Сообщений: 947
Репутация: 323 ±
Замечаний: 0% ±

Excel 2010
Значит тк и будет yes


 
Ответить
СообщениеЗначит тк и будет yes

Автор - doober
Дата добавления - 29.11.2014 в 00:45
ZamoK Дата: Воскресенье, 30.11.2014, 18:19 | Сообщение № 12
Группа: Проверенные
Ранг: Обитатель
Сообщений: 268
Репутация: 4 ±
Замечаний: 0% ±

Excel 2003-2016
Вот так уже хорошо, но вот одна неувязочка, из-за которой весь сыр бор
чтоб в ячейке справа через запятую были бы фамилии тех кто делал


Я не Гуру, но стремлюсь!
 
Ответить
СообщениеВот так уже хорошо, но вот одна неувязочка, из-за которой весь сыр бор
чтоб в ячейке справа через запятую были бы фамилии тех кто делал

Автор - ZamoK
Дата добавления - 30.11.2014 в 18:19
ZamoK Дата: Воскресенье, 30.11.2014, 18:25 | Сообщение № 13
Группа: Проверенные
Ранг: Обитатель
Сообщений: 268
Репутация: 4 ±
Замечаний: 0% ±

Excel 2003-2016
Мы имеем вот это [vba]
Код
301313.073    020    4    БригадаСверл
301314.109    020    450    Артамонов
301314.109    080    297    Алехичев
[/vba]
а в исходнике вот это [vba]
Код

Алехичев    301314.109    080    1,61    150
Сысоев    301314.109    080    1,61    65
Сысоев    301314.109    080    1,61    82
[/vba]
Значит должно быть вот так [vba]
Код

301314.109    080    297    Алехиче, Сысоев
[/vba]
Если так не возможно, то спасибо за помощь, в принципе мне и так уже сильно помогли


Я не Гуру, но стремлюсь!

Сообщение отредактировал ZamoK - Воскресенье, 30.11.2014, 18:26
 
Ответить
СообщениеМы имеем вот это [vba]
Код
301313.073    020    4    БригадаСверл
301314.109    020    450    Артамонов
301314.109    080    297    Алехичев
[/vba]
а в исходнике вот это [vba]
Код

Алехичев    301314.109    080    1,61    150
Сысоев    301314.109    080    1,61    65
Сысоев    301314.109    080    1,61    82
[/vba]
Значит должно быть вот так [vba]
Код

301314.109    080    297    Алехиче, Сысоев
[/vba]
Если так не возможно, то спасибо за помощь, в принципе мне и так уже сильно помогли

Автор - ZamoK
Дата добавления - 30.11.2014 в 18:25
doober Дата: Воскресенье, 30.11.2014, 18:26 | Сообщение № 14
Группа: Друзья
Ранг: Ветеран
Сообщений: 947
Репутация: 323 ±
Замечаний: 0% ±

Excel 2010
[vba]
Код
   If dx(n, 5) <> "" Then
               If dict.Exists(Key) Then
                   dict.Item(Key) = CDbl(dict.Item(Key)) + dx(n, 5)
     'добавите эти строки и будет счастье
'..............................
   if instr(1,Фио.Item(Key) , dx(n, 1),vbTextCompare)=0 then
     Фио.Item(Key) =Фио.Item(Key) & "," &  dx(n, 1)
              end if
',,,,,,,,,,,,,,,,,,,,,,,,,,,,
               Else
                   dict.Item(Key) = CDbl(dx(n, 5))
                   Фио.Item(Key) = dx(n, 1)
               End If
       End If
[/vba]




Сообщение отредактировал doober - Воскресенье, 30.11.2014, 18:31
 
Ответить
Сообщение[vba]
Код
   If dx(n, 5) <> "" Then
               If dict.Exists(Key) Then
                   dict.Item(Key) = CDbl(dict.Item(Key)) + dx(n, 5)
     'добавите эти строки и будет счастье
'..............................
   if instr(1,Фио.Item(Key) , dx(n, 1),vbTextCompare)=0 then
     Фио.Item(Key) =Фио.Item(Key) & "," &  dx(n, 1)
              end if
',,,,,,,,,,,,,,,,,,,,,,,,,,,,
               Else
                   dict.Item(Key) = CDbl(dx(n, 5))
                   Фио.Item(Key) = dx(n, 1)
               End If
       End If
[/vba]

Автор - doober
Дата добавления - 30.11.2014 в 18:26
ZamoK Дата: Воскресенье, 30.11.2014, 18:30 | Сообщение № 15
Группа: Проверенные
Ранг: Обитатель
Сообщений: 268
Репутация: 4 ±
Замечаний: 0% ±

Excel 2003-2016
Во вот теперь все правильно выглядит, ещё раз спасибо


Я не Гуру, но стремлюсь!
 
Ответить
СообщениеВо вот теперь все правильно выглядит, ещё раз спасибо

Автор - ZamoK
Дата добавления - 30.11.2014 в 18:30
ZamoK Дата: Воскресенье, 30.11.2014, 18:31 | Сообщение № 16
Группа: Проверенные
Ранг: Обитатель
Сообщений: 268
Репутация: 4 ±
Замечаний: 0% ±

Excel 2003-2016
С доработкой убрались дубликаты - все супер !!!


Я не Гуру, но стремлюсь!
 
Ответить
СообщениеС доработкой убрались дубликаты - все супер !!!

Автор - ZamoK
Дата добавления - 30.11.2014 в 18:31
ZamoK Дата: Воскресенье, 30.11.2014, 18:38 | Сообщение № 17
Группа: Проверенные
Ранг: Обитатель
Сообщений: 268
Репутация: 4 ±
Замечаний: 0% ±

Excel 2003-2016
Ну и напоследок шлифануть бы это все :) - сортировку воткнуть по первому столбцу


Я не Гуру, но стремлюсь!
 
Ответить
СообщениеНу и напоследок шлифануть бы это все :) - сортировку воткнуть по первому столбцу

Автор - ZamoK
Дата добавления - 30.11.2014 в 18:38
ZamoK Дата: Вторник, 02.12.2014, 15:04 | Сообщение № 18
Группа: Проверенные
Ранг: Обитатель
Сообщений: 268
Репутация: 4 ±
Замечаний: 0% ±

Excel 2003-2016
Я тут попробовал в действии сие волшебство и заметил одну неурядицу. Но это не код, а моя ошибка (...упс, не поная информация, а работа для меня новая): в листе Сбор есть столбец G в нем процент выполнения, и число которое слева от процента должно предварительно умножиться на него и уже затем суммироваться и попадать в "Выпуск". Можно ли добавить умножение?


Я не Гуру, но стремлюсь!
 
Ответить
СообщениеЯ тут попробовал в действии сие волшебство и заметил одну неурядицу. Но это не код, а моя ошибка (...упс, не поная информация, а работа для меня новая): в листе Сбор есть столбец G в нем процент выполнения, и число которое слева от процента должно предварительно умножиться на него и уже затем суммироваться и попадать в "Выпуск". Можно ли добавить умножение?

Автор - ZamoK
Дата добавления - 02.12.2014 в 15:04
doober Дата: Вторник, 02.12.2014, 16:18 | Сообщение № 19
Группа: Друзья
Ранг: Ветеран
Сообщений: 947
Репутация: 323 ±
Замечаний: 0% ±

Excel 2010
+ сортировка,на Шустов тянет hands
Правил в блокноте,не ругать сильно.




Сообщение отредактировал doober - Вторник, 02.12.2014, 16:19
 
Ответить
Сообщение+ сортировка,на Шустов тянет hands
Правил в блокноте,не ругать сильно.

Автор - doober
Дата добавления - 02.12.2014 в 16:18
ZamoK Дата: Вторник, 02.12.2014, 16:37 | Сообщение № 20
Группа: Проверенные
Ранг: Обитатель
Сообщений: 268
Репутация: 4 ±
Замечаний: 0% ±

Excel 2003-2016
Чёт ругает бубик софт
Код

Dim i As As long, j As As long


Я не Гуру, но стремлюсь!
 
Ответить
СообщениеЧёт ругает бубик софт
Код

Dim i As As long, j As As long

Автор - ZamoK
Дата добавления - 02.12.2014 в 16:37
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Собрать данные с суммой повторов (Макросы/Sub)
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

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