Страницы: 1
RSS
Суммирование результатов нескольких файлов
 
Уважаемые формучане, существует некая таблица данных (в приложении файл "Общий"), в которй должны суммироваться данные из нескольких подобных же файлов (01_01, 01_02 и т.д.) в соответсвующих же ячейках. Файлы 01_01, 01_02, 01_0n ежедневно приходят обновленные. Всё бы ничего, если бы их было немного, можно былобы просто поставить ссылки и сложить, если бы не:  
1. Таких (01_01, 01_02...) небыло-бы 136шт  
2. Колонок data1, data2, ..., data192  
 
Учитывая кол-во стран, необходимо обработать ~48тыс. ячеек, что достаточно продолжительно по времени. Уверен, что существует более простой способ подобной манипуляции, но я, к сожалению, пока об этом не знаю. Надеюсь на ваше содействие.
 
{quote}{login=NRbob}{date=28.06.2011 01:56}{thema=Суммирование результатов нескольких файлов}{post}Уважаемые формучане, существует некая таблица данных (в приложении файл "Общий"), в которй должны суммироваться данные из нескольких подобных же файлов (01_01, 01_02 и т.д.) в соответсвующих же ячейках. Файлы 01_01, 01_02, 01_0n ежедневно приходят обновленные. Всё бы ничего, если бы их было немного, можно былобы просто поставить ссылки и сложить, если бы не:  
1. Таких (01_01, 01_02...) небыло-бы 136шт  
2. Колонок data1, data2, ..., data192  
 
Учитывая кол-во стран, необходимо обработать ~48тыс. ячеек, что достаточно продолжительно по времени. Уверен, что существует более простой способ подобной манипуляции, но я, к сожалению, пока об этом не знаю. Надеюсь на ваше содействие.{/post}{/quote}  
 
Я бы сделал так:  
Собрал бы все листы в один файл, так как они имеют одинаковую структуру, а в итоговом листе прописал бы формулу в ячейках =СУММ('Лист1 (2):Лист1 (3)'!B2)  
 
Макрос сбора листов (не мой)  
Имеем кучу книг Excel, все листы из которых надо объединить в один файл. Открываем книгу, куда хотим внести данные из других файлов, входим в редактор Visual Basic (Alt+F11), добавляем новый пустой модуль (Insert - Module) и копируем туда текст вот такого макроса:  
     
Sub CombineWorkbooks()      
   Dim FilesToOpen      
   Dim x As Integer      
   On Error GoTo ErrHandler      
   Application.ScreenUpdating = False      
   FilesToOpen = Application.GetOpenFilename _      
                 (FileFilter:="Microsoft Excel Files (*.xlsx), *.xlsx", _      
                  MultiSelect:=True, Title:="Files to Merge")      
   If TypeName(FilesToOpen) = "Boolean" Then      
       MsgBox "Не выбрано ни одного файла!"      
       GoTo ExitHandler      
   End If      
   x = 1      
   While x <= UBound(FilesToOpen)      
       Workbooks.Open Filename:=FilesToOpen(x)      
       Sheets().Move After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)      
       x = x + 1      
   Wend      
ExitHandler:      
   Application.ScreenUpdating = True      
   Exit Sub      
ErrHandler:      
   MsgBox Err.Description      
   Resume ExitHandler      
End Sub      
 
После этого можно вернуться в Excel и запустить созданный макрос через меню Сервис - Макрос - Макросы (Tools - Macro - Macros). Отобразится диалоговое окно открытия файла, где необходимо указать один или несколько (удерживая Ctrl) файлов, листы из которых надо добавить к текущей книге.  
 
 
P.S. надеюсь гуру не будут сильно ругать за такое решение.
 
Смысл идеи понятен, но есть ограничения:  
1. В фалах 01_01 и т.д. могут быть и другие листы  
2. ~48тыс ячеек и в каждой прописана формула сложения 136 фалов... полагаю, что данный файл будет "весить" достаточно много.
 
{quote}{login=NRbob}{date=28.06.2011 01:56}{thema=Суммирование результатов нескольких файлов}{post}Уважаемые формучане, существует некая таблица данных (в приложении файл "Общий"), в которй должны суммироваться данные из нескольких подобных же файлов (01_01, 01_02 и т.д.) в соответсвующих же ячейках. Файлы 01_01, 01_02, 01_0n ежедневно приходят обновленные. Всё бы ничего, если бы их было немного, можно былобы просто поставить ссылки и сложить, если бы не:  
1. Таких (01_01, 01_02...) небыло-бы 136шт  
2. Колонок data1, data2, ..., data192  
 
Учитывая кол-во стран, необходимо обработать ~48тыс. ячеек, что достаточно продолжительно по времени. Уверен, что существует более простой способ подобной манипуляции, но я, к сожалению, пока об этом не знаю. Надеюсь на ваше содействие.{/post}{/quote}  
 
Хочу ещё добавить, что похожее решение нашел здесь http://www.planetaexcel.ru/forum.php/?thread_id=3878, но в этом варианте данные добавляются, а не суммируются.
 
{quote}{login=NRbob}{date=28.06.2011 02:46}{thema=Суммирование результатов нескольких файлов}{post}Смысл идеи понятен, но есть ограничения:  
1. В фалах 01_01 и т.д. могут быть и другие листы  
2. ~48тыс ячеек и в каждой прописана формула сложения 136 фалов... полагаю, что данный файл будет "весить" достаточно много.{/post}{/quote}  
 
1)Макрос собирает все листы которые есть в книге. То есть даже если есть пустые под названием Лист1, Лист2, Лист3.    
2)Когда собрали все листы и прописали формулу суммирования - выделяете ячейки с формулами, нажимаете копировать - вставить значения, удаляете собранные листы.
 
Вариант. Суммируем значения диапазона Лист1!B2:GK253 из всех файлов. Файлы д.б. в одной папке.
 
Ещё раз по полочкам...  
 
"Имеем кучу книг Excel, все листы из которых надо объединить в один файл"  
Получим в итоге файл с 1360 листами, на которых существуют другие данные, т.к. исходный 01_01 и т.д. состоит из 10 листов с разной информацией  
 
"Собрал бы все листы в один файл, так как они имеют одинаковую структуру, а в итоговом листе прописал бы формулу в ячейках =СУММ('Лист1 (2):Лист1 (3)'!B2)  
"  
В итоговом листе буде 252строки Х 192колонки = 48384ячейки и в каждой из них нужно будет прописать  =СУММ('Лист1 (2):Лист1 (3)'!B2)  
Полагаю, что получиться титанический труд, тем более, что 01_01-01_136 менятся ежедневно.    
Чисто теоритически представляю себе следующий алгоритм:  
1. За ID взять страну  
2. Далее, как предложено в http://www.planetaexcel.ru/forum.php/?thread_id=3878 брать по очереди все файлы (в независимости от названия), находящиеся в одной папке и...  
3. Перебирая по ID все ячейки по очереди суммировать с проставленным ранее значением  
Ну или где-то так.  
Только вот на практике у меня реализация хромает
 
{quote}{login=nilem}{date=28.06.2011 03:14}{thema=}{post}Вариант. Суммируем значения диапазона Лист1!B2:GK253 из всех файлов. Файлы д.б. в одной папке.{/post}{/quote}  
Этот вариант более понятен и прост, спасибо. Попробую "поколдовать" с исходными данными...
 
У Николая классный код получился. И простой.  
Удачный ход с использованием формулы, чтоб взять данные в массив, не открывая файл. Тем более что свободная ячейка есть :)  
Другой путь - можно было бы GetObject() использовать, тоже несложно, что-то вроде  
 
Application.ScreenUpdating = False  
With GetObject(ИмяФайла)  
ThisWorkbook.Sheets(1).[a1] = .Sheets(1).[a1]
.Close 0  
End With  
Application.ScreenUpdating = True
 
{quote}{login=Hugo}{date=28.06.2011 05:13}{thema=}{post}Удачный ход с использованием формулы, чтоб взять данные в массив, не открывая файл.{/post}{/quote}Можно еще и запросом сразу ко всем внешним книгам (с помощью ADO например).  
Но так, как у Николая, прощк и в обличие от запросов, можно считывать данные и смешанного типа. Кому интерсно, приём со считыванием внешних данных из формулы в массив мы с Deggasad-ом шлифовали здесь:  
http://www.sql.ru/forum/actualthread.aspx?bid=46&tid=803995&pg=-1
 
Коллеги, постепенно ситуация начала проясняться, и макрос от nilem (ещё раз спасибо ему за это) делает свое дело. Но при "обкатке" возникла следующа ситуация. При выполнении макроса, он берет данные из всех файлов, но именно с первого листа, а вот как заставить его брать информацию с другого листа, например, с 10-го... Я что-то встал в ступор.  
 
Примечание.    
Переименование (т.е. указание имени именно того листа) ничего не дает.
 
{quote}{login=NRbob}{date=29.06.2011 08:06}{thema=Re: Суммирование результатов нескольких файлов}{post}Коллеги, постепенно ситуация начала проясняться, и макрос от nilem (ещё раз спасибо ему за это) делает свое дело. Но при "обкатке" возникла следующа ситуация. При выполнении макроса, он берет данные из всех файлов, но именно с первого листа, а вот как заставить его брать информацию с другого листа, например, с 10-го... Я что-то встал в ступор.  
 
Примечание.    
Переименование (т.е. указание имени именно того листа) ничего не дает.{/post}{/quote}  
 
Оказывается был не прав, данные берутся именно с нужного листа.
 
{quote}{login=nilem}{date=28.06.2011 03:14}{thema=}{post}Вариант. Суммируем значения диапазона Лист1!B2:GK253 из всех файлов. Файлы д.б. в одной папке.{/post}{/quote}  
 
В принципе, всё работает...  
Только вот ещё один вопрос. Что если в одном из столбцов, например data3, стоит формула и значение из исходных файлов в этом столбце брать не надо, т.к. в итоговом "Общем" файле оно должно само посчитаться по формуле.
Страницы: 1
Читают тему
Наверх