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

Вход

Регистрация

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

 

= Мир MS Excel/Поиск лидеров и вывод результата - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Поиск лидеров и вывод результата (Макросы/Sub)
Поиск лидеров и вывод результата
Awallon Дата: Четверг, 16.11.2017, 13:51 | Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 32
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Добрый день.
Извините, если уже было подобное - найти не могу, т.к. сложно пока сформулировать что именно искать.

Полный текст задачи такой:
На основании данных во вложенном файле нужно создать макрос.
Задача макроса выводить топ 5 продуктов отсортированных по доходности. Период для оценки рейтинга продуктов задается в ручную.
Например – задаем период с 1 по 15 Июля 2015 года, на выходе получаем список и показатели по 5 наиболее доходным продуктам.

Из этой задачи я хочу попросить помощи у вас в части формирования списка 5 доходных продуктов и суммой их показателей с выводом их на отдельный лист.

Возможные вопросы:
Считаем, что все данные показателей корректные и проверка для них не нужна.
Считаем, что данные всегда отсортировны по дате - от старых к новым и по наименованию от А до Я.
Считаем, что положение столбцов и их наименования не изменяются.
В файл-пример, чтобы он весил 100 Kb, не влез июль :)

Думаю, дальше я смогу сам ее доработать до нужной кондиции.
К сообщению приложен файл: Macro_top5.xls (97.0 Kb)
 
Ответить
СообщениеДобрый день.
Извините, если уже было подобное - найти не могу, т.к. сложно пока сформулировать что именно искать.

Полный текст задачи такой:
На основании данных во вложенном файле нужно создать макрос.
Задача макроса выводить топ 5 продуктов отсортированных по доходности. Период для оценки рейтинга продуктов задается в ручную.
Например – задаем период с 1 по 15 Июля 2015 года, на выходе получаем список и показатели по 5 наиболее доходным продуктам.

Из этой задачи я хочу попросить помощи у вас в части формирования списка 5 доходных продуктов и суммой их показателей с выводом их на отдельный лист.

Возможные вопросы:
Считаем, что все данные показателей корректные и проверка для них не нужна.
Считаем, что данные всегда отсортировны по дате - от старых к новым и по наименованию от А до Я.
Считаем, что положение столбцов и их наименования не изменяются.
В файл-пример, чтобы он весил 100 Kb, не влез июль :)

Думаю, дальше я смогу сам ее доработать до нужной кондиции.

Автор - Awallon
Дата добавления - 16.11.2017 в 13:51
_Boroda_ Дата: Четверг, 16.11.2017, 14:00 | Сообщение № 2
Группа: Модераторы
Ранг: Местный житель
Сообщений: 16672
Репутация: 6479 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
А что, сводная таблица не подходит?
К сообщению приложен файл: Macro_top5_1.xlsb (37.0 Kb)


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеА что, сводная таблица не подходит?

Автор - _Boroda_
Дата добавления - 16.11.2017 в 14:00
Awallon Дата: Четверг, 16.11.2017, 14:04 | Сообщение № 3
Группа: Пользователи
Ранг: Новичок
Сообщений: 32
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
_Boroda_, Подходит. Даже формулами можно решить, но нужен именно макрос.
 
Ответить
Сообщение_Boroda_, Подходит. Даже формулами можно решить, но нужен именно макрос.

Автор - Awallon
Дата добавления - 16.11.2017 в 14:04
InExSu Дата: Воскресенье, 19.11.2017, 01:40 | Сообщение № 4
Группа: Друзья
Ранг: Ветеран
Сообщений: 648
Репутация: 96 ±
Замечаний: 0% ±

Excel 2010, 365
нужен именно макрос

[vba]
Код
Sub ПереТоп_InExSu()
' примените нужный фильтр
    ActiveSheet.AutoFilter.Range.SpecialCells(xlCellTypeVisible).Copy
    Worksheets.Add
    ActiveSheet.Paste
    Z = [a1].CurrentRegion.Sort([h1], xlDescending, Header:=xlYes)
    [a1].CurrentRegion.RemoveDuplicates Columns:=5, Header:=xlYes
    Range(Rows("7:7"), Rows("7:7").End(xlDown)).Delete
End Sub
[/vba]


Разработчик Битрикс24 php, Google Apps Script, VBA Excel Windows/Mac
 
Ответить
Сообщение
нужен именно макрос

[vba]
Код
Sub ПереТоп_InExSu()
' примените нужный фильтр
    ActiveSheet.AutoFilter.Range.SpecialCells(xlCellTypeVisible).Copy
    Worksheets.Add
    ActiveSheet.Paste
    Z = [a1].CurrentRegion.Sort([h1], xlDescending, Header:=xlYes)
    [a1].CurrentRegion.RemoveDuplicates Columns:=5, Header:=xlYes
    Range(Rows("7:7"), Rows("7:7").End(xlDown)).Delete
End Sub
[/vba]

Автор - InExSu
Дата добавления - 19.11.2017 в 01:40
alex77755 Дата: Воскресенье, 19.11.2017, 12:52 | Сообщение № 5
Группа: Проверенные
Ранг: Обитатель
Сообщений: 362
Репутация: 64 ±
Замечаний: 0% ±

Цитата
примените нужный фильтр

Но так получится список каждого продукта только за 1 день!
Возможно ТС надо за весь указанные период?


Могу помочь в VB6, VBA
Alex77755@mail.ru
 
Ответить
Сообщение
Цитата
примените нужный фильтр

Но так получится список каждого продукта только за 1 день!
Возможно ТС надо за весь указанные период?

Автор - alex77755
Дата добавления - 19.11.2017 в 12:52
InExSu Дата: Воскресенье, 19.11.2017, 13:01 | Сообщение № 6
Группа: Друзья
Ранг: Ветеран
Сообщений: 648
Репутация: 96 ±
Замечаний: 0% ±

Excel 2010, 365
список каждого продукта только за 1 день!

нет


Разработчик Битрикс24 php, Google Apps Script, VBA Excel Windows/Mac
 
Ответить
Сообщение
список каждого продукта только за 1 день!

нет

Автор - InExSu
Дата добавления - 19.11.2017 в 13:01
alex77755 Дата: Воскресенье, 19.11.2017, 13:40 | Сообщение № 7
Группа: Проверенные
Ранг: Обитатель
Сообщений: 362
Репутация: 64 ±
Замечаний: 0% ±


очень вразумительный ответ!
Простите, что значит нет? не за один день? А за сколько ж? за весь период?
но сумма нигде не считается и выводится только максимальная за период.
Так продукта1 469544 было продано только 15 января.
За весь же период с 1 по 15 января было продано 5052642


Могу помочь в VB6, VBA
Alex77755@mail.ru
 
Ответить
Сообщение
очень вразумительный ответ!
Простите, что значит нет? не за один день? А за сколько ж? за весь период?
но сумма нигде не считается и выводится только максимальная за период.
Так продукта1 469544 было продано только 15 января.
За весь же период с 1 по 15 января было продано 5052642

Автор - alex77755
Дата добавления - 19.11.2017 в 13:40
InExSu Дата: Воскресенье, 19.11.2017, 14:26 | Сообщение № 8
Группа: Друзья
Ранг: Ветеран
Сообщений: 648
Репутация: 96 ±
Замечаний: 0% ±

Excel 2010, 365
alex77755,
Вы так сделали?
задаем период с 1 по 15 Июля 2015

Вы мой макрос запустили?
Пожалуйста, покажите, что у Вас получилось ...


Разработчик Битрикс24 php, Google Apps Script, VBA Excel Windows/Mac
 
Ответить
Сообщениеalex77755,
Вы так сделали?
задаем период с 1 по 15 Июля 2015

Вы мой макрос запустили?
Пожалуйста, покажите, что у Вас получилось ...

Автор - InExSu
Дата добавления - 19.11.2017 в 14:26
alex77755 Дата: Воскресенье, 19.11.2017, 14:45 | Сообщение № 9
Группа: Проверенные
Ранг: Обитатель
Сообщений: 362
Репутация: 64 ±
Замечаний: 0% ±

Год М Квартал Месяц День Наименование Количество, шт Выручка, руб Сумма закупки
2015 1 квартал Январь 15 Продукт 15 469544 1150917346 1149936965
2015 1 квартал Январь 3 Продукт 5 18216 137413166,3 106736639,8
2015 1 квартал Январь 3 Продукт 9 13763 36669294,13 28081444,85
2015 1 квартал Январь 2 Продукт 12 54501 33094949,28 13450637,84
2015 1 квартал Январь 5 Продукт 3 1791 8848021,97 6980245,677


Могу помочь в VB6, VBA
Alex77755@mail.ru
 
Ответить
СообщениеГод М Квартал Месяц День Наименование Количество, шт Выручка, руб Сумма закупки
2015 1 квартал Январь 15 Продукт 15 469544 1150917346 1149936965
2015 1 квартал Январь 3 Продукт 5 18216 137413166,3 106736639,8
2015 1 квартал Январь 3 Продукт 9 13763 36669294,13 28081444,85
2015 1 квартал Январь 2 Продукт 12 54501 33094949,28 13450637,84
2015 1 квартал Январь 5 Продукт 3 1791 8848021,97 6980245,677

Автор - alex77755
Дата добавления - 19.11.2017 в 14:45
InExSu Дата: Воскресенье, 19.11.2017, 15:17 | Сообщение № 10
Группа: Друзья
Ранг: Ветеран
Сообщений: 648
Репутация: 96 ±
Замечаний: 0% ±

Excel 2010, 365
alex77755,
Спасибо. Вы правы. Доделаю позже ...


Разработчик Битрикс24 php, Google Apps Script, VBA Excel Windows/Mac
 
Ответить
Сообщениеalex77755,
Спасибо. Вы правы. Доделаю позже ...

Автор - InExSu
Дата добавления - 19.11.2017 в 15:17
alex77755 Дата: Воскресенье, 19.11.2017, 15:27 | Сообщение № 11
Группа: Проверенные
Ранг: Обитатель
Сообщений: 362
Репутация: 64 ±
Замечаний: 0% ±

я сейчас доделываю на словаре. Доделаю - выложу


Могу помочь в VB6, VBA
Alex77755@mail.ru
 
Ответить
Сообщениея сейчас доделываю на словаре. Доделаю - выложу

Автор - alex77755
Дата добавления - 19.11.2017 в 15:27
alex77755 Дата: Воскресенье, 19.11.2017, 15:44 | Сообщение № 12
Группа: Проверенные
Ранг: Обитатель
Сообщений: 362
Репутация: 64 ±
Замечаний: 0% ±

ну как-то так:
только что суммировать не понял. Просуммировал выручку

[vba]
Код


Option Explicit

Sub ПереТоп2()
Dim per, n!, r!, k!, lr, m(), tek!, dt, pr, u, i, j, rz(), max, nm
per = InputBox("Укажите период в формате dd.mm.yyyy-dd.mm.yyyy", "Период", "01.01.2015-15.01.2015")
If InStr(1, per, "-") = 0 Then GoTo osh
per = Split(per, "-")
If Not IsDate(per(0)) Or Not IsDate(per(0)) Then GoTo osh
n = DateValue(per(0)): k = DateValue(per(1))
Dim sl: Set sl = CreateObject("Scripting.Dictionary")

With Лист1
    lr = .Cells(.Rows.Count, 1).End(xlUp).Row
    m = .Cells(1, 1).Resize(lr, 8).Value
    For r = 2 To UBound(m)
    dt = m(r, 4) & "." & get_n(m(r, 3)) & "." & m(r, 1)
    tek = DateValue(dt)
        If tek >= n Then
            If tek <= k Then
                sl(m(r, 5)) = sl(m(r, 5)) + m(r, 7)
            End If
        End If
    Next r
End With

ReDim rz(1 To 5, 1)
For i = 1 To 5
    u = sl.keys
    max = 0
    For r = 0 To UBound(u)
        If max < sl(u(r)) Then max = sl(u(r)): nm = u(r)
    Next r
    rz(i, 0) = nm
    rz(i, 1) = max
    sl.Remove (nm)
Next i
  Worksheets.Add
  [a1].Resize(5, 2) = rz
    Cells.Columns.AutoFit
Exit Sub

osh:
MsgBox "Не корректный период", vbCritical, ""

End Sub

Private Function get_n(s)
    Dim i
    For i = 1 To 12
        If LCase(MonthName(i)) = LCase(s) Then
            get_n = i
            Exit Function
        End If
    Next i
End Function

[/vba]
К сообщению приложен файл: Macro_top55.xlsb (29.6 Kb)


Могу помочь в VB6, VBA
Alex77755@mail.ru


Сообщение отредактировал alex77755 - Воскресенье, 19.11.2017, 15:47
 
Ответить
Сообщениену как-то так:
только что суммировать не понял. Просуммировал выручку

[vba]
Код


Option Explicit

Sub ПереТоп2()
Dim per, n!, r!, k!, lr, m(), tek!, dt, pr, u, i, j, rz(), max, nm
per = InputBox("Укажите период в формате dd.mm.yyyy-dd.mm.yyyy", "Период", "01.01.2015-15.01.2015")
If InStr(1, per, "-") = 0 Then GoTo osh
per = Split(per, "-")
If Not IsDate(per(0)) Or Not IsDate(per(0)) Then GoTo osh
n = DateValue(per(0)): k = DateValue(per(1))
Dim sl: Set sl = CreateObject("Scripting.Dictionary")

With Лист1
    lr = .Cells(.Rows.Count, 1).End(xlUp).Row
    m = .Cells(1, 1).Resize(lr, 8).Value
    For r = 2 To UBound(m)
    dt = m(r, 4) & "." & get_n(m(r, 3)) & "." & m(r, 1)
    tek = DateValue(dt)
        If tek >= n Then
            If tek <= k Then
                sl(m(r, 5)) = sl(m(r, 5)) + m(r, 7)
            End If
        End If
    Next r
End With

ReDim rz(1 To 5, 1)
For i = 1 To 5
    u = sl.keys
    max = 0
    For r = 0 To UBound(u)
        If max < sl(u(r)) Then max = sl(u(r)): nm = u(r)
    Next r
    rz(i, 0) = nm
    rz(i, 1) = max
    sl.Remove (nm)
Next i
  Worksheets.Add
  [a1].Resize(5, 2) = rz
    Cells.Columns.AutoFit
Exit Sub

osh:
MsgBox "Не корректный период", vbCritical, ""

End Sub

Private Function get_n(s)
    Dim i
    For i = 1 To 12
        If LCase(MonthName(i)) = LCase(s) Then
            get_n = i
            Exit Function
        End If
    Next i
End Function

[/vba]

Автор - alex77755
Дата добавления - 19.11.2017 в 15:44
InExSu Дата: Воскресенье, 19.11.2017, 16:50 | Сообщение № 13
Группа: Друзья
Ранг: Ветеран
Сообщений: 648
Репутация: 96 ±
Замечаний: 0% ±

Excel 2010, 365
Чуть улучшил свой код
[vba]
Код
Sub ПереТоп_InExSu()
' примените нужный фильтр
    ActiveSheet.AutoFilter.Range.SpecialCells(xlCellTypeVisible).Copy
    ' Worksheets.Add
    Workbooks.Add
    ActiveSheet.Paste
    Application.CutCopyMode = False
    With ActiveSheet
        .Range("i1") = "Доход"
        .Range("I2").FormulaR1C1 = "=RC[-2]-RC[-1]"
        .Range("j1") = "Сумма Дохода"
        .Range("J2").FormulaR1C1 = "=SUMIF(C[-5],RC[-5],C[-1])"
        .Range(.Cells(2, 9), .Cells(.UsedRange.Rows.Count, 10)).FillDown
        Application.CalculateFull
        .Range(Columns(9), Columns(10)).Copy
        .Range(Columns(9), Columns(10)).PasteSpecial _
                Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                    :=False, Transpose:=False
        Application.CutCopyMode = False
        .UsedRange.RemoveDuplicates Columns:=Array(5, 10), _
                    Header:=xlYes
        Z = [a1].CurrentRegion.Sort([j1], xlDescending, Header:=xlYes)
        Range(Rows("7:7"), Rows("7:7").End(xlDown)).Delete Shift:=xlUp
    End With
End Sub
[/vba]


Разработчик Битрикс24 php, Google Apps Script, VBA Excel Windows/Mac
 
Ответить
СообщениеЧуть улучшил свой код
[vba]
Код
Sub ПереТоп_InExSu()
' примените нужный фильтр
    ActiveSheet.AutoFilter.Range.SpecialCells(xlCellTypeVisible).Copy
    ' Worksheets.Add
    Workbooks.Add
    ActiveSheet.Paste
    Application.CutCopyMode = False
    With ActiveSheet
        .Range("i1") = "Доход"
        .Range("I2").FormulaR1C1 = "=RC[-2]-RC[-1]"
        .Range("j1") = "Сумма Дохода"
        .Range("J2").FormulaR1C1 = "=SUMIF(C[-5],RC[-5],C[-1])"
        .Range(.Cells(2, 9), .Cells(.UsedRange.Rows.Count, 10)).FillDown
        Application.CalculateFull
        .Range(Columns(9), Columns(10)).Copy
        .Range(Columns(9), Columns(10)).PasteSpecial _
                Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                    :=False, Transpose:=False
        Application.CutCopyMode = False
        .UsedRange.RemoveDuplicates Columns:=Array(5, 10), _
                    Header:=xlYes
        Z = [a1].CurrentRegion.Sort([j1], xlDescending, Header:=xlYes)
        Range(Rows("7:7"), Rows("7:7").End(xlDown)).Delete Shift:=xlUp
    End With
End Sub
[/vba]

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

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