Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.03.2014, 02:07   #1
maso89
Новичок
Джуниор
 
Регистрация: 07.03.2014
Сообщений: 1
По умолчанию Свод из нескольких таблиц в одну

Здравствуйте,форумчане!
Столкнулся с такой проблемой: Есть несколько листов. Каждый лист это вид работ. В таблице представлены данные в виде адресов домов, площади, итд. Все листы имеют одинаковые столбцы.
Необходимо свести всё в одну сводную таблицу.
Каждому из листов соответствует название столбца сводной таблицы.
Адресов в каждой таблице может быть около тысячи. При этом они могут повторяться, а могут и нет. Если значение уникально добавляется новая строчка с адресом, если уже ранее строка встречалась в сводной таблице, то алгоритм ищет в каком листе встретился адрес и вписывает в одноименный столбец. Как-то так. Тяжело объяснить, может пример поможет. Заранее спасибо. Данные просто туча, вручную сводить нереал.
Вложения
Тип файла: rar пример.rar (84.5 Кб, 16 просмотров)
maso89 вне форума Ответить с цитированием
Старый 07.03.2014, 11:52   #2
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

требуется переделать данные (сводная не поймет обьединенных ячеек) - тогда возможно , а в таком виде - только макросами.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 07.03.2014, 12:41   #3
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Я думаю быстро будет макросом циклом по листам/данным собрать словарь с коллекциями - ключ собираем из "координат" дома, а в item коллекцию название листа & "|" & Период капитального ремонта.
Параллельно собираем коллекцию названий листов. Или лучше словарь, чтоб сразу иметь индекс названия на будущее.
Далее создать массив по размеру словаря и этой коллекции, заполнить шапку названиями листов (вернее два параллельных массива - один для домов, второй с этой шапкой для ремонтов), циклом по словарю (и его коллекциям) и шапке заполняем массивы собранными данными.
Выгрузка результата.

Писать сравнительно много, тщательно, некогда... Если не будет других вариантов - за небесплатно в порядке живой очереди можно подумать...
Ну или реализуйте сами - вроде расписал подробно.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 07.03.2014, 13:47   #4
maksim_serg
Форумчанин
 
Аватар для maksim_serg
 
Регистрация: 25.03.2010
Сообщений: 417
По умолчанию

если это нужно один раз в жизни, то проще руками. создать на каждом листе доп столбец, что вроде "=сцепить(А1;Б1;В1...)". все это скопировать на сводный лист, удалить дубликаты стандартной функцией, а дальше через ВПР. Часто сам так делаю
maksim_serg вне форума Ответить с цитированием
Старый 07.03.2014, 13:55   #5
Step_UA
Форумчанин
 
Аватар для Step_UA
 
Регистрация: 09.06.2011
Сообщений: 388
По умолчанию

не так уж и много писать
Код:
Sub Собрать()
  Dim Dic As Object, i&, j&, Row&, cRow&, cCol&, tmp, s$
    Set Dic = CreateObject("Scripting.Dictionary")
    Dic.comparemode = 1
    cCol = Sheets.Count + 10
    ReDim mas(1 To 999, 1 To cCol)
    For i = 12 To cCol
        With Sheets(i - 11)
            tmp = .Range(.Cells.Find("Муниципальный район/городской округ").Offset(1), .Cells(Rows.Count, 12).End(xlUp)).Value
        End With
        For Row = 1 To UBound(tmp)
            s = tmp(Row, 1) & "|" & tmp(Row, 2) & "|" & tmp(Row, 3) & "|" & tmp(Row, 4) & "|" & _
                    tmp(Row, 5) & "|" & tmp(Row, 6) & "|" & tmp(Row, 7) & "|" & tmp(Row, 8)
            If Dic.exists(s) = False Then
                cRow = cRow + 1
                If cRow Mod 1000 = 0 Then ReDim Preserve mas(1 To cRow + 999, 1 To cCol)
                Dic(s) = cRow
                mas(cRow, 1) = cRow
                For j = 2 To 11: mas(cRow, j) = tmp(Row, j - 1): Next
            End If
            mas(Dic(s), i) = tmp(Row, 11)
        Next
    Next
    With Sheets(Sheets.Count).Cells(7, 1).Resize(cRow, cCol)
        .Value = mas
        .Borders.LineStyle = 1
    End With
End Sub
на неконкретные вопросы даю неконкретные ответы ...
Step_UA вне форума Ответить с цитированием
Старый 07.03.2014, 14:41   #6
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Ну а разве мало написано?
Я предлагал чуть иначе, чтоб не привязываться к названиям/расположению листов и шапки - брать все встретившиеся названия и создать из них шапку, соотв. и расположение данных будет этому соответствовать.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 07.03.2014, 14:46   #7
Step_UA
Форумчанин
 
Аватар для Step_UA
 
Регистрация: 09.06.2011
Сообщений: 388
По умолчанию

Hugo121, скорее всего ТС необходимо это выполнить разово, поэтому не заморачивался ... да и подписи в таблице не совпадают с наименованиями листов
на неконкретные вопросы даю неконкретные ответы ...
Step_UA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Копирование определенных данных из нескольких таблиц в одну ekunevich Microsoft Office Excel 3 31.08.2012 10:05
Объединение нескольких таблиц в одну книгу Gregory_Colbert Microsoft Office Excel 6 14.09.2010 10:24
Объединение нескольких таблиц в одну (по определенному параметру) iona БД в Delphi 13 18.06.2009 19:34
Свод нескольких файлов Excel в один Стасон Microsoft Office Excel 2 24.02.2009 11:13
Сведение нескольких таблиц в одну Sega Microsoft Office Excel 3 05.08.2008 15:21