Excel работа с файлами в одной папке

Список файлов в папке

Иногда бывает необходимо заполучить на лист Excel список файлов в заданной папке и ее подпапках. В моей практике такое встречалось неоднократно, например:

  • перечислить в приложении к договору на проведение тренинга список файлов из раздаточных материалов для особо щепетильных юристов в некоторых компаниях
  • создать список файлов для ТЗ проекта
  • сравнить содержимое папок (оригинал и бэкап, например)

Для реализации подобной задачи можно использовать несколько способов.

Способ 1. Скелет из шкафа — функция ФАЙЛЫ

Этот способ использует древнюю функцию ФАЙЛЫ (FILES), оставшуюся в Microsoft Excel с далеких девяностых. Вы не найдете эту функцию в общем списке функций, но для совместимости, она всё ещё остаётся внутри движка Excel, и мы вполне можем её использовать.

Механизм таков:

1. В любую ячейку листа (например, в А1) введём путь к папке, список файлов из которой мы хотим получить.

Путь к папке

Обратите внимание, что путь должен оканчиваться шаблоном со звездочками:

  • *.* — любые файлы
  • *.xlsx — книги Excel (только с расширением xlsx)
  • *.xl* — любые файлы Excel
  • *отчет* — файлы, содержащие слово отчет в названии

и т.д.

2. Создадим именованный диапазон с помощью вкладки Формулы — далее кнопка Диспетчер имен — Создать (Formulas — Names Manger — Create). В открывшемся окне введем любое имя без пробелов (например Мои_файлы) и в поле диапазона выражение:

=ФАЙЛЫ(Лист1!$A$1)

Создаем именованный диапазон с функцией ФАЙЛЫ

После нажатия на ОК будет создан именованный диапазон с именем Мои_файлы, где хранится список всех файлов из указанной в А1 папки. Останется их оттуда только извлечь.

3. Чтобы извлечь имена отдельных файлов из созданной переменной, используем функцию ИНДЕКС (INDEX), которая в Excel вытаскивает данные из массива по их номеру:

Список файлов

Если лениво делать отдельный столбец с нумерацией, то можно воспользоваться костылем в виде функции СТРОКИ (ROWS), которая будет подсчитывать количество заполненных строк с начала списка автоматически:

=ИНДЕКС(Мои_файлы; ЧСТРОК($B$3:B3))

Ну, и скрыть ошибки #ССЫЛКА! в конце списка (если вы протягиваете формулу с запасом) можно стандартной функцией ЕСЛИОШИБКА (IFERROR):

=ЕСЛИОШИБКА(ИНДЕКС(Мои_файлы; ЧСТРОК($B$3:B3)); «»)

Важное примечание: формально функция ФАЙЛЫ относится к макро-функциям, поэтому необходимо будет сохранить ваш файл в формате с поддержкой макросов (xlsm или xlsb).

Способ 2. Готовый макрос для ленивых

Если вы знакомы с макросами (не в смысле их программирования, а в смысле копипастинга готовых кодов на VBA), то вам, возможно, отлично зайдёт небольшой макрос, добавляющий в текущую книгу новый пустой лист и выводящий на него список всех файлов с их параметрами из заданной пользователем папки.

Для добавления макроса в вашу книгу нажмите сочетание клавиш Alt+F11, или кнопку Visual Basic на вкладке Разработчик (Developer), в открывшемся окне редактора Visual Basic вставьте новый модуль через меню Insert — Module и скопируйте туда текст этого макроса:

Sub FileList()
    Dim V As String
    Dim BrowseFolder As String
    
    'открываем диалоговое окно выбора папки
    With Application.FileDialog(msoFileDialogFolderPicker)
        .Title = "Выберите папку или диск"
        .Show
        On Error Resume Next
        Err.Clear
        V = .SelectedItems(1)
        If Err.Number <> 0 Then
            MsgBox "Вы ничего не выбрали!"
            Exit Sub
        End If
    End With
    BrowseFolder = CStr(V)
    
    'добавляем лист и выводим на него шапку таблицы
    ActiveWorkbook.Sheets.Add
    With Range("A1:E1")
        .Font.Bold = True
        .Font.Size = 12
    End With
    Range("A1").Value = "Имя файла"
    Range("B1").Value = "Путь"
    Range("C1").Value = "Размер"
    Range("D1").Value = "Дата создания"
    Range("E1").Value = "Дата изменения"
    
    'вызываем процедуру вывода списка файлов
    'измените True на False, если не нужно выводить файлы из вложенных папок
    ListFilesInFolder BrowseFolder, True
End Sub


Private Sub ListFilesInFolder(ByVal SourceFolderName As String, ByVal IncludeSubfolders As Boolean)

    Dim FSO As Object
    Dim SourceFolder As Object
    Dim SubFolder As Object
    Dim FileItem As Object
    Dim r As Long

    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set SourceFolder = FSO.getfolder(SourceFolderName)

    r = Range("A65536").End(xlUp).Row + 1   'находим первую пустую строку
    'выводим данные по файлу
    For Each FileItem In SourceFolder.Files
        Cells(r, 1).Formula = FileItem.Name
        Cells(r, 2).Formula = FileItem.Path
        Cells(r, 3).Formula = FileItem.Size
        Cells(r, 4).Formula = FileItem.DateCreated
        Cells(r, 5).Formula = FileItem.DateLastModified
        r = r + 1
        X = SourceFolder.Path
    Next FileItem
    
    'вызываем процедуру повторно для каждой вложенной папки
    If IncludeSubfolders Then
        For Each SubFolder In SourceFolder.SubFolders
            ListFilesInFolder SubFolder.Path, True
        Next SubFolder
    End If

    Columns("A:E").AutoFit

    Set FileItem = Nothing
    Set SourceFolder = Nothing
    Set FSO = Nothing

End Sub

Для запуска макроса нажмите сочетание клавиш Alt+F8,или кнопку Макросы (Macros) на вкладке Разработчик (Developer), выберите наш макрос FileList и нажмите кнопку Выполнить (Run). В диалоговом окне выберите любую папку или диск и — вуаля!

Если захотите, чтобы вместо пути к файлу в столбце B выводилась живая гиперссылка, то замените 52-ю строку

Cells(r, 2).Formula = FileItem.Path

на

Cells(r, 2).Formula = «=HYPERLINK(«»» & FileItem.Path & «»»)»

Способ 3. Мощь и красота — надстройка Power Query

Power Query — это очень мощная и при этом бесплатная надстройка для Excel от Microsoft, упрощающая множество задач по загрузке и трансформации данных. В нашей ситуации она тоже может здорово помочь.

Если у вас Excel 2016 или новее, то Power Query уже встроена в Excel по умолчанию, поэтому просто на вкладке Данные выберите команду Создать запрос / Получить данные — Из файла — Из папки (Create Query / Get Data — From file — From folder). Если у вас Excel 2010-2013, то Power Query нужно будет скачать с сайта Microsoft и установить как отдельную надстройку и она появится у вас в Excel в виде отдельной вкладки Power Query. На ней будет аналогичная кнопка Из файла — Из папки (From file — From folder).

В открывшемся окне нужно будет указать папку, содержимое которой мы хотим получить. После нажатия на ОК Power Query обшарит указанную папку и все вложенные подпапки и выдаст на экран окно с предварительным просмотром результатов:

Предварительный просмотр списка файлов в Power Query

Если внешний вид списка вас устраивает, то можно смело жать внизу кнопку Загрузить (Load), чтобы залить эти данные на новый лист. Если же хочется дополнительно обработать список (удалить лишние столбцы, отобрать только нужные файлы и т.п.), то нужно выбрать команду Изменить / Преобразовать данные (Edit / Transform Data).

Поверх окна Excel откроется окно редактора Power Query, где мы увидим список всех наших файлов в виде таблицы:

Окно Power Query

Дальше возможны несколько вариантов:

  • Если нужны только файлы определенного типа, то их можно легко отобрать с помощью фильтра по столбцу Extension:

    Фильтр по расширению файла

  • Аналогичным образом фильтрами по столбцам Date accessed, Date modified или Date created можно отобрать файлы за нужный период (например, созданные только за последний месяц и т.п.):

    Фильтры по дате

  • Если нужно получить данные не из всех папок, то фильтруем по столбцу Folder Path, чтобы оставить только те строки, где путь содержит/не содержит нужные имена папок:

    Фильтры по пути и папкам

  • Там же можно выполнить сортировку файлов по любому столбцу, если требуется.

После того, как необходимые файлы отобраны, можно смело удалить ненужные столбцы, щелкнув по заголовку столбца правой кнопкой мыши и выбрав команду Удалить (Remove column). Это, кстати, уже никак не повлияет на фильтрацию или сортировку нашего списка:

Готовый список

Если в будущем планируется подсчитывать количество файлов в каждой папке (например, для контроля поступивших заявок или подсчета статистики по заявкам), то имеет смысл дополнительно сделать ещё пару действий:

  • Щелкните правой кнопкой мыши по столбцу Folder Path и выберите команду Дублировать столбец (Duplicate Column).
  • Выделите скопированный столбец и на вкладке Преобразование (Transform) выберите Разделить столбец — По разделителю (Split Column — By delimiter)

Мы получим рядом с нашими данными еще несколько столбцов, где будут продублированы имена вложенных папок — это пригодится нам чуть позже для подсчета статистики с помощью сводной таблицы:

Разделить столбец пути по разделителю

Получившиеся столбцы можно переименовать (Диск, Папка1, Папка2 и т.д.), просто щёлкнув дважды по заголовку каждого.

И, наконец, когда список готов, то его можно выгрузить на лист с помощью команды Главная — Закрыть и загрузить — Закрыть и загрузить в… (Home — Close & Load — Close & Load to…):

Выгруженные на лист результаты

И, само-собой, теперь можно построить по нашей таблице сводную (вкладка Вставка — Сводная таблица), чтобы легко подсчитать количество файлов в каждой папке:

Сводная со статистикой по каждой папке

Дополнительным бонусом можно сделать еще один столбец с функцией ГИПЕРССЫЛКА (HYPERLINK), которая создаст красивые стрелочки-ссылки для моментального перехода к каждому файлу:

Функция ГИПЕРССЫЛКА

Мелочь, а приятно :)

И вдвойне приятно, что в будущем, при изменении содержимого исходной папки, достаточно будет просто щелкнуть мышью по нашей таблице и выбрать команду Обновить (Refresh) — и Power Query выполнит всю цепочку запрограммированных нами единожды действий уже автоматически, отобразив все изменения в составе папки.

Ссылки по теме

  • Что такое макрос, куда вставлять код макроса на Visual Basic
  • Создание резервных копий ценных файлов
  • Что такое Power Query и что можно делать с её помощью

Обработка данных из файлов Excel - отображение информации на индикаторе состояния

Этот макрос предназначен для сбора (загрузки) информации из файлов Excel, расположенных в одной папке.

Для работы этого макроса, помимо него самого, вам понадобится добавить в свой файл:

  1. функцию FilenamesCollection для получения списка файлов в папке
  2. функцию GetFolder для вывода диалогового окна выбора папки с запоминанием выбранной папки
  3. прогресс-бар для отображения процесса обработки файлов (модуль класса и форму)

Если при тестировании макроса у вас возникает ошибка, что не найдена та или иная функция,
— проверьте, все ли необходимые компоненты (которые перечислены выше) вы добавили в свой файл.

Этот макрос я публикую прежде всего для себя (поскольку использую этот код чуть ли ни в каждой третьей своей программе),
поэтому я не буду помогать вам в настройке этого макроса, если у вас он вдруг не заработает.

Макрос при запуске выдает диалоговое окно для выбора папки, в которой расположены обрабатываемые файлы,
после чего открывает каждый из файлов, считывает из него данные, помещает их в текущую книгу (из которой запущен макрос),
и закрывает обработанный файл без сохранения изменений.

После того, как очередной файл обработан, он перемещается во вторую папку («архив»).

Код макроса:

Sub ИмпортДанныхИзЗаявок()
    On Error Resume Next: Err.Clear
    ' запрашиваем пути к папкам с файлами
    InvoiceFolder$ = GetFolder(1, , "Выберите папку с файлами заявок (из Outlook)")
    If InvoiceFolder$ = "" Then MsgBox "Не задана папка с заявками", vbCritical, "Обработка заявок невозможна": Exit Sub
 
    ArchieveFolder$ = GetFolder(2, , "Выберите папку, куда будут помещаться обработанные файлы заявок")
    If ArchieveFolder$ = "" Then MsgBox "Не задана папка для архива заявок", vbCritical, "Обработка заявок невозможна": Exit Sub
 
    Dim coll As Collection
    ' загружаем список файлов по маске имени файла
    Set coll = FilenamesCollection(InvoiceFolder$, "Заявка №*от*.xls*", 1)
 
    If coll.Count = 0 Then
        MsgBox "Не найдено ни одной заявки для обработки в папке" & vbNewLine & InvoiceFolder$, _
               vbExclamation, "Нет необработанных заявок"
        Exit Sub
    End If
 
    Dim pi As New ProgressIndicator: pi.Show "Обработка заявок", , 2
    pi.StartNewAction , , , , , coll.Count    ' отображаем прогресс-бар

    Dim WB As Workbook, sh As Worksheet, ra As Range
    Application.ScreenUpdating = False  ' отключаем обновление экрана (чтобы процесс открытия файлов не был виден)

    ' перебираем все найденные в папке файлы
    For Each Filename In coll
 
        ' обновляем информацию на прогресс-баре
        pi.SubAction "Обрабатывается заявка $index из $count", "Файл заявки: " & Dir(Filename), "$time"
        pi.Log "Файл: " & Dir(Filename)
 
        ' открываем очередной файл в режиме «только чтение»
        Set WB = Nothing: Set WB = Workbooks.Open(Filename, False, True)
 
        If WB Is Nothing Then    ' не удалось открыть файл
            pi.Log vbTab & "ОШИБКА при загрузке файла. Файл не обработан."
 
        Else    ' файл успешно открыт
            Set sh = WB.Worksheets(1)    ' будем брать данные с первого листа
            ' берем диапазон ячеек с ячейки B1 до последней заполненной в столбце B
            Set ra = sh.Range(sh.Range("b1"), sh.Range("b" & sh.Rows.Count).End(xlUp))
 
            ' ==== переносим данные в наш файл (shb - кодовое имя листа, куда помещаем данные)
            shb.Range("a" & shb.Rows.Count).End(xlUp).Offset(1).Resize(, ra.Rows.Count).Value = _
            Application.WorksheetFunction.Transpose(ra.Value)
            ' ==== конец обработки данных из очередного файла

            WB.Close False: DoEvents    ' закрываем обработанный файл без сохранения изменений
            pi.Log vbTab & "Файл успешно обработан."
 
            ' перемещаем обработанный файл из папки InvoiceFolder$ в папку ArchieveFolder$
            Name Filename As ArchieveFolder$ & Dir(Filename, vbNormal)
 
        End If
    Next
 
    ' закрываем прогресс-бар, включаем обновление экрана
    pi.Hide: DoEvents: Application.ScreenUpdating = True
    MsgBox "Обработка заявок завершена", vbInformation
End Sub

Во вложении — файл со всеми необходимыми макросами для сбора данных из других файлов Excel

Excel для Microsoft 365 Excel 2021 Excel 2019 Excel 2016 Excel 2013 Excel 2010 Еще…Меньше

Используйте Power Query, чтобы объединить несколько файлов с одной схемой, храняной в одной папке, в одну таблицу. Например, каждый месяц необходимо объединить бюджетные книги из нескольких отделов, где столбцы одинаковы, но количество строк и значений в каждой книге различается. После ее настроив, вы можете применить дополнительные преобразования, как к любому импортируемму источнику данных, а затем обновить данные, чтобы увидеть результаты за каждый месяц.  

Концептуальный обзор объединения файлов папок

Примечание.    В этой теме показано, как объединять файлы из папки. Вы также можете объединять файлы, хранимые в SharePoint, azure BLOB-служба хранилища и Azure Data Lake служба хранилища. Процесс аналогичный.

Не изумять:

  • Убедитесь, что все файлы, которые вы хотите объединить, содержатся в выделенной папке без лишних файлов. В противном случае все файлы в папке и все вложенные папки, которые вы выбрали, будут включены в данные для совместной обработки.

  • У каждого файла должна быть та же схема, что и для согласованных столбцов, типов данных и количества столбцов. Столбцы не должны быть в том же порядке, что и имена столбцов.

  • По возможности старайтесь не использовать несвязанные объекты данных для источников данных, которые могут иметь несколько объектов данных, например JSON-файл, Excel книгу или базу данных Access.

Каждый из этих файлов имеет простой шаблон, в каждом из которых есть только одна таблица данных.

  1. Выберите Данные > Получить данные > из файла > из папки. Появится диалоговое окно Обзор.

  2. Найдите папку с файлами, которые вы хотите объединить.

  3. Список файлов в папке появится в диалоговом <путь к> папке. Убедитесь, что в списке указаны все нужные файлы.

    Пример диалогового окна импорта текста

  4. Выберите одну из команд в нижней части диалогового окна, например Объединить> Объединить & Загрузить. В разделе Обо всех этих командах обсуждаются дополнительные команды.

  5. Если выбрать команду Объединить, появится диалоговое окно Объединение файлов. Чтобы изменить параметры файла, выберите каждый файл в поле Образец файла, задав нужные параметры Источник файла,Делитер и Обнаружение типов данных. Кроме того, в нижней части диалогового окна можно выбрать или отобрать диалоговое окно Пропускать файлы с ошибками.

  6. Нажмите кнопку ОК.

Результат

Power Query автоматически создает запросы для консолидации данных из каждого файла на каждом из них. Шаги запроса и созданные столбцы зависят от того, какую команду вы выбрали. Дополнительные сведения см. в разделе Сведения обо всех этих запросах.

  1. Выберите Данные > Получить данные > из файла > из папки. Появится диалоговое окно Обзор.

  2. Найдите папку с файлами, которые вы хотите объединить.

  3. Список файлов в папке появится в диалоговом <путь к> папке. Убедитесь, что в списке указаны все нужные файлы.

  4. Выберите одну из команд в нижней части диалогового окна, например Объединить> Объединить & Transform. В разделе Обо всех этих командах обсуждаются дополнительные команды.

    Появится редактор Power Query.

  5. Столбец Значение является структурированным столбцом списка. Выберите значок Развернуть Значок развертывания столбца , а затем выберите Развернуть до новых строк.

    Расширение списка JSON

  6. Столбец Value (Значение) теперь является структурированным столбцом Record (Запись).  Выберите значок Значок развертывания столбца развернуть. Появится диалоговое окно с drop-down.

    Расширение записи JSON

  7. Не избирать все столбцы. Возможно, вам нужно будет очистить поле Использовать имя исходного столбца в качестве префикса. Нажмите кнопку ОК.

  8. Вы можете выбрать все столбцы, содержащие значения данных. На лентевыберите Главная , стрелку рядом с клавишей Remove Columns, а затем выберите Удалить другие столбцы.

  9. Выберите Главная> закрыть & загрузить.

Результат

Power Query автоматически создает запросы для консолидации данных из каждого файла на каждом из них. Шаги запроса и созданные столбцы зависят от того, какую команду вы выбрали. Дополнительные сведения см. в разделе Сведения обо всех этих запросах.

Каждый из этих источников данных может иметь несколько объектов для импорта. Книга Excel может иметь несколько книг, Excel таблиц или именовых диапазонов. База данных Access может иметь несколько таблиц и запросов. 

  1. Выберите Данные > Получить данные > из файла > из папки. Появится диалоговое окно Обзор.

  2. Найдите папку с файлами, которые вы хотите объединить.

  3. Список файлов в папке появится в диалоговом <путь к> папке. Убедитесь, что в списке указаны все нужные файлы.

  4. Выберите одну из команд в нижней части диалогового окна, например Объединить> Объединить & Загрузить. В разделе Обо всех этих командах обсуждаются дополнительные команды.

  5. В диалоговом окне Объединение файлов:

    • В поле Образец файла выберите файл, который будет использоваться в качестве примера данных для создания запросов. Нельзя выбрать объект или выбрать только один объект. Однако выбрать несколько из них нельзя.

    • Если объектов много, используйте поле Поиск, чтобы найти объект, или параметры отображения, а также кнопку Обновить для фильтрации списка.

    • В нижней части диалогового окна можно выбрать или отобирать для файлов с ошибками поле Пропускать файлы с ошибками.

  6. Нажмите кнопку ОК.

Результат

Power Query автоматически создает запрос для консолидации данных из каждого файла на каждом из них. Шаги запроса и созданные столбцы зависят от того, какую команду вы выбрали. Дополнительные сведения см. в разделе Сведения обо всех этих запросах.

Для большей гибкости вы можете явным образом объединить файлы в редакторе Power Query с помощью команды Объединить файлы. Предположим, что в исходных папках есть как типы файлов, так и вложенные папки, и вы хотите подцелить определенные файлы с тем же типом файлов и схемой, но не с другими. Это может повысить производительность и упростить преобразования.

  1. Выберите data > Get Data > Data > From File > From Folder. Появится диалоговое окно Обзор.

  2. Найдите папку с файлами, которые вы хотите объединить, и выберите открыть.

  3. Список всех файлов в папке и вложенных папках появится в диалоговом<путь>папки. Убедитесь, что в списке указаны все нужные файлы.

  4. Внизу выберите преобразовать данные. Откроется редактор Power Query со всеми файлами в папке и во вложенных папках.

  5. Чтобы выбрать нужные файлы, отфильтруем столбцы, например Расширение или Путь к папке.

  6. Чтобы объединить файлы в одну таблицу, выберите столбец Содержимое, содержащий каждый двоичный (обычно первый столбец), а затем выберите Главная > Объединить файлы. Появится диалоговое окно Объединение файлов.

  7. Power Query анализирует пример файла (по умолчанию первый файл в списке), чтобы использовать правильный соединительщик и определить совпадающие столбцы.

    Чтобы использовать другой файл для примера, выберите его в списке Образец файла.

  8. При желании внизу выберите пропустить файлы с ошибкой s,чтобы исключить эти файлы из результата.

  9. Нажмите кнопку ОК.

Результат

Power Query автоматически создает запросы для консолидации данных из каждого файла на каждом из них. Шаги запроса и созданные столбцы зависят от того, какую команду вы выбрали. Дополнительные сведения см. в разделе Сведения обо всех этих запросах.

Существует несколько команд, которые можно выбрать, и каждая из них имеет разные цели.

  • Объединение и преобразование данных    Чтобы объединить все файлы с запросом, а затем запустить редактор Power Query, выберите объединить> объединить и преобразовать данные.

  • Объединение и загрузка   Чтобы отобразить диалоговое окно Образец файла, создайте запрос, а затем загрузите на таблицу, выберите объединить> Объединить и загрузить.

  • Объединение и загрузка в   Чтобы отобразить диалоговое окно Образец файла, создайте запрос, а затем в диалоговом окне Импорт выберите объединить> Объединить и загрузить в.

  • Нагрузки    Чтобы создать запрос с одним шагом, а затем загрузить на таблицу, выберите загрузить > загрузить.

  • Загрузить в   Чтобы создать запрос одним шагом и отобразить диалоговое окно Импорт, выберите загрузить > Загрузить в.

  • Преобразование данныхЧтобы создать запрос с одним шагом и запустить редактор Power Query, выберите Преобразовать данные.

Тем не менее при объединения файлов в области Запросы в группе «Запросы-справки» создается несколько вспомогательных запросов.

Список запросов, созданных в области "Запросы"

  • Power Query создает запрос «Образец файла» на основе примера запроса.

  • Запрос функции Transform File (Файл преобразования) использует запрос Parameter1 для указания каждого файла (двоичного) в качестве входного в запрос «Образец файла». Этот запрос также создает столбец Содержимое, содержащий содержимое файла, и автоматически расширяет его, чтобы добавить данные столбца в результаты. Запросы «Преобразовать файл» и «Образец файла» связаны, поэтому изменения в запросе «Образец файла» отражаются в запросе «Преобразовать файл».

  • Запрос, содержащий окончательные результаты, находится в группе «Другие запросы». По умолчанию он называется папкой, из которого вы импортировали файлы.

Для дальнейшего изучения щелкните каждый запрос правой кнопкой мыши и выберите Изменить, чтобы изучить каждый шаг запроса и увидеть, как работают запросы на этапе.

Чтобы начать процесс объединения нескольких файлов, сначала поместите их все в одну папку.

Примечание: Поддерживаются файлы Excel и Access, текстовые файлы, а также файлы в форматах CSV, JSON и XML.

  1. На вкладке Power Query выберите из файла > из папки.

    Power Query > параметры "Из > из папки"

  2. Нажмите кнопку Обзор, чтобы перейти к нужной папке.

    Появится список файлов в папке. Нажмите кнопку Изменить, чтобы открыть редактор запросов. В этом примере мы загрузим четыре книги Excel.

    Диалоговое окно объединения двоичных файлов, в котором показаны файлы, доступные для объединения

  3. Убедившись в том, что все нужные файлы присутствуют в списке, нажмите в столбце Содержимое кнопку Объединить двоичные данные.

    Нажмите кнопку "Объединить двоичные данные" в столбце "Содержимое" или в разделе "Объединить" на ленте Power Query.

  4. Будет выполнен анализ каждого файла и определен правильный формат, например текстовый, Excel или JSON. В этом примере отображается список листов из первой книги Excel. Выберите нужный лист и нажмите кнопку ОК.

    Диалоговое окно объединения двоичных файлов, в котором показаны листы Excel, доступные для выбора в качестве основной цели для размещения объединенных данных

  5. При преобразовании разных файлов автоматически создается запрос для консолидации данных из каждого файла и предварительного просмотра. Если результат вас устраивает, нажмите кнопку Закрыть & загрузить.

    Диалоговое окно для предварительного просмотра результатов объединения. Нажмите "Закрыть и загрузить", чтобы принять результаты и импортировать их в Excel.

    Когда процесс объединения двоичных файлов завершится, данные листов из списка будут консолидированы на одном листе.

  6. Если исходные файлы данных изменятся, вы всегда сможете обновить импортируемые данные. Щелкните в любом месте диапазона данных, а затем перейдите в инструменты запросов > обновить. Кроме того, вы можете легко применить дополнительные шаги преобразования или извлечения, изменяя автоматически созданный запрос-образец, не беспокоясь об изменении или создании дополнительных шагов запроса функций. любые изменения запроса-образец автоматически создаются в связанном запросе функции.

Известные проблемы

При загрузке процедуры объединения двоичных файлов в Excel может появиться такое сообщение об ошибке:

Сообщение об ошибке при объединении двоичных файлов. Это известная ошибка, которая будет устранена.

Если вы проигнорируете ошибки и нажмете кнопку ОК, то процесс объединения двоичных файлов будет выполнен и правильно загрузит данные, несмотря на это сообщение. Мы работаем над устранением этой ошибки.

См. также

Справка по Power Query для Excel

Добавление запросов

Обзор объединения файлов (docs.com)

Объединение CSV-файлов в Power Query (docs.com)

Нужна дополнительная помощь?

Хитрости »

20 Июль 2012              137483 просмотров


Просмотреть все файлы в папке

Иногда необходимо проделать однотипные операции с несколькими файлами, расположенными в одной папке. Можно открывать каждый по очереди:
Workbooks.Open «C:Новая папкаКнига1.xlsx»
Workbooks.Open «C:Новая папкаКнига2.xlsx»
и т.д.
Но если файлов много и все с разными именами, то это не очень практично и совсем лишено гибкости. При помощи Visual Basic for Application можно решить проблему. При этом файлы можно просматривать как в одной папке, так и включая вложенные «подпапки».

  • Все файлы в папке
  • Все файлы включая подпапки
  • Просмотреть все диски

 
Все файлы в папке

Ниже приведен код, который перебирает все файлы в папке, открывает их и на первом листе каждого файла записывает текст

«www.excel-vba.ru»

в ячейку

A1

:

Sub Get_All_File_from_Folder()
    Dim sFolder As String, sFiles As String
    Dim wb As Workbook
    'диалог запроса выбора папки с файлами
    With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show = False Then Exit Sub
        sFolder = .SelectedItems(1)
    End With
    sFolder = sFolder & IIf(Right(sFolder, 1) = Application.PathSeparator, "", Application.PathSeparator)
    'отключаем обновление экрана, чтобы наши действия не мелькали
    Application.ScreenUpdating = False
    sFiles = Dir(sFolder & "*.xls*")
    Do While sFiles <> ""
        'открываем книгу
        Set wb = Application.Workbooks.Open(sFolder & sFiles)
        'действия с файлом
        'Запишем на первый лист книги в ячейку А1 - www.excel-vba.ru
        wb.Sheets(1).Range("A1").Value = "www.excel-vba.ru"
        'Закрываем книгу с сохранением изменений
        wb.Close True 'если поставить False - книга будет закрыта без сохранения
        sFiles = Dir
    Loop
    'возвращаем ранее отключенное обновление экрана
    Application.ScreenUpdating = True
End Sub

sFiles = Dir(sFolder & «*.xls*») — Строка отвечает за тип перебираемых файлов. В примере будут просмотрены любые файлы Excel. Звездочка на конце означает любой символ или набор символов. Т.е. если указать без неё — «*.xls», то будут просмотрены только файлы с расширением xls, а если указать xlsx — то файлы с расширением xlsx и никакие другие.
Если хотите перебрать файлы других форматов, а не Excel, то просто замените «*.xls» на нужное расширение. Например «*.doc». Также, если хотите собрать только файлы с определенными символами/словами в имени, то можно указать так: sFiles = Dir(sFolder & «*отчет*.xls*»). Будут просмотрены все файлы, содержащие в имени слово «отчет»(например «отчет за июнь.xls», «отчет за июль.xls», «сводный отчет.xls» и т.п.).


 
Все файлы включая подпапки

В коде выше есть одна проблема: что если необходимо открыть файлы не только в указанной папке, но и во всех её подпапках? В версиях Excel 2003 и младше это решалось с помощью метода

.FileSearch

, но в старших версиях данный метод по каким-то причинам был заблокирован разработчиками Microsoft. И осталось действовать только через рекурсивный метод перебора папок. Ниже приведен код, который открывает все файлы Excel в указанной папке, включая все подпапки.
Для этого используется встроенная в офис библиотека

File System Object

:

Option Explicit
 
Dim objFSO As Object, objFolder As Object, objFile As Object
 
Sub Get_All_File_from_SubFolders()
    Dim sFolder As String
    With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show = False Then Exit Sub
        sFolder = .SelectedItems(1)
    End With
    sFolder = sFolder & IIf(Right(sFolder, 1) = Application.PathSeparator, "", Application.PathSeparator)
    Application.ScreenUpdating = False
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    GetSubFolders sFolder
    Set objFolder = Nothing
    Set objFSO = Nothing
    Application.ScreenUpdating = True
End Sub
Private Sub GetSubFolders(sPath)
    Dim sPathSeparator As String, sObjName As String
    Dim wb As Workbook
    Set objFolder = objFSO.GetFolder(sPath)
    For Each objFile In objFolder.Files
        If Replace(objFile.Name, objFSO.GetBaseName(objFile), "") Like ".xls*" Then
            'открываем книгу
            Set wb = Application.Workbooks.Open(sPath & objFile.Name)
            'действия с файлом
            'Запишем на первый лист книги в ячейку А1 - www.excel-vba.ru
            wb.Sheets(1).Range("A1").Value = "www.excel-vba.ru"
            wb.Close True 'wb.Close False '- если в коде надо будет закрывать книгу без сохранения
        End If
    Next
    For Each objFolder In objFolder.SubFolders
        GetSubFolders objFolder.Path & Application.PathSeparator
    Next
End Sub

Код делает тоже самое, что и первый, но открывает и изменяет ячейку A1 первого листа для всех файлов Excel в выбранной папке и всех её подпапках(включая все вложенные до последнего уровня).

If Replace(objFile.Name, objFSO.GetBaseName(objFile), "") Like ".xls*" Then

Строка отвечает за тип перебираемых файлов. В примере будут просмотрены любые файлы Excel. Звездочка на конце означает любой символ или набор символов. Т.е. если указать без неё — «*.xls», то будут просмотрены только файлы с расширением xls, а если указать xlsx — то файлы с расширением xlsx и никакие другие.
Если добавить условие: If objFSO.GetBaseName(objFile) Like «*книга*» Then
то будут обработаны файлы, которые в имени содержат слово «книга». При этом регистр букв имеет значение. Т.е. если файл содержит в имени слово «Книга», то он не будет обработан.
Думаю теперь Вы легко сможете проделать необходимые операции с множеством файлов.

Скачать пример:

  Все файлы в папке и подпапках.xls (61,5 KiB, 8 202 скачиваний)

В примере я закомментировал строки, открывающие файл и вносящие изменения в ячейку

A1

и заменил это созданием списка имен всех файлов в папках и подпапках. По окончании работы кода имена всех файлов записываются в столбец «А» нового листа(лист создается автоматически). Сделано для того, чтобы при тестировании кода случайно не повредить информацию в файлах.


 
Просмотреть все файлы на всех дисках

В последнее время участились вопросы как просмотреть еще и все диски на ПК. Ниже выкладываю код, который просматривает все подключенные диски и просматривает все файлы во всех папках дисков:

Sub Get_All_drives()
    Dim objDrives As Object, objDrive As Object
 
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objDrives = objFSO.Drives
    For Each objDrive In objDrives
        If objDrive.IsReady Then
            GetSubFolders objDrive.DriveLetter & ":"
        End If
    Next objDrive
End Sub

Для работы кода необходимо разместить его в том же модуле, что и код просмотра файлов в подпапках. Без него код просмотра дисков работать не будет, т.к. обращается к процедуре GetSubFolders(которая и приведена в коде перебора файлов в подпапках).
Скачать пример:

  Все файлы в папке и подпапках.xls (61,5 KiB, 8 202 скачиваний)

В примере код сканирует все диски и выводит в столбец А нового листа(лист создается автоматически) пути ко всем файлам.

Так же см.:
Как средствами VBA переименовать/переместить/скопировать файл
Как сменить формат сразу для нескольких файлов Excel
Как удалить папку или все файлы из папки через VBA
Собрать и просуммировать данные из разных файлов при помощи PowerQuery


Статья помогла? Поделись ссылкой с друзьями!

  Плейлист   Видеоуроки


Поиск по меткам



Access
apple watch
Multex
Power Query и Power BI
VBA управление кодами
Бесплатные надстройки
Дата и время
Записки
ИП
Надстройки
Печать
Политика Конфиденциальности
Почта
Программы
Работа с приложениями
Разработка приложений
Росстат
Тренинги и вебинары
Финансовые
Форматирование
Функции Excel
акции MulTEx
ссылки
статистика

«Сборка» данных в новую книгу из файлов в папке без открытия исходных

Автор Виктория Зуева, 25.06.2009, 12:17

« назад — далее »

Пример:
Есть две папки — «1квартал» и «2квартал» на диске D:Отчеты2009.
Папки содержат файлы Excel — ежемесячные отчеты от отделов (в каждой папке около 70 штук). Имена файлов в папках одинаковые (Отдел 1.xls, Отдел 2.xls и т.д.) 
Файлы имеют похожую структуру — на 1-м (единственном) листе таблица, шапка таблицы у всех одинаковая (в 3-й строке), а вот строка итогов «прыгает» в зависимости от содержимого от 15 до 60 строки
( в D:Отчеты20091кварталОтдел 1.xls   итоговая строка — 25,
а в D:Отчеты20092кварталОтдел 1.xls   итоговая строка — 53).

В папке «1квартал» был создан файл Excel — Отчет 1квартал.xls , в который «ручками» были вставлены в ячейки строк  ссылки — на ячейки других книг папки «1квартал»,  т.е. на соответствующие итоговые значения из файлов отчетов по отделам.
Например, ссылка в файле «Отчет 1квартал.xls» выглядит следующим образом (при закрытом файле Отдел 1.xls):
=’D:Отчеты20091квартал[Отдел 1.xls]Лист1′!$D$25

Проблемы и вопросы:
Пока файл «Отчет 1квартал.xls» лежит в папке D:Отчеты20091квартал, все связи нормально работают. Если папка «1 квартал» со всем содержимым перемещается на другой диск, связи в  файле «Отчет 1квартал.xls» приходится отключать… иначе =#Н/Д.
1) Можно ли макросом определять текущее местонахождение отчетного файла на диске и менять в нем адреса ссылок на исходные файлы с тем же именем, но из текущей папки?
2) Что-бы придумать, чтоб для папки «2квартал» в файл «Отчет 2квартал.xls» итоговые данные по отделам «собирать» не ручками?


начну с конца :)

Цитата: Виктория Зуева от 25.06.2009, 12:17
2) Что-бы придумать, чтоб для папки «2квартал» в файл «Отчет 2квартал.xls» итоговые данные по отделам «собирать» не ручками?

в итоговой строке в одной и той же колонке я бы написал одинаковый для всех файлов текст  типа «Общий итог»
тогда поиск номера итоговой стоки можно сделать так:
    Do: iRow = iRow + 1
    Loop Until Cells(iRow, [номер столбца]) = «Общий итог»

на выходе  iRow будет = номеру искомой строки

Ничто не обходится нам так дешево и не ценится так дорого, как вежливость…  Мигель Сервантес де Сааведра


Ячейка с текстом «Итого по отделу» присутствует во 2 столбце почти внизу каждого «Отчета». Ниже еще есть непустые строки. Я вот про ВПР думала по этому поводу.
А вот что делать с этим iRow? Его в модуль «отдела» или «отчета» прикручивать?  ???


это в модуль отчета для сбора инфы с разных файлов


Sub Reports()
Dim File  As Variant
Dim UserFile  As Variant
Dim iRow As Integer
Dim iRowRep As Integer
Dim i As Integer
Dim j As Integer

File = Array(file1, file2, file3, file4, file5, file6, file7, file8, file9, "и т.д.")
iRowRep = 5

    For i = LBound(File) To UBound(File)

        UserFile = File(i) & ".xls"
'можно сформировать имя файла и по другому
'    For i = 1 To [последний отдел]
'        UserFile = "Отдел " & i & ".xls"
'    Next i

        With Workbooks(UserFile).Sheets(1)
iRow = 0 'или следующая после "шапки"
            Do: iRow = iRow + 1
            Loop Until .Cells(iRow, 2) = "Итого по отделу"

                                For j = 1 To [последний столбец]
                Cells(iRowRep, j) = .Cells(iRow, j)
            Next j

            End With
        iRowRep = iRowRep + 1
    Next i

End Sub

P.S. Если будут сложности,  — выложите файлы-образцы

Ничто не обходится нам так дешево и не ценится так дорого, как вежливость…  Мигель Сервантес де Сааведра


Я такие вещи делаю неизменяемым файлом без макросов, который после автозаполнения сохраняю в нужную папку.
Файл «Отчет» в папке «Отчеты2009». Он един для всех кварталов.
Порядок действий:
1) открыть все файлы в папке «nквартал» (n — номер квартала),
2) открыть файл «Отчет»,
3) закрыть все файлы папки «nквартал».
В файле «Отчет» останутся все данные за квартал n.
Пункты 1 и 2 можно поменять местами.
Если случайно открыты файлы из разных папок (например 1квартал — отдел 1 и 2квартал — отдел 2), то в ячейке А1 — красная ругань, если все файлы из одной папки, то в А1 — № квартала.
Работает для 100 файлов, но можно увеличить.
ВПР в строке 5 нужно подогнать под родные файлы «отдел m» (вместо 2 поставить номер своего столбца с данными и изменить массив для поиска).

Скажи мне, кудесник, любимец ба’гов…

Яндекс-деньги: 41001632713405
Webmoney: R289877159277; Z102172301748; E177867141995


Виктория, посмотрите, это то?

Ничто не обходится нам так дешево и не ценится так дорого, как вежливость…  Мигель Сервантес де Сааведра


Boroda, спасибо за ваш пример — взяла себе в «копилку идей»! Но хочется сделать через макрос.
Вариант boa подошел в этом случае куда лучше. +1
Одно НО — оба варианта требуют открытия исходных файлов.
Может, есть вариант без открытия исходников решить задачу, или с поочередным открытием штук по 10-15-20?


Ничто не обходится нам так дешево и не ценится так дорого, как вежливость…  Мигель Сервантес де Сааведра



А вы можете еще раз уточнить, Вы частично решили для себя задачу ии нет?
Вот способ скрыть от пользовательских глаз открываемые макросом Excel-книги.
Основной смысл — это создание в макросе нового Excel приложения и изменение его свойста visible в false
Что не понятно — разъясню ;)

Sub


Sub OpenFiles()

Set myWb = ThisWorkbook ' Текущая книга, из которой запускаем макрос
Dim NewApp As New Excel.Application 'Новое Excel приложение, которое будет не видимым
Dim OpenBook As Workbook ' Открываемая не видимая книга
Dim FileDir As String 'Директория, в которой лежат открываемые файлы
Dim FileMask As String ' Маска фалов, которые открываем
Dim OpenFileName As String ' Наименование файла в директории

' Задаем директорию, в которой лежат файлы. Если она равна директории текущей книги,
' то можно задать FileDir = myWb.Path
FileDir = "c:local_cc"
' Задаем маску файлов
FileMask = "*.xls"

NewApp.Visible = False ' Собственно делаем невидимым приложение, в котором будем открывать книги

' корректировка переменной с директорией, если та не содержит косую черту в конце
If Right(FileDir, 1) <> "" Then
   FileDir = FileDir & ""
End If

'Считываем наименование первого файла в папке
OpenFileName = Dir(FileDir & FileMask)
Do While OpenFileName <> "" ' Считываем наименования фалов в директории
   If FileDir & OpenFileName <> myWb.FullName Then ' Исключаем случай повторного открытия Главной книги
      NewApp.Workbooks.Open FileName:=FileDir & OpenFileName ' Открываем книгу
      Set OpenBook = NewApp.ActiveWorkbook ' Запоминаем ссылку на открытую книгу
      myWb.Activate ' Делаем Активной Главную книгу

            ' Делаем то, что нам нужно. К Главной книге обращаемся как к myWb, к открытой для считывания как к OpenBook
      Debug.Print OpenFileName ' Для отладки. Выводит имена открываемых файлов в immediate окно VBA. В Рабочем варианте закомментировать

                  OpenBook.Close ' Закончили обработку текущей книги. Закрывам книгу
   End If
   OpenFileName = Dir ' Считываем наименование следующего файла в директории
Loop

NewApp.Quit 'закрываем не видимое приложение

End Sub


Виктория, вот файл, который будет работать с закрытыми книгами
Он их сам откроет и сам закроет. Время работы макроса, конечно, сильно возрастает, но думаю Вы сами сделаете для себя выбор.

P.S. Извините, что заставил себя ждать. Некогда было «голову поднять»
P.P.S. За ссылки спасибо, интересны, но опять же, работают по принципу «Открыл файл-Прочитал инфу-Закрыл». Нашел по Вашим ссылкам интересную инфу  Copy a range from closed workbooks (ADO)
, но разбираться пока не нашлось времени. Возможно, после изучения данного метода смогу модернизировать Ваш код.

Ничто не обходится нам так дешево и не ценится так дорого, как вежливость…  Мигель Сервантес де Сааведра


Цитата: boa от 08.07.2009, 18:44
… вот файл, который будет работать с закрытыми книгами
Он их сам откроет и сам закроет.

Макрос работать будет ;), но …
Открывая книги, делает их доступными для глаза и для внешнего вмешательства.
ИМХО в случае длительных запросов просто нельзя будет на компе заниматься другими делами. Если Excel-книга будет постоянно терять фокус, выполнение макроса может вылетать с ошибками.
ИМХО все-таки нужно открывать книги (из которых считываются данные) в новом невидимом application:


Sub ...
...
Dim NewApp As New Excel.Application 'Новое Excel приложение, которое будет не видимым
...
NewApp.Visible = False ' Собственно делаем невидимым приложение, в котором будем открывать книги
...
NewApp.Workbooks.Open FileName:=FileDir & OpenFileName ' Открываем книгу
...
NewApp.quit
End Sub

Относительно ADO. Это всего лишь способ доступа к данным. Он позволяет работать с таблицами Excel как с таблицами базы данных, с помощью SQL-запросов. ИМХО здесь не уместен, поскольку не требуется фильтровать строки и преобразовывать значения. Перебирать строки из Recordset придется точно также, как перебираются строки Excel-таблицы.


Цитата: zhal от 09.07.2009, 14:43
Открывая книги, делает их доступными для глаза и для внешнего вмешательства.

zhal, вот рабочая версия. Распакуйте архив во временную папку. Попробуйте во время выполнения макроса

посмотреть

или что-либо

изменить

в иных файлах кроме Отчета.

Цитата: zhal от 09.07.2009, 14:43ИМХО все-таки нужно открывать книги (из которых считываются данные) в новом невидимом application:

Возможно ИМХО изменится ;)

P.S. Только не надо хитрить и расставлять точки остановки макроса :)

Ничто не обходится нам так дешево и не ценится так дорого, как вежливость…  Мигель Сервантес де Сааведра


Цитата: zhal от 09.07.2009, 14:43
ИМХО все-таки нужно открывать книги (из которых считываются данные) в новом невидимом application:

Надо отдать должное открытие в скрытом окне достаточно действенный способ sm_clap +1 и может быть использован во многих ситуациях…

Ничто не обходится нам так дешево и не ценится так дорого, как вежливость…  Мигель Сервантес де Сааведра


Спасибо за предложенное решение!
«Прикручиваю» к своим корявым данным. Еще бы с форматом отчета потом справиться… Есть еще
вопрос
если еще из файла Отдела в Отчет надо «вытащить» значение именованной ячейки (имя — kod_otd), которую добавили в заголовок, то как это сделать?
Ячейка — в 3-й строке.


Цитата: Виктория Зуева от 14.07.2009, 23:26
Еще бы с форматом отчета потом справиться…

воспользуйтесь макрорекодером, а потом в созданном макросе, как говорят скульпторы, уберите лишнее :)

Цитата: Виктория Зуева от 14.07.2009, 23:26
…из файла Отдела в Отчет надо «вытащить» значение именованной ячейки (имя — kod_otd), которую добавили в заголовок, то как это сделать?

после строки
               Rezultat(i, 1) = Left(FileOtdel, Len(FileOtdel) — 4) ‘обрезаем расширение названия файла
добавьте
               On Error Resume Next
               Rezultat(i, 1) = .Range(«kod_otd») & » » & Left(FileOtdel, Len(FileOtdel) — 4)

Ничто не обходится нам так дешево и не ценится так дорого, как вежливость…  Мигель Сервантес де Сааведра


Ругается Excel на строчку в макросе:

ReDim Rezultat(1 To i, 1 To 4)  'посчитав, создаем массив в который потом занесем все данные

Я поняла, что если код отдела надо в отдельную ячейку, то в массиве Rezultat надо увеличить размерность до (1 To i, 1 To 5) и далее с результатами справлюсь (я надеюсь  :) ).
И еще — в каждый отчет от отдела добавлен титульный лист с реквизитными данными по отделу, на нем же будет ячейка с именем kod_otd (Лист 1, имя листа «Титул»), а сама таблица теперь будет на листе 2 «Отчет».
Надо ли изменить следующую строку?

With Workbooks(FileOtdel).Sheets(1)
(я так понимаю, что надо…но как?)


Цитата: Виктория Зуева от 15.07.2009, 11:33
Ругается Excel на строчку в макросе:
ReDim Rezultat(1 To i, 1 To 4)  'посчитав, создаем массив в который потом занесем все данные
Я поняла, что если код отдела надо в отдельную ячейку, то в массиве Rezultat надо увеличить размерность до (1 To i, 1 To 5) и далее с результатами справлюсь (я надеюсь  :) ).

поняли правильно, но в прошлом примере, что бы не изменять размерность, я код отдела объединил с именем файла, хотя если у Вас есть реестр «код/название отдела», то тогда, конечно, лучше в отдельную ячейку, а потом, сопоставив, вывести красивое ИМЯ ОТДЕЛА.

Цитата: Виктория Зуева от 15.07.2009, 11:33
И еще — в каждый отчет от отдела добавлен титульный лист с реквизитными данными по отделу, на нем же будет ячейка с именем kod_otd (Лист 1, имя листа «Титул»), а сама таблица теперь будет на листе 2 «Отчет».
Надо ли изменить следующую строку?
With Workbooks(FileOtdel).Sheets(1)
(я так понимаю, что надо…но как?)

Да, и очень просто :)

With Workbooks(FileOtdel).Sheets("Отчет")
либо

With Workbooks(FileOtdel).Sheets("Титул")
соответственно.

на всяк.случ. прикрепляю архив

Ничто не обходится нам так дешево и не ценится так дорого, как вежливость…  Мигель Сервантес де Сааведра


Проблема!!!
В последнем макросе — newApplication в невидимом режиме открывается,

Dim newApp As New Excel.Application 'Новое Excel приложение
newApp.Visible = False

в него по очереди файлы загружаются, файлы «выгружаются» (т.е. закрываются),

newApp.Workbooks(FileOtdel).Close 'когда мы с файла "выжали все соки" - закрываем его
а вот для приложения команды закрытия нет… оно так и остается висеть, невидимое… ЧТО ДЕЛАТЬ?
Куда и что дописать?  ???
А то макрос три раза запустила — и 3 Excel-a «скрытые» повисли в памяти.


Эврика!
Нашла!!!

NewApp.Quit
после 2-го Loop надо вставить…
Закрыть чтобы «невидимое приложение»…


Да воздастся ищущему :)

Ничто не обходится нам так дешево и не ценится так дорого, как вежливость…  Мигель Сервантес де Сааведра


Как в этом коде отключить автопересчет для newApp? (привожу часть кода)

Dim newApp As New Excel.Application 'Новое приложение в невидимиом режиме
newApp.Visible = False

TimeStart = GetTickCount
Application.ScreenUpdating = 0 'Отключаем автообновление
Application.Calculation = xlManual
Application.EnableCancelKey = xlDisabled    ' Запрет прерывания макроса

v_Path = ThisWorkbook.Path & ""
FileOtdel = Dir(v_Path)
v_Mask = "XLS"

i = 0
   Do While FileOtdel <> ""
       If UCase(Right(FileOtdel, 3)) = v_Mask Then
           i = i + 1 ' здесь мы посчитаем сколько у нас файлов, соответствующих маске, в папке
       End If
       FileOtdel = Dir
   Loop

ReDim Rezultat(1 To i, 1 To 9) 'посчитав, создаем массив, в который потом занесем все данные

FileOtdel = Dir(v_Path)
i = 1
   Do While FileOtdel <> "" ' Запускаем цикл до тех пор пока в папке есть интересующие нас файлы
       If UCase(Right(FileOtdel, 3)) = v_Mask Then
'           MsgBox (v_iFileName)

               If Not FileOtdel = ThisWorkbook.Name Then
           newApp.Workbooks.Open Filename:=v_Path & FileOtdel 'открываем найденный файл

           With newApp.Workbooks(FileOtdel)


А то для каждого файла из папки «вываливается» запрос:


newApp.DisplayAlerts = False ‘Отключаем окна диалогов скрытого Excel

Ничто не обходится нам так дешево и не ценится так дорого, как вежливость…  Мигель Сервантес де Сааведра


  • Профессиональные приемы работы в Microsoft Excel

  • Обмен опытом

  • Microsoft Excel

  • «Сборка» данных в новую книгу из файлов в папке без открытия исходных

Понравилась статья? Поделить с друзьями:
  • Excel работа с таблицами с нуля
  • Excel работа с датами до 1900
  • Excel работа с данными суммесли
  • Excel работа с данными сумма
  • Excel работа с данными отношения