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

Макрос по сбору данных с дублями и поиск уникальных значений с подстановкой на новый лист

02.02.2022, 20:13. Показов 1038. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.
Очень нужна ваша помощь, выгрузка делается ежедневно с нарастающим итогом, за месяц примерно до 300 тыс. строк.
В файле на листе "Выгрузка из Базы" данные которые выгружаются по строкам при этом информация дублируется в столбцах.
По одной оценке может быть выгружено разное кол-во строк, уникальное значение отображается в столбце "ID оценка", необходимо, что бы на листе "Сборка" информация преобразовывалась в одну строку, пример строки на листе "Сборка" оценка 15.
В файле выделил зеленым цветом ячейки которые необходимо перенести на лист "Сборка", красным которые не нужны. Т.е. логика такая, столбец "Имя подблока" - "Q" должен быть добавлен в заголовок как уникальные значения, но с возможностью добавления исключений, например по критерию "Имя блока" - пример критерий "Справочник", по нему мне не нужна информация, так как наименования "Имя подблока" одинаковые с другими критериями другого блока, так как возможно в дальнейшем будут добавлены еще ненужные блоки столбца N. Второй нюанс - это если в столбце "W" стоит критерий "true" то необходимо забирать информацию не со столбца "S", а со столбца "V". На листе сборка оценка 15 как пример как должен выглядеть итог. Если объяснил непонятно могу еще более подробно описать, что нужно.
Буду рад любой помощи и советам, так как просмотрел уже много информации изучаю материалы по VBA, но с этим я еще не могу разобраться и понять как это сделать.
Вложения
Тип файла: xlsx Пример 2.xlsx (16.8 Кб, 6 просмотров)
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.02.2022, 20:13
Ответы с готовыми решениями:

Подправьте макрос отбор уникальных значений с копией на новый лист
Всем доброго времени. Ничего умнее не придумал как отсортировать данные точнее отфильтровать, и скопировать с сохранением минимальных...

Поиск уникальных значений в динамическом массиве с переносом их другой лист
Добрый день ГУРУ. Есть задачка, всю голову сломал. Без ВАС ни как не обойтись Есть лист "Плейлист" куда будут копироваться...

Поиск уникальных значений по диапазону, суммирование количества и добавление суммы на сводный лист
Доброго времени, Есть количество уникальных значений на Листе1 , нужно найти эти значения на Листе2, посчитать общее количество и...

5
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
02.02.2022, 21:00
Добрый день.
Думаю такое можно на PQ сделать (если подходит), но я по нему не специализируюсь...
Я думаю можно сделать на паре словарей (или даже на одном, но на паре будет быстрее).
В выгрузке по одной "ID оценка" всегда все нужные серые столбцы одинаковы? Т.е. можно в словаре для оценки 15 запоминать только первую встреченную строку?
И что там с весом блока, почему зелёный, но не взят?

Добавлено через 3 минуты
Ну и проще писать код если шапка на сводном листе перед началом работы уже написана.

Добавлено через 5 минут
И нужно бы разобраться с
Длтельность контакта
Оно так и будет, или вдруг неожиданно в базе поправят?

Добавлено через 2 минуты
И что там с жёлтыми комментариями?
0
0 / 0 / 0
Регистрация: 17.01.2022
Сообщений: 6
02.02.2022, 23:30  [ТС]
К сожалению на PQ нет возможности сделать, так как все процессы выстроены с Excel и дальше из этого файла будет разноситься информация в другие эксели.
1)Да по одной оценке все нужные серые столбцы одинаковые (дублируются), да можно взять первую строку для каждой оценки.
2)Насчет "Вес блока" да они тоже нужны, но я не знаю даже как их можно построить чтоб они так же выстроились в заголовок каждый отдельно по имени блока со своим весом.
3)В том то и проблема что шапка может меняться если будут вноситься корректировки в шаблон, поэтому думал что можно прописать уникальность критериев "Имя подблока" и после этого перенести их после серых основных столбцов на листе "Сборка", а после уже настроить уникальность связывая "ID оценка" + "Имя подблока" и подставлять по ним соответствующие им критерии. Но так как я еще не силен в макросах, поэтому не знаю как лучше сделать.
4)Длительность контакта имеете ввиду в таком формате? Если про опечатку прошу прошения корректно "Длительность контакта", но наименования блоков, подблоков и критериев, меняются, поэтому не хотел бы привязываться к этому.
5) По желтым комментария "Комментарий к блоку" "Комментарий к подблоку" эти комментарии должны вноситься так же в заголовок на лист "Сборка". А этот как и писал "Комментарий к критерию" если в столбце "W" стоит критерий "true", то необходимо забирать информацию не со столбца "S", а со столбца "V".

Приложил еще раз файл, действительно вы правы веса так же нужны подтягивать к оценке, дополнил на листе "Сборка" заголовки в конце, их не обязательно так называть можно по любому главное, чтобы данные подтягивались корректно к оценке.
Вложения
Тип файла: xlsx Пример 2.xlsx (16.9 Кб, 15 просмотров)
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
03.02.2022, 13:01
Лучший ответ Сообщение было отмечено Artik54rus как решение

Решение

Практически готово.
Вывод в новую книгу.
Если нужно, то нужно доработать:
1. формат столбца "Длительность контакта" -> время. Но это отдельная проблема - как его выявить, если вдруг изменится его название... запоминать формат всех полей исходника? Проще вручную поменять в результате.
2. сортировку столбцов. Тоже гемор, слёту не придумал простого хода.

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
Option Explicit
 
Sub tt()
Dim a, i&, ii&, d1 As Object, d2 As Object, d3 As Object, dEx As Object, out, t$
Dim r As Range, shap As Range, Имя_подблока, k, kk
 
    Set d1 = CreateObject("Scripting.Dictionary") 'ID оценка
    Set d2 = CreateObject("Scripting.Dictionary") 'ID оценка+Имя подблока
    Set d3 = CreateObject("Scripting.Dictionary") 'Имя подблока
    
    Set dEx = CreateObject("Scripting.Dictionary") 'исключения
    dEx.Item("Справочник") = 0& 'можно загрузить список исключений любым смпособом
    
    Set r = Sheets("Выгрузка из Базы").Range("A1").CurrentRegion
    Set shap = r.Rows(1).Resize(, 12)
    
    a = r.Value
    For i = 2 To UBound(a)
        If Not dEx.exists(a(i, 14)) Then
        d3.Item(a(i, 17)) = 0& 'Имя подблока
            If Not d1.exists(a(i, 1)) Then d1.Item(a(i, 1)) = r.Rows(i).Cells(3).Resize(, 10)
            t = a(i, 1) & "|" & a(i, 17)
            If (a(i, 23)) = "true" Then d2.Item(t) = a(i, 22) Else d2.Item(t) = a(i, 19)
            t = a(i, 1) & "|" & a(1, 20)
            If Len(a(i, 20)) Then d2.Item(t) = a(i, 20)
            t = a(i, 1) & "|" & a(1, 21)
            If Len(a(i, 21)) Then d2.Item(t) = a(i, 21)
            t = a(i, 1) & "|" & a(1, 15) & "+" & a(i, 14)
            d2.Item(t) = a(i, 15)
            d3.Item(a(1, 15) & "+" & a(i, 14)) = 0&
        End If
    Next
    d3.Item(a(1, 20)) = 0&
    d3.Item(a(1, 21)) = 0&
 
    Application.ScreenUpdating = False
    
    With Workbooks.Add.Sheets(1)
    shap.Copy .Cells(1)
    Имя_подблока = d3.keys
    .Cells(13).Resize(, UBound(Имя_подблока) + 1) = Имя_подблока
        i = 1
        For Each k In d1.keys
        i = i + 1
        .Cells(i, 1) = k
        .Cells(i, 3).Resize(, 10) = d1.Item(k)
            For ii = 0 To UBound(Имя_подблока)
            .Cells(i, ii + 13) = d2.Item(k & "|" & Имя_подблока(ii))
            Next
        Next
        .Cells.EntireColumn.AutoFit
    End With
    
    Application.ScreenUpdating = True
End Sub
2
0 / 0 / 0
Регистрация: 17.01.2022
Сообщений: 6
03.02.2022, 14:18  [ТС]
Попробовал на пилотном файле все работает отлично, завтра на оригинальном буду тестировать, спасибише огромное. Это реально так круто смотрится.
По поводу сортировки попробую написать, но самое главное, что этот работает отлично.
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
03.02.2022, 14:44
По сортировке - после строки
Visual Basic
1
Имя_подблока = d3.keys
нужно этот массив перед выгрузкой на лист отсортировать, чтоб все веса+ были в конце.
Сейчас эти данные выгружаются на лист в порядке поступления в словарь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.02.2022, 14:44
Помогаю со студенческими работами здесь

Макрос по подсчету и переносу данных на новый лист
Здравствуйте. Прошу помощи в написании макроса. В книге на листе 1 есть таблица с данными, столбцы по датам (каждый понедельник...

Макрос, который будет копировать лист с содержимым на новый лист
Помогите, пожалуйста, написать макрос, который будет копировать лист с содержимым на следующий созданный лист из предыдущего листа. Нужно...

Поиск и копирование данных в новый лист
С праздничком! Хотелось бы продолжить тему "выберем и скопируем без фильтра". Надеюсь, что команду копирования напишу сам. А вот...

Макрос по сбору данных с источника
Добрый день, уважаемые знатоки!!! Очень нужна ваша помощь в написании макроса. Условие: Существуют три одинаковые по структуре, но...

Поправить макрос по сбору данных с листов и упорядочивание по формату
Доброго времени суток! Есть общий документ (Реестр счетов в данном случае). На каждом листе документа вносит свою информацию сотрудник....


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru