Коллеги, добрый вечер. Очень нужна Ваша помощь. В большом файле находится информация, сколько каждый сотрудник продает товара за день, и какую получает оценку. Задача состоит в том, чтобы на лист 2 вывести информацию: напротив каждого сотрудника - сколько каждый сотрудник продал товара (в виде суммы товара) и какое количество оценок оценок он получил. Моих мозгов хватает только чтобы посчитать просто кол-во товара сколько продал сотрудник. Через формулу счет если считается оценка, но нюанс в том, что файл на выходе получается очень большой, и формула работает около часа, что очень долго( Помогите пожалуйста в решении данной задачи.
Коллеги, добрый вечер. Очень нужна Ваша помощь. В большом файле находится информация, сколько каждый сотрудник продает товара за день, и какую получает оценку. Задача состоит в том, чтобы на лист 2 вывести информацию: напротив каждого сотрудника - сколько каждый сотрудник продал товара (в виде суммы товара) и какое количество оценок оценок он получил. Моих мозгов хватает только чтобы посчитать просто кол-во товара сколько продал сотрудник. Через формулу счет если считается оценка, но нюанс в том, что файл на выходе получается очень большой, и формула работает около часа, что очень долго( Помогите пожалуйста в решении данной задачи.Vladimir32
К сожалению сводная не подходит, в дальнейшем таблица будет больше, и обновляется будет автоматически обновляется. Пытался делать с помощью массива, но он просто выводит по дате и ФИО просто данные с первого листа, как их посчитать мозгов не хватает. Думал добавить еще столбец с номером месяца, это тоже ничего не дало.
К сожалению сводная не подходит, в дальнейшем таблица будет больше, и обновляется будет автоматически обновляется. Пытался делать с помощью массива, но он просто выводит по дате и ФИО просто данные с первого листа, как их посчитать мозгов не хватает. Думал добавить еще столбец с номером месяца, это тоже ничего не дало.Vladimir32
Сводную всегда можно сделать по бОльшему диапазону (в примере сделано на все строки Excel) Запускать макрос Вы все равно будете вручную, для того у Вас там кнопка и висит, так ведь? Ну вот и повесим на эту кнопку макрос обновления сводной
А если у Вас данных много, то сводная таблица - наилучший по скорости вариант
Сводную всегда можно сделать по бОльшему диапазону (в примере сделано на все строки Excel) Запускать макрос Вы все равно будете вручную, для того у Вас там кнопка и висит, так ведь? Ну вот и повесим на эту кнопку макрос обновления сводной
А если у Вас данных много, то сводная таблица - наилучший по скорости вариант_Boroda_
Что касается скорости вы совершенно правы, сводная наилучший вариант. Там проблема в том, что таблица имеет определенный формат (своеобразная консолидации). Кнопку туда кинул, так как тестировал как их вытащить. Потом из этого файла будут по логин вытягиватся данные за месяц, на панель. Т.е. руководитель открывает панель, вводит ФИО сотрудника, и должны появится его показатели за 1 месяц. Из сводной ведь нельзя так вытащить данные?
Что касается скорости вы совершенно правы, сводная наилучший вариант. Там проблема в том, что таблица имеет определенный формат (своеобразная консолидации). Кнопку туда кинул, так как тестировал как их вытащить. Потом из этого файла будут по логин вытягиватся данные за месяц, на панель. Т.е. руководитель открывает панель, вводит ФИО сотрудника, и должны появится его показатели за 1 месяц. Из сводной ведь нельзя так вытащить данные?Vladimir32
Vladimir32, Проверил только по суммам, но вроде должно работать: [vba]
Код
Sub Commonate() Dim i&, j&, tmp As Variant Dim o As Object, key$, oDates As Object, dat$ Dim Names$(), k& Dim t(1 To 2) As Long Dim AllDates As Object, datas$(), k2& Dim tmpDat As Variant Set o = CreateObject("Scripting.dictionary") Set AllDates = CreateObject("Scripting.dictionary") For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row key = Cells(i, 1) dat = Format(Cells(i, 2), "MM.YYYY") If (Not o.exists(key)) Then k = k + 1 ReDim Preserve Names(1 To k) Names(k) = key Set oDates = CreateObject("Scripting.dictionary") If (Not oDates.exists(dat)) Then For j = 1 To 2 t(j) = Cells(i, 2 + j) Next j oDates.Add dat, t Else Set tmp = oDates(dat) For j = 1 To 2 tmp(j) = tmp(j) + Cells(i, 2 + j) Next j End If o.Add key, oDates Else Set tmpDat = o(key) If (Not tmpDat.exists(dat)) Then For j = 1 To 2 t(j) = Cells(i, 2 + j) Next j tmpDat.Add dat, t Else tmp = tmpDat(dat) For j = 1 To 2 tmp(j) = tmp(j) + Cells(i, 2 + j) Next j tmpDat(dat) = tmp End If Set o(key) = tmpDat End If If (Not AllDates.exists(dat)) Then k2 = k2 + 1 ReDim Preserve datas(1 To k2) datas(k2) = dat AllDates.Add dat, 1 End If Next i k = UBound(Names) With Worksheets(2) For i = 1 To UBound(datas) For j = 1 To k k2 = i + (k - 1) * (i - 1) + j .Cells(k2, 1) = Names(j) If AllDates.exists(datas(i)) Then .Cells(k2, 2) = MonthName(Month(datas(i))) & " " & Year(datas(i)) Set tmp = o(Names(j)) .Cells(k2, 3) = tmp(datas(i))(1) .Cells(k2, 4) = tmp(datas(i))(2) Else .Cells(k2, 2) = MonthName(Month(datas(i))) & " " & Year(datas(i)) .Cells(k2, 3) = 0 .Cells(k2, 4) = 0 End If Next j Next i End With End Sub
[/vba]
Vladimir32, Проверил только по суммам, но вроде должно работать: [vba]
Код
Sub Commonate() Dim i&, j&, tmp As Variant Dim o As Object, key$, oDates As Object, dat$ Dim Names$(), k& Dim t(1 To 2) As Long Dim AllDates As Object, datas$(), k2& Dim tmpDat As Variant Set o = CreateObject("Scripting.dictionary") Set AllDates = CreateObject("Scripting.dictionary") For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row key = Cells(i, 1) dat = Format(Cells(i, 2), "MM.YYYY") If (Not o.exists(key)) Then k = k + 1 ReDim Preserve Names(1 To k) Names(k) = key Set oDates = CreateObject("Scripting.dictionary") If (Not oDates.exists(dat)) Then For j = 1 To 2 t(j) = Cells(i, 2 + j) Next j oDates.Add dat, t Else Set tmp = oDates(dat) For j = 1 To 2 tmp(j) = tmp(j) + Cells(i, 2 + j) Next j End If o.Add key, oDates Else Set tmpDat = o(key) If (Not tmpDat.exists(dat)) Then For j = 1 To 2 t(j) = Cells(i, 2 + j) Next j tmpDat.Add dat, t Else tmp = tmpDat(dat) For j = 1 To 2 tmp(j) = tmp(j) + Cells(i, 2 + j) Next j tmpDat(dat) = tmp End If Set o(key) = tmpDat End If If (Not AllDates.exists(dat)) Then k2 = k2 + 1 ReDim Preserve datas(1 To k2) datas(k2) = dat AllDates.Add dat, 1 End If Next i k = UBound(Names) With Worksheets(2) For i = 1 To UBound(datas) For j = 1 To k k2 = i + (k - 1) * (i - 1) + j .Cells(k2, 1) = Names(j) If AllDates.exists(datas(i)) Then .Cells(k2, 2) = MonthName(Month(datas(i))) & " " & Year(datas(i)) Set tmp = o(Names(j)) .Cells(k2, 3) = tmp(datas(i))(1) .Cells(k2, 4) = tmp(datas(i))(2) Else .Cells(k2, 2) = MonthName(Month(datas(i))) & " " & Year(datas(i)) .Cells(k2, 3) = 0 .Cells(k2, 4) = 0 End If Next j Next i End With End Sub
Файл пока не могу приложить, с рабочего компьютера нельзя файлы прикладывать, в столбце оценка есть стоят оценки от 1 до 5, и нужно посчитать количество оценок, а не сумму.
Файл пока не могу приложить, с рабочего компьютера нельзя файлы прикладывать, в столбце оценка есть стоят оценки от 1 до 5, и нужно посчитать количество оценок, а не сумму.Vladimir32
Sub Commonate() Dim i&, j&, tmp As Variant Dim o As Object, key$, oDates As Object, dat$ Dim Names$(), k& Dim t(1 To 2) As Long Dim AllDates As Object, datas$(), k2& Dim tmpDat As Variant Set o = CreateObject("Scripting.dictionary") Set AllDates = CreateObject("Scripting.dictionary") For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row key = Cells(i, 1) dat = Format(Cells(i, 2), "MM.YYYY") If (Not o.exists(key)) Then k = k + 1 ReDim Preserve Names(1 To k) Names(k) = key Set oDates = CreateObject("Scripting.dictionary") If (Not oDates.exists(dat)) Then t(1) = Cells(i, 3) t(2) = 1 oDates.Add dat, t Else Set tmp = oDates(dat) tmp(1) = tmp(1) + Cells(i, 3) tmp(2) = tmp(2) + 1 End If o.Add key, oDates Else Set tmpDat = o(key) If (Not tmpDat.exists(dat)) Then t(1) = Cells(i, 3) t(2) = 1 tmpDat.Add dat, t Else tmp = tmpDat(dat)
tmp(1) = tmp(1) + Cells(i, 3) tmp(2) = tmp(2) + 1 tmpDat(dat) = tmp End If Set o(key) = tmpDat End If If (Not AllDates.exists(dat)) Then k2 = k2 + 1 ReDim Preserve datas(1 To k2) datas(k2) = dat AllDates.Add dat, 1 End If Next i k = UBound(Names) With Worksheets(2) For i = 1 To UBound(datas) For j = 1 To k k2 = i + (k - 1) * (i - 1) + j .Cells(k2, 1) = Names(j) If AllDates.exists(datas(i)) Then .Cells(k2, 2) = MonthName(Month(datas(i))) & " " & Year(datas(i)) Set tmp = o(Names(j)) .Cells(k2, 3) = tmp(datas(i))(1) .Cells(k2, 4) = tmp(datas(i))(2) Else .Cells(k2, 2) = MonthName(Month(datas(i))) & " " & Year(datas(i)) .Cells(k2, 3) = 0 .Cells(k2, 4) = 0 End If Next j Next i End With End Sub
[/vba]
Vladimir32, поидее так должно работать: [vba]
Код
Sub Commonate() Dim i&, j&, tmp As Variant Dim o As Object, key$, oDates As Object, dat$ Dim Names$(), k& Dim t(1 To 2) As Long Dim AllDates As Object, datas$(), k2& Dim tmpDat As Variant Set o = CreateObject("Scripting.dictionary") Set AllDates = CreateObject("Scripting.dictionary") For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row key = Cells(i, 1) dat = Format(Cells(i, 2), "MM.YYYY") If (Not o.exists(key)) Then k = k + 1 ReDim Preserve Names(1 To k) Names(k) = key Set oDates = CreateObject("Scripting.dictionary") If (Not oDates.exists(dat)) Then t(1) = Cells(i, 3) t(2) = 1 oDates.Add dat, t Else Set tmp = oDates(dat) tmp(1) = tmp(1) + Cells(i, 3) tmp(2) = tmp(2) + 1 End If o.Add key, oDates Else Set tmpDat = o(key) If (Not tmpDat.exists(dat)) Then t(1) = Cells(i, 3) t(2) = 1 tmpDat.Add dat, t Else tmp = tmpDat(dat)
tmp(1) = tmp(1) + Cells(i, 3) tmp(2) = tmp(2) + 1 tmpDat(dat) = tmp End If Set o(key) = tmpDat End If If (Not AllDates.exists(dat)) Then k2 = k2 + 1 ReDim Preserve datas(1 To k2) datas(k2) = dat AllDates.Add dat, 1 End If Next i k = UBound(Names) With Worksheets(2) For i = 1 To UBound(datas) For j = 1 To k k2 = i + (k - 1) * (i - 1) + j .Cells(k2, 1) = Names(j) If AllDates.exists(datas(i)) Then .Cells(k2, 2) = MonthName(Month(datas(i))) & " " & Year(datas(i)) Set tmp = o(Names(j)) .Cells(k2, 3) = tmp(datas(i))(1) .Cells(k2, 4) = tmp(datas(i))(2) Else .Cells(k2, 2) = MonthName(Month(datas(i))) & " " & Year(datas(i)) .Cells(k2, 3) = 0 .Cells(k2, 4) = 0 End If Next j Next i End With End Sub