Excel VBA Макросы: Макрос сбора данных из разных файлов эксель в один.

Автор Посетитель, 30 июля 2019, 12:58

Посетитель

Как на кнопку в книге эксель создать функцию сбора определенных строк с разных книг экселя и вставку их друг за другом в эту книгу?

Я сделал макрос, но он собирает с одного файла по определенному пути. Как изменить код, чтобы он собирал со всех файлов по одному пути и вставлял по порядку? Файлы изначально располагались в корне диска D.

Макрос
Private Sub CommandButton1_Click()
Workbooks.Open Filename:="D:\1.xlsx"
Workbooks("1.xlsx").Worksheets("Лист1").Range("A16:E16").Copy
Workbooks("Свод.xlsm").Activate
ActiveWorkbook.Worksheets("Лист1").Range("A1").Select
ActiveSheet.Paste
Workbooks("1.xlsx").Close
End Sub
[свернуть]

[вложение удалено администратором]

Администратор

1. Вверху модуля вставьте эти строки:
Option Explicit
Option Compare Text
Option Base 1

2. В модуле "Module1", в процедуре "ПолучитьПолныеИменаФайлов":
1) в пункте 2 укажите полное имя папки, в которой находятся файлы;
2) в пункте 4 укажите нужное расширение, сейчас в коде расширение "xlsx".

3. Для работы макроса нужно подключить библиотеку:
Tools - References... - Microsoft Scripting Runtime

4. Запускать нужно процедуру "Макрос".

5. Этот макрос не будет работать в Mac OS.

Макрос
Sub Макрос()
   
    Dim sh_src As Worksheet, sh_res As Worksheet
    Dim FNs As Collection
    Dim lr As Long, i As Long


    ' Отключение монитора, чтобы ускорить макрос.
        ' Если много формул, можно ещё отключить формулы.
    Application.ScreenUpdating = False

    '1. Присваиваем имя листу, в который нужно вставить данные.
        ' Далее в коде будем обращаться к этому листу по этому имени.
    Set sh_res = ActiveSheet
   
    '2. Запись в коллекцию "FNs" полных имён файлов, из которых нужно извлечь данные.
    ПолучитьПолныеИменаФайлов FNs

    '3. Извлечение данных из файлов на активный лист.
    For i = 1 To FNs.Count
   
        '1) Открытие файла и назначение листу имени "sh_src".
            ' Далее в коде будем обращаться к листу по этому имени.
        Set sh_src = Workbooks.Open(Filename:=FNs(i), ReadOnly:=True).Worksheets("Лист1")
       
        '2) Копирование фрагмента на листе-источнике.
        sh_src.Range("A16:E16").Copy
       
        '3) Поиск последней строки на листе-результате по столбцу A.
            ' End не ищет в скрытых строках.
        lr = sh_res.Cells(sh_res.Rows.Count, "A").End(xlUp).Row + 1
       
        '4) Вставка данных на лист-результат.
        sh_res.Cells(lr, "A").PasteSpecial xlPasteAll
       
        '5) Закрытие файла-источника.
        sh_src.Parent.Close SaveChanges:=False
       
    Next i
   
    ' Включение монитора.
    Application.ScreenUpdating = True
   
    '4. Сообщение.
    MsgBox "Готово.", vbInformation
   
End Sub

Private Sub ПолучитьПолныеИменаФайлов(FNs As Collection)

    Dim fso As Scripting.FileSystemObject
    Dim папка As Scripting.Folder, файл As Scripting.File
   
   
    '1. Создание объекта, который умеет работать с папками и файлами.
    Set fso = New FileSystemObject
   
    '2. Присваиваем имя папке, с которой надо работать.
    ' Здесь укажите полное имя папки. На конце слеш не нужно указывать.
    Set папка = fso.GetFolder("C:\Users\User\Desktop\Эксель-файлы")
   
    '3. Создание коллекции.
    Set FNs = New Collection
   
    '4. Запись в коллекцию полных имён файлов, которые находятся в указанной папке.
        ' Если эксель-файл открыт, то в папке будет скрытый файл, относящийся к этому файлу.
        ' Поэтому делается проверка, что файл не скрытый.
    For Each файл In папка.Files
        If (файл.Attributes And Hidden) = 0 Then
            If файл.Name Like "*.xlsx" Then
                FNs.Add Item:=файл.Path
            End If
        End If
    Next файл
   
End Sub
[свернуть]

[вложение удалено администратором]

Посетитель