Страницы: 1
RSS
Создание макроса
 
Всем доброго времени суток!!! Уважаемые форумчане, помогите написать макрос, чтобы данные из одного файла Excel переносились автоматически в другой. Проблема состоит в том, что файлов с данными может быть около 1000, они все имеют одинаковую форму заполнения, но называются каждый раз по разному
 
>>Уважаемые форумчане, помогите написать макрос  
Помогите или напишите?
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
Я делал бы на массивах - посчитал количество файлов, создал массив под размер, затем циклом открывал файлы (через GetObject) и забивал данные в массив.  
Потом определил последнюю строку в сводном файле и ниже выгрузил массив.  
Помог?
 
Бесплатно за вас такой макрос никто не сделает.  
Слишком много монотонной работы - прописывать соответствия полей одного файла столбцам другого.  
 
Если не готовы платить - ищите на форуме аналогичные макросы, и переделывайте их под себя.  
(предупреждаю - работы очень много, даже для меня, хотя я делал десятки подобных программ. Уж слишком много столбцов.)
 
Бесплатно только столько :)  
 
Option Explicit  
 
Sub tt()  
Dim FSO  
Dim TheFolder, TheFiles, AFile  
Dim i&, iLastrow&  
 
Application.ScreenUpdating = False  
 
Set FSO = CreateObject("Scripting.FileSystemObject")  
Set TheFolder = FSO.GetFolder("C:\Temp\Alex_89\files\")  
Set TheFiles = TheFolder.Files  
 
ReDim a(1 To TheFiles.Count, 1 To 65)  
 
For Each AFile In TheFiles  
With GetObject(AFile)  
i = i + 1  
'MsgBox .Sheets(1).[a3]
'набиваем массив  
a(i, 1) = i  
a(i, 2) = .Sheets(1).[a3]
a(i, 3) = .Sheets(1).[i4]
'и т.д.и т.п.  
a(i, 59) = .Sheets(1).[i46]
.Close 0  
End With  
Next  
'определяем последнню строку  
iLastrow = Range("A" & Rows.Count).End(xlUp).Row + 1  
Cells(iLastrow, 1).Resize(i, UBound(a, 2)) = a  
Application.ScreenUpdating = True  
End Sub
 
Можно чуть уплотнить/сократить:  
 
Sub ttt()  
Dim TheFiles, AFile  
Dim i&, iLastrow&  
 
Application.ScreenUpdating = False  
 
Set TheFiles = CreateObject("Scripting.FileSystemObject").GetFolder("C:\Temp\Alex_89\files\").Files  
 
ReDim a(1 To TheFiles.Count, 1 To 65)  
 
For Each AFile In TheFiles  
 
и т.д.
 
В массив быстрее набирать из массива:  
 
For Each AFile In TheFiles  
With GetObject(AFile)  
i = i + 1  
b = .Sheets(1).[a1:aa75].Value
'набиваем массив  
a(i, 1) = i  
a(i, 2) = b(3, 1)  
a(i, 3) = b(4, 9)  
'и т.д.и т.п.  
a(i, 59) = b(46, 9)  
.Close 0  
End With  
Next
 
Ещё добавлю - если счёт форм нужно продолжать, то последнюю строку определяем в начале, определяем последний номер формы, затем его прибавляем к i при занесении в массив:  
 
a(i, 1) = i + последний_номер_формы
 
http://www.excel-eto-prosto.ru/?s=fm_2095  
Рекомендую всем, кто хочет начать работать с макросами
Страницы: 1
Читают тему
Наверх