powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Помогите с объединением файлов
25 сообщений из 47, страница 1 из 2
Помогите с объединением файлов
    #36844574
yurechkodp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть такая проблема:

4 подразделения заполняют лист в книге назовем его "Заявка" форма для всех одинаковая и сдают помесячно. Получается что есть 4 папки по 12 файлов.

Также существует итоговая книга (один лист лишь с заголовком из одной строки)

Как создать макрос чтобы данные из выбранных книг только с листа "Заявка" копировались в мастер-книгу на лист "Заявка" друг за другом без шапки...

Форум листаю уже несколько дней, но ни один пример полностью не подходит, обычно получалось, что при вставке из другой книги предыдущие данные в итоговой затирались.
...
Рейтинг: 0 / 0
Помогите с объединением файлов
    #36844763
PlanB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Помогите с объединением файлов
    #36844785
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или здесь
...
Рейтинг: 0 / 0
Помогите с объединением файлов
    #36844791
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А еще здесь
...
Рейтинг: 0 / 0
Помогите с объединением файлов
    #36844935
yurechkodp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пока ждал ответа написал сам! ))) на днях выложу код.
Возник только один вопрос к вам знатоки - а позволяет ли Эксель (VBA)просканировать определенную папку, составить список имеющихся файлов и потом поименно их открывать? А то просто накладно руками вбивать 48 имен файлов.
...
Рейтинг: 0 / 0
Помогите с объединением файлов
    #36844995
yurechkodp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Возникла еще проблема - количество строк в сумме превышает 80000 и происходит overflow, следовательно надо файл xlsx, но даже при сохранении результата в него происходит тоже самое. Файл с макросом сохранен в формате xlsm. может кто сталкивался с такой проблемой и знает ее решение?
...
Рейтинг: 0 / 0
Помогите с объединением файлов
    #36845019
PlanB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а воспользоваться поиском - задача безгранично сложная? или топикстартер уверен, что перед ним единственным обстоятельства ставят какие-то сверхсложные задачи?

на второй вопрос: кофейная гуща и мой хрустальный шар подсказывают, что надо бы использовать другие типы переменных. а для начала - просто приписать до процедуры Option Explicit
...
Рейтинг: 0 / 0
Помогите с объединением файлов
    #36845022
PlanB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на 1 вопрос ответ "да, позволяет"
...
Рейтинг: 0 / 0
Помогите с объединением файлов
    #36845042
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yurechkodpВозникла еще проблема - количество строк в сумме превышает 80000 и происходит overflow, следовательно надо файл xlsx, но даже при сохранении результата в него происходит тоже самое. Файл с макросом сохранен в формате xlsm. может кто сталкивался с такой проблемой и знает ее решение?Надо закрыть все файлы с расширением xls. Если Вы копируете данные из файлов в режиме совместимости, то накладываются все ограничения старой версии Excel, к которой несомненно относится кол-во строк не более 65536. Если бы Вы внимательно прочитали все возможности команды надстройки, ссылку на которую я дал в первом посте, то нашли бы и описание этой каверзной пакости.
Советую посетить указанную ссылку и может вопросы отпадут.
...
Рейтинг: 0 / 0
Помогите с объединением файлов
    #36845077
PlanB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ксати, почему бы не копировать данные запросом? цикл на файлы в папке, и последовательно организовывать подключение к каждому.
sql = "SELECT * FROM " & fNmae
или с JOIN промутить, если число файлов постоянное. тогда вообще VBA использовать не надо. по сути, задача сводится к предзапускному указанию директории.
...
Рейтинг: 0 / 0
Помогите с объединением файлов
    #36845315
yurechkodp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В процессе работы было выяснено что не все папки имеют одинаковое количество фалов, в некоторых их меньше.
Option Explicit использую изначально.
Все месячные файлы формата xls
Вот сам код, используемый мной. Знакомство с VBA мое состоялось лишь пару дней назад, до этого был лишь фортран 15 лет назад.

Код: plaintext
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.
Option Explicit

Dim NewLine As Integer, Col As Integer, ToSheet As Worksheet
' Фукция поиска последней строки
Public Function LastRow(Optional ws As Worksheet, Optional FindRange As String) As Long
  If ws Is Nothing Then Set ws = ActiveSheet
  If FindRange = "" Then FindRange = Cells.Address
  LastRow = ws.Range(FindRange).Find(What:="*", SearchDirection:=xlPrevious, SearchOrder:=xlByRows).Row
End Function

Sub RegularCopy(FName As String)
  Dim openwb As Workbook, FromSheet As Worksheet, FromRangeName As String, Lrow As Long, Frow As Long
  'Открытие исходной книги предполагается что файлы находятся по указанному адресу
  'Для работы макроса эту книгу запускаем через меню ФАЙЛ - Открыть книгу!
  Workbooks.Open Filename:="Z:\ZK\" & FName & ".XLS", UpdateLinks:=False
   Set openwb = ActiveWorkbook
  'переходим на лист с которого будут копироваться данные
   Set FromSheet = openwb.ActiveSheet
   'Имя Диапазона, в котором искать последнюю строку
   FromRangeName = Range(Cells( 1 ,  1 ).Address, Cells(Rows.Count, Col).Address).Address
   
   'первая строка в диапазоне, которую нужно копировать
   Frow =  2 
   'нахождение последней строки в диапазоне
   Lrow = LastRow(FromSheet, FromRangeName)
   
   'Копирование значений диапазона
   ToSheet.Range(Cells(NewLine,  1 ).Address, Cells(NewLine - Frow + Lrow, Col).Address).Value = _
   FromSheet.Range(Cells(Frow,  1 ).Address, Cells(Lrow, Col).Address).Value
   NewLine = NewLine - Frow + Lrow +  1 
   
  'закрытие книги
  openwb.Close False
End Sub

Sub Put_Data()
Dim openwb As Workbook
 Application.ScreenUpdating = False
 Application.Calculation = xlCalculationManual
   
    '№ Последнего столбца для консолидации, первый считается "A".
    'Дейсвует как для исходных данных, так и для итоговых
   Col =  20 
    'Первая строка в которую заполняются значения
   NewLine =  2 
    'Книга в которую будем копировать
   Workbooks.Open Filename:="C:\15.XLSX", UpdateLinks:=False
    ''''''почему то без этой строчки нормально не работало
   Set openwb = ActiveWorkbook
    'Лист на который будем копировать
   Set ToSheet = openwb.Sheets("F")
    'Открытие листа куда заполняются данные
   ToSheet.Select
   'Очистка предыдущих данных
   Range(Cells(NewLine,  1 ), Cells(Rows.Count, Col)).Clear
   
     'Запуск процедуры копирования по каждому файлу, сколько угодно раз.
     'В кавычках имя файла без расширения

   RegularCopy ("2010_1_РТ_КРД_57350 - Запчасти")
   RegularCopy ("2010_1_РТ_КРД_57367 - Связь")
 
  Application.ScreenUpdating = True
 Application.Calculation = xlCalculationAutomatic
 
End Sub
...
Рейтинг: 0 / 0
Помогите с объединением файлов
    #36845411
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yurechkodp,

ошибка возникает потому что NewLine As Integer, надо As Long
...
Рейтинг: 0 / 0
Помогите с объединением файлов
    #36845487
yurechkodp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
по совету Shamanus заменил NewLine As Integer на As Long.
Когда доходит опять до размера примерно 65000 строк вылезает ошибка

Run-time error '1004':
Application-defined or object-defined error
...
Рейтинг: 0 / 0
Помогите с объединением файлов
    #36845497
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yurechkodpКогда доходит опять до размера примерно 65000 строк вылезает ошибка

Run-time error '1004':
Application-defined or object-defined errorУ Вас в момент работы макроса и копирования данных открыты какие-либо файлы 2003 Excel?
...
Рейтинг: 0 / 0
Помогите с объединением файлов
    #36845515
yurechkodp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
открыты! у меня открывается файл, из него копируются данные, он закрывается, открывается следующий и так далее.
я просто не знаю как по другому организовать код, подскажите.
...
Рейтинг: 0 / 0
Помогите с объединением файлов
    #36845558
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yurechkodp, попробуйте так. Сильно код не стал менять, чтоб не вводить Вас в заблуждение.
Код должен работать, если файл 2003 Excel лишь тот, из которого копируем и другие файлы 2003 не открыты.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
Sub RegularCopy(FName As String)
    Dim openwb As Workbook, FromSheet As Worksheet, FromRangeName As String, Lrow As Long, Frow As Long
    'Открытие исходной книги предполагается что файлы находятся по указанному адресу
    'Для работы макроса эту книгу запускаем через меню ФАЙЛ - Открыть книгу!
    Workbooks.Open Filename:="Z:\ZK\" & FName & ".XLS", UpdateLinks:=False
    Set openwb = ActiveWorkbook
    'переходим на лист с которого будут копироваться данные
    Set FromSheet = openwb.ActiveSheet
    'Имя Диапазона, в котором искать последнюю строку
    FromRangeName = Range(Cells( 1 ,  1 ), Cells(Rows.Count, Col)).Address

    'первая строка в диапазоне, которую нужно копировать
    Frow =  2 
    'нахождение последней строки в диапазоне
    Lrow = LastRow(FromSheet, FromRangeName)
    Dim avArr()
    'Копирование значений диапазона в массив
    avArr = FromSheet.Range(Cells(Frow,  1 ), Cells(Lrow, Col)).Value
     'закрытие книги
    openwb.Close False
    'Вставка диапазона из массива
    ToSheet.Range(Cells(NewLine,  1 ), Cells(NewLine - Frow + Lrow, Col)).Value = avArr
    NewLine = NewLine - Frow + Lrow +  1 
End Sub
...
Рейтинг: 0 / 0
Помогите с объединением файлов
    #36845634
yurechkodp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
The_Prist огромное вам спасибо, помогло. Я как понял просто считываете данные в массив, а потом только записываете в файл?
осталось теперь только найти как перебором открывать все файлы в папке, чтобы не забивать названия в ручную...
...
Рейтинг: 0 / 0
Помогите с объединением файлов
    #36845666
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yurechkodpосталось теперь только найти как перебором открывать все файлы в папке, чтобы не забивать названия в ручную...Вот Вам пример выбора папки(можно выбор папки заменить на адрес папки с файлами) и перебор всех файлов указанного формата в ней:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Sub Перебор_файов_в_папке()
    Dim sFolder As String, sFiles As String, li As Long
    With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show = False Then Exit Sub
        sFolder = .SelectedItems( 1 )
    End With
    Application.ScreenUpdating = False
    sFiles = Dir(sFolder & Application.PathSeparator & "*.xls")
    Do While sFiles <> ""
        Workbooks.Open sFiles
        'необходимые действия
        ActiveWorkbook.Close True
        sFiles = Dir
    Loop
    Application.ScreenUpdating = True
End Sub
...
Рейтинг: 0 / 0
Помогите с объединением файлов
    #36845700
yurechkodp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здесь он открывает все файлы сразу(если я правильно понял), что не получится в моем случае(
...
Рейтинг: 0 / 0
Помогите с объединением файлов
    #36845710
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yurechkodpЗдесь он открывает все файлы сразу(если я правильно понял), что не получится в моем случае(А это не Вы писали?
yurechkodpнайти как перебором открывать все файлы в папке

Тогда потрудитесь пояснить, что Вам надо. Вы написали вопрос - я ответил. Оказывается - не то. Где правда?
Вы код-то пробовали? Или надо в Ваш код все это вставить, чтобы Вы поняли принцип? Запустите код и посмотрите на действия.
...
Рейтинг: 0 / 0
Помогите с объединением файлов
    #36845728
PlanB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
The_Prist, вот вам код сбацал, вытягивает все файлы расширением .xls и .xlsx любой степени вложденности в указанной директории. дальше у вас наработки есть, по всей видимости. хотя я в любом случае склоняюсь к sql-запросу.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Public Sub Main()
    With New Scripting.FileSystemObject
        ListSubFiles .GetFolder("путь к папке")
    End With
End Sub

Sub ListSubFiles(sf As Scripting.Folder)
Dim fl As Scripting.Folder, f As Scripting.File
    For Each f In sf.Files
        If (Right(f.Name,  4 ) = "xlsx") Or (Right(f.Name,  4 ) = ".xls") Then
            Debug.Print f.Path
            'тут или перебираете папки открывая и закрывая их поочередно, или запросом к каждой.
            'но однозначно не стоит копировать каждую строку, 
            'обращаясь к ним при помощи цикла For Next
            'для этого есть CurrentRegion.Select (сочетание клавиш ctrl+*)
        End If
    Next
    For Each fl In sf.SubFolders
        ListSubFiles fl
    Next fl
End Sub
...
Рейтинг: 0 / 0
Помогите с объединением файлов
    #36845751
yurechkodp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2The_Prist
я имею ввиду что у меня нельзя открывать все файлы сразу, ведь по вашим же словам надо чтобы только один файл был открыт. То есть чтобы один открылся, скопировал с него, закрылся.

видать я что-то не понимаю в вашем коде
...
Рейтинг: 0 / 0
Помогите с объединением файлов
    #36845753
PlanB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yurechkodpЗдесь он открывает все файлы сразу(если я правильно понял), что не получится в моем случае(почему все сразу? написано же
Код: plaintext
1.
2.
        Workbooks.Open sFiles 'открыли книгу
        'необходимые действия
        ActiveWorkbook.Close True 'закрыли книгу
вставьте действия какие-нить между открытием и закрытием - будет вам счастье.
The_Prist, у вас висит Application.ScreenUpdating = False, ничерта там топикстартер и не увидит =))
The_Prist, предыдущий мо пост адресован yurechkodp.
...
Рейтинг: 0 / 0
Помогите с объединением файлов
    #36845761
PlanB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yurechkodp 2The_Prist
я имею ввиду что у меня нельзя открывать все файлы сразу, ведь по вашим же словам надо чтобы только один файл был открыт. То есть чтобы один открылся, скопировал с него, закрылся.

видать я что-то не понимаю в вашем кодетак и происходит
...
Рейтинг: 0 / 0
Помогите с объединением файлов
    #36845772
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PlanBWith New Scripting.FileSystemObjectPlanB забыл указать, что при этом коде необходимо указать ссылку в библиотеках(Tools-Referenses) на Microsoft Scripting Runtime.

Ну и надеюсь обращение ко мнеPlanBThe_Prist, вот вам код сбацал было ошибочным из-за особенностей форума...
...
Рейтинг: 0 / 0
25 сообщений из 47, страница 1 из 2
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Помогите с объединением файлов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]