Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 27.10.2017
Сообщений: 6
1
Excel

Оптимизация массива данных группировкой строк по нескольким критериям

27.10.2017, 16:09. Показов 2247. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток.
Прошу помощи в создании макроса для оптимизации массива данных в XL.
Суть логики:
1. Если "столбец А & столбец B & столбец C" (связка данных трех столбцов) встречается в массиве в первый раз, то...
2. Бери данные "столбец А, текущая строка" и вставляй в "другой лист" в последнюю заполненную строку столбца А.
3. Аналогично для столбца B и столбца С
4. Сумму по столбцу D (первого листа) по критерию связки "столбец А & столбец B & столбец C" всего массива вставляй в "другой лист" "текущая ячейка столбца D"

Решить задачу формулами прошу не предлагать, поскольку лист данных превышает 100 тыс строк и файл просто повесится))
Сам файл выслать не могу по причине коммерч. тайны (компания довольно известная), но могу накидать пример, если нужно будет.

Добавлено через 2 часа 7 минут
Нашел решение. Если кому нужно...
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
Sub Оптим()
qwerty = Timer
    Dim arrA() As String
    Dim arrB() As String
    Dim arrC() As Date
    Dim arrD() As Integer
    Dim arrABC() As String
    Dim arrUnic() As String
    Dim lrow As String
    Dim lrow2 As String
    Dim cnt As Integer
    Dim summa As Integer
 
Sheets("исход").Activate
    
lrow = Cells(Cells.Rows.Count, 1).End(xlUp).Row
 
    ReDim arrA(2 To lrow)
    ReDim arrB(2 To lrow)
    ReDim arrC(2 To lrow)
    ReDim arrD(2 To lrow)
    ReDim arrABC(2 To lrow)
    ReDim arrUnic(2 To lrow)
    
For a = 2 To lrow
    arrA(a) = Cells(a, 1)
Next a
For a = 2 To lrow
    arrB(a) = Cells(a, 2)
Next a
For a = 2 To lrow
    arrC(a) = Cells(a, 3)
Next a
For a = 2 To lrow
    arrD(a) = Cells(a, 4)
Next a
For a = 2 To lrow
    arrABC(a) = Cells(a, 1) & Cells(a, 2) & Cells(a, 3)
Next a
For a = 2 To lrow
    arrUnic(a) = Cells(a, 1) & Cells(a, 2) & Cells(a, 3)
Next a
 
For i = LBound(arrABC) To UBound(arrABC)
        For Z = LBound(arrUnic) To i
            If arrUnic(Z) = arrABC(i) Then
                cnt = cnt + 1
                If cnt > 1 Then
                    Exit For
                End If
            End If
        Next Z
    If cnt = 1 Then
        Sheets("оптим").Activate
lrow2 = Cells(Cells.Rows.Count, 1).End(xlUp).Row
        Cells(lrow2 + 1, 1) = arrA(i)
        Cells(lrow2 + 1, 2) = arrB(i)
        Cells(lrow2 + 1, 3) = arrC(i)
        
For q = LBound(arrABC) To UBound(arrABC)
    If arrABC(q) = arrABC(i) Then
        summa = arrD(q) + summa
    End If
Next q
        Cells(lrow2 + 1, 4) = summa
    End If
cnt = 0
summa = 0
Sheets("исход").Activate
Next i
        
MsgBox Timer - qwerty
End Sub
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.10.2017, 16:09
Ответы с готовыми решениями:

Оптимизация по нескольким критериям
Здравствуйте Помогите решить задачу по Оптимизации. В таблице стоят данные по операциям. В...

Поиск строк по нескольким критериям и запись на новый лист
Есть данный файл, в нём форма с помощью которой можно добавлять записи и находить их по заданному...

Фильтрация данных по нескольким критериям
Добрый день! Проблема фильтрации в форме по нескольким критериям одновременно. (БД выложил...

Формирование данных по нескольким выбранным критериям
Добрый день! помогите найти ошибку имеется форма с выбором дат и объекта. необходимо, чтобы при...

База данных. Поиск по нескольким критериям
Здравствуйте. Пишу на си базу данных(записная книжка). Не могу осуществить поиск по нескольким...

6
11509 / 3795 / 681
Регистрация: 13.02.2009
Сообщений: 11,202
27.10.2017, 16:52 2
Нашел решение
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
For a = 2 To lrow
    arrA(a) = Cells(a, 1)
Next a
For a = 2 To lrow
    arrB(a) = Cells(a, 2)
Next a
For a = 2 To lrow
    arrC(a) = Cells(a, 3)
Next a
For a = 2 To lrow
    arrD(a) = Cells(a, 4)
Next a
For a = 2 To lrow
    arrABC(a) = Cells(a, 1) & Cells(a, 2) & Cells(a, 3)
Next a
For a = 2 To lrow
    arrUnic(a) = Cells(a, 1) & Cells(a, 2) & Cells(a, 3)
Next a
За такое "решение" ... при
поскольку лист данных превышает 100 тыс строк
надо не только руки поодбивать...
смотрите работу с массивами в ексел. Как считать одной строкой в массив
Так же в этом случае пригодится словарь
Был бы пример файла что есть и что надо получить - набросал бы пример
1
0 / 0 / 0
Регистрация: 27.10.2017
Сообщений: 6
27.10.2017, 17:06  [ТС] 3
Пасиб))) Я только учусь!
Если можете предложить что-то более элегантное, буду благодарен
0
0 / 0 / 0
Регистрация: 27.10.2017
Сообщений: 6
27.10.2017, 17:16  [ТС] 4
я на этом файле отрабатывал
Вложения
Тип файла: xlsx Оптимизация группировкой без макроса.xlsx (10.9 Кб, 10 просмотров)
0
3218 / 967 / 223
Регистрация: 29.05.2010
Сообщений: 2,086
27.10.2017, 18:11 5
может подойдет сводной таблицей.
Вложения
Тип файла: xlsx Оптимизация группировкой без макроса.xlsx (16.1 Кб, 10 просмотров)
0
0 / 0 / 0
Регистрация: 27.10.2017
Сообщений: 6
27.10.2017, 23:46  [ТС] 6
Спасибо! Сводная таблица хороший и легкий вариант, но суть в том что это не конечный этап обработки данных. В дальнейшем массив нужно объединить с такими же массивами за прошлые периоды. Поэтому их нужно оптимизировать по размеру. Плюс ко всему, я хочу чтобы это тоже все делалось в едином макросе, без затрат времени на формирование сводной таблицы и ее ручной перегрузки в новый объеденный массив.
0
1590 / 663 / 225
Регистрация: 09.06.2011
Сообщений: 1,334
28.10.2017, 13:09 7
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Sub gggg()
  Dim row2Save&, cur&, s$, Dic As Object, Arr, i
  
  qwerty = Timer
  
    Set Dic = CreateObject("scripting.dictionary")
    Dic.comparemode = 1
    With Sheets("исход")
        Arr = .Range(.Cells(2, 1), .Cells(.Rows.Count, 4).End(xlUp)).Value
    End With
    
    For cur = 1 To UBound(Arr)
        s = Arr(cur, 1) & "|" & Arr(cur, 2) & "|" & Arr(cur, 3)
        If Dic.exists(s) Then
            i = Dic(s)
            Arr(i, 4) = Arr(i, 4) + Arr(cur, 4)
        Else
            row2Save = row2Save + 1
            If row2Save <> cur Then
                For i = 1 To 4
                    Arr(row2Save, i) = Arr(cur, i)
                Next
            End If
            Dic(s) = row2Save
        End If
    Next
    With Sheets("оптим")
        .UsedRange.Offset(1).Clear
        If row2Save Then .Cells(2, 1).Resize(row2Save, 4) = Arr
    End With
    
    MsgBox Timer - qwerty
    
    Set Dic = Nothing
End Sub
1
28.10.2017, 13:09
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.10.2017, 13:09
Помогаю со студенческими работами здесь

Перенос данных с одного листа на другой по нескольким критериям
Доброй время суток всем. Хотел бы поинтересоваться как можно с помощью формул перенести данные с...

Работа с Microsoft Query, Получение данных по нескольким критериям
Всем Здраствуйте! Это запрос MQ на поставщиков 1 уровня, теперь Я хочу вытащить из этого...

Как реализовать проверку введенных данных в Java по нескольким критериям?
Мне нужно сделать функцию, которая бы считывала переменную с консоли и производила проверку этой...

Оптимизация условий отбора данных с таблицы по разным критериям
Всем привет. Есть таблица-классификатор, в которой досконально расклассифицирован совершенно...

Как выполняется поиск данных в форме по критерию и как отфильтровать данные по нескольким критериям в OpenOffice.Calc?
Как выполняется поиск данных в форме по критерию и как отфильтровать данные по нескольким критериям...

LINQ-запрос для сведения массива в несколько строк с группировкой
Имеется таблица примерно следующего содержания: 1 Иван 2 Николай 3 Алексей 1 Василий 2...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru