Страницы: 1 2 3 След.
RSS
Создание группировки по указанным параметрам,написать МАКРОС
 
Привет, нужен макрос для автоматической группировки 5-ти параметров, в ручную выделять и щелкать "Группировка" unreal. У меня более 24 тыс строк. Пример прилагаю. Можа кто-нибудь сталкивался с таким вопросом? Помогите с макросом.  
Заранее благодарю.
 
Приведите полный пример группировки для одного региона, а то не совсем понятно.  
Кстати, по команде Данные - Группировка - Создать структуру, уже кое-что получается.
 
"по команде Данные - Группировка - Создать структуру" - получается, но не совсем то. Мне нужно чтоб сгруппировались сначала "кол-во", потом "товар", затем "магазин","продавец" и конечным "плюсом" должен стать регион. Регионов у меня много, продавцов тоже, магазинов тем более, товаров куча... Прилагаю пример одного региона (не всего конечно)...
 
В итоге должно получится примерно так...(прикрепила файл)... но только    
при раскрытии региона "Москва" выпадают также "магазин" , "товар" и "кол-во", а должно только "ПРОДАВЕЦ";  
при раскрытии "Иванов" должен выпадать только "магазин"....
 
Так требуется?
EXCEL
 
да, именно. как сделали?)
 
Да "ручками"-то это каждый может.  
А если бы у Thermik это было сделано макросом, то этот макрос, наверное, был бы в его примере...  
i need help, уточните, а в пустых ячейках столбцов категорий вам не мешают многократно повторяющиеся    
Москва  
Москва  
Москва  
или  
Шварцнегер  
Шварцнегер  
Шварцнегер  
Если нет, то это упрощает задачу (и, к стати, позволяет нормально фильтровать таблицу), хотя и ухудшает "читабельность".  
З.Ы. Меня порадовал объём упаковок сметаны - по 500 кг! :-)
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
ну не совсем ручками и не макросом но идея примерно такая  
1-ое заполняем вниз названиями групп по "опорному столбцу" там где кол-во  
 
 
       Dim j As Integer = Properties.ColumnNumber  
       If Column <> Properties.ColumnLast Then j = Column + 1  
 
       Dim _old As String = ""  
       Dim _new As String = ""  
 
       Try  
           With _WorkSheet  
 
               Do While i <= RowEndNumber  
                   _new = .Cells(i, Column).text  
 
                   If _new <> "" Then _old = _new  
                   If _new = "" AndAlso _old <> "" AndAlso .Cells(i, j).text <> "" Then  
                       .Cells(i, Column) = _old  
                   End If  
                   i += 1  
               Loop  
           End With  
 
       Catch ex As UnableToContinue  
       Catch ex As Exception  
       Finally  
       End Try  
 
и все это повторяем в цикле по столбцам начиная от D  к A  
 
Группировку потом уже делать элементарно
EXCEL
 
Мой файл, это сводная, который сохранен как значение,никаких повторяющихся ячеек нет.  
PS.   Alex_ST, сметанку любите?
 
Пробуйте, 2 кнопки
 
Казанский, СУПЕР!  
i need help, я бы на вашем месте излишкам сметанки с Казанским поделился :-)
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
в маленьком файле работает, класс!!! в моем рабочем, где более 24 тыс строк, висит уже мин 25(((. Так может? или может макрос не так скопировала?
 
согласна, Казанский молодец! с удовольствием поделилась бы сметанкой, но к сожалению, я не в сметанковой компании работаю)))
 
Только я бы чтобы не прихватывались лишние строки внизу ограничил диапазон:  
For Each c1 In Intersect(Columns(i).SpecialCells(xlCellTypeBlanks).Cells, ActiveSheet.UsedRange)
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Добавил отображение хода процесса в строке состояния. Посмотрите, где торможение происходит. А я пока размножу Ваши данные и попробую на них.  
 
Sub GroupMulti()  
Dim c1 As Range, c2 As Range, i As Integer  
Application.ScreenUpdating = False  
For i = 4 To 1 Step -1  
   Set c2 = Nothing  
   For Each c1 In Columns(i).SpecialCells(xlCellTypeBlanks).Cells  
   If Range(Cells(c1.Row, 1), c1).Text = "" Then  
   Application.StatusBar = "Построение списка, уровень: " & i & " строка: " & c1.Row  
       If c2 Is Nothing Then Set c2 = c1 Else Set c2 = Union(c2, c1)  
   End If  
   Next  
   For Each c1 In c2.Areas  
   Application.StatusBar = "Группировка, уровень: " & i & " строка: " & c1.Row  
       c1.Rows.Group  
   Next  
   ActiveSheet.Outline.ShowLevels RowLevels:=1  
Next  
Application.ScreenUpdating = True  
Application.StatusBar = False  
End Sub
 
i need help,  
судя по тому, что в вашей структуре уровни располагаются так:  
"регион-продавец-магазин-товар-количество", "продавец" - это вовсе не тот, кто продаёт товар в магазине, а тот, кто продаёт магазин в регионе ...  
:-)  
тогда понятно, почему сметана считается по пол-тонны... Это, наверное, целая цистерна?
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
сори, у меня названия столбцов начинаются с 4-ой строчки,как должен выглядеть макрос?  
и как кнопочки вывести на лист?))
 
Alex_ST, совершенно верно, продавец в данном случае менеджер региона,только он продает не "магазин в регионе", а товар, в приклепленном за ним магазине))))...  
вы проницательны ;)  
про сметану не наю, ни разу не видела 500 кг сметаны)))
 
М-да, попробовал на 25921 строках - тормозит жутко. Счас переделаю алгоритм, уже придумал как.
 
и поправьте плиз еще столбцы, у меня названия столбцов начинаются с 4-ой строчки)
 
А если сделать пропуск уже проверенных ячеек?  
игорь67  
 
Sub GroupMulti()  
Dim c1 As Range, c2 As Range, i As Integer  
Application.ScreenUpdating = False  
For i = 4 To 1 Step -1  
Set c2 = Nothing  
For Each c1 In ActiveSheet.UsedRange.Columns(i).SpecialCells(xlCellTypeBlanks).Cells  
If c1.RowHeight > 0 Then  
If Range(Cells(c1.Row, 1), c1).Text = "" Then  
Application.StatusBar = "Построение списка, уровень: " & i & " строка: " & c1.Row  
If c2 Is Nothing Then Set c2 = c1 Else Set c2 = Union(c2, c1)  
End If  
End If  
Next  
For Each c1 In c2.Areas  
Application.StatusBar = "Группировка, уровень: " & i & " строка: " & c1.Row  
c1.Rows.Group  
Next  
ActiveSheet.Outline.ShowLevels RowLevels:=1  
Next  
Application.ScreenUpdating = True  
Application.StatusBar = False  
End Sub
 
i need help,  
добавьте Range("1:4").RemoveSubtotal  
перед  
End Sub
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Да и конечно после отладки  
Application.StatusBar - убрать или закомментировать:)  
Игорь67  
Разница с пропуском скрытых строк на 330 строк данных - 0,13 против 0,18  
Для 300 строк уже много:)
 
Оптимизированный код, весь модуль.  
Время работы 3:55 на 25921 строках. Excel 2007, 2.8 ГГц  
 
Option Explicit  
Const SCND As Double = 1 / 24 / 3600  
 
Sub GroupMulti()  
Dim a As Range, c1 As Range, c2 As Range, i As Integer, t As Double, t0 As Date  
Application.ScreenUpdating = False  
t0 = Now  
t = t0  
For i = 4 To 1 Step -1  
   For Each a In Columns(i).SpecialCells(xlCellTypeBlanks).Areas  
       If Now - t > SCND Then  
           t = Now  
           Application.StatusBar = "Уровень: " & i & " строка: " & a.Row  
       End If  
       Set c2 = Nothing  
       For Each c1 In a.Cells  
           If Range(Cells(c1.Row, 1), c1).Text = "" Then  
               If c2 Is Nothing Then Set c2 = c1 Else Set c2 = Union(c2, c1)  
           End If  
       Next  
       If Not c2 Is Nothing Then c2.Rows.Group  
   Next  
   ActiveSheet.Outline.ShowLevels RowLevels:=1  
Next  
Application.ScreenUpdating = True  
Application.StatusBar = False  
MsgBox "Время работы " & Format(Now - t0, "hh:mm:ss")  
End Sub  
 
Sub RemoveGrouping()  
   Cells.RemoveSubtotal  
End Sub
 
группирует с 4-ой строки?))) или что подправить?
 
у меня 12,21 мин, и вижу что не с 4-ой строчки группирует.  
Казанский, напишите плиз, что подправить.  
 
PS. у меня столбцов больше, чем в примере, у меня месяца за три года собраны, поэтому может дольше по времени.
 
Я же Вам уже сказал, что нужно добавить...  
Но, конечно, если вы только Казанского хотите слушать, то предложения от других можете и не пробовать...
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
нет, ни в коем случае),я с удовольствием читаю и воспринимаю Ваши советы, просто я с макросами знакома 2 дня, и мне нужен весь сразу, я боюсь напортачить.    
+ хотелось бы добавить кнопки на лист...
 
Sub GroupMulti()   'http://www.planetaexcel.ru/forum.php?thread_id=19823  
  Dim iArea As Range, Cell1 As Range, Cell2 As Range, i%  
  Application.ScreenUpdating = False  
  For i = 4 To 1 Step -1  
     For Each iArea In Columns(i).SpecialCells(xlCellTypeBlanks).Areas  
        Set Cell2 = Nothing  
        For Each Cell1 In Intersect(iArea.Cells, ActiveSheet.UsedRange)  
           If Range(Cells(Cell1.Row, 1), Cell1).Text = "" Then  
              If Cell2 Is Nothing Then Set Cell2 = Cell1 Else Set Cell2 = Union(Cell2, Cell1)  
           End If  
        Next  
        If Not Cell2 Is Nothing Then Cell2.Rows.Group  
     Next  
     ActiveSheet.Outline.ShowLevels RowLevels:=1  
  Next  
  Application.ScreenUpdating = True  
  Range("1:4").RemoveSubtotal ' убрать лишнюю группировку со строк 1...4  
End Sub
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Кнопку - на лист:  
1. "Вид"-"Панели управления"-"Формы"  
2. На открывшейся панели тыкаете мышкой в элемент управления "Кнопка"  
3. Тыкаете мышкой на листе в том месте, где должна быть кнопка  
4. В открывшемся окошке "Назначить макрос объекту" тыкаете мышкой в тот макрос, который по кнопке должен вызываться.  
5. Окошко закроется, но пока кнопка ещё "выбрана" для редактирования, удобно сразу же изменить её надпись и размеры.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
Страницы: 1 2 3 След.
Читают тему
Наверх