Vba excel открыть все книги в папке

Хитрости »

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


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

Иногда необходимо проделать однотипные операции с несколькими файлами, расположенными в одной папке. Можно открывать каждый по очереди:
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
ссылки
статистика

Skip to content

Как открыть все рабочие книги в папке

На чтение 2 мин. Просмотров 3.5k.

Что делает макрос: Представьте, вы написали классный макрос, который автоматизирует работу одного Excel- файла. Теперь проблема заключается в том, что вам нужно перейти в папку, открыть каждую
книгу, запустить макрос, сохранить изменения, закрыть книгу, а затем открыть следующую.
Открытие каждой рабочей книги в папке, как правило, ручной процесс, который отнимает много времени.
Этот макрос решает проблему, как открыть все рабочие книги папки.

Содержание

  1. Как макрос работает
  2. Код макроса
  3. Как работает этот код
  4. Как использовать

Как макрос работает

В этом макросе, мы используем функцию Dir. Функция Dir возвращает строку, которая представляет собой имя файла. С её помощью в указанной папке мы возьмём имя каждого файла (с расширением “.xlsx”), затем будем открывать каждый файл, запускать макрос и, наконец, закрывать файл после сохранения.

Код макроса

Sub OtkritVseKnigi()
'Шаг 1:Объявляем переменные
Dim MyFiles As String
'Шаг 2: Укажите нужную папку
MyFiles = Dir("C:Temp*.xlsx")
Do While MyFiles <> “”
'Шаг 3: Открываем файлы один за другим
Workbooks.Open "C:Temp" & MyFiles
'Код макроса с действиями
MsgBox ActiveWorkbook.Name
ActiveWorkbook.Close SaveChanges:=True
'Шаг 4: Следующий файл в папке
MyFiles = Dir
Loop
End Sub

Как работает этот код

  1. Объявляем переменную MyFiles (тип строчный), которая будет фиксировать имя каждого файла.
  2. В шаге 2, макрос использует функцию DIR, чтобы указать Тип файла и адрес папки. Обратите внимание, что код ищет файлы в формате xlsx. Это означает, что только .xlsx файлы будут передаваться. Если вы ищете .xls файлы, вам необходимо изменить расширение.
  3. Открываем файл, делаем некоторые действия (вы должны поместить в код макроса требуемые действия), а затем мы сохраняем и закрываем файл. В этом простом примере, мы вызываем окно с сообщением, чтобы показать имя каждого файла.
  4. Ищем снова по кругу, чтобы найти больше файлов. Если нет файлов, переменная MyFiles пустая.
    Если это так, то цикл и макрос завершается.

Как использовать

Для реализации этого макроса, вы можете скопировать и вставить его в стандартный модуль:

  1. Активируйте редактор Visual Basic, нажав ALT + F11.
  2. Щелкните правой кнопкой мыши имя проекта / рабочей книги в окне проекта.
  3. Выберите Insert➜Module.
  4. Введите или вставьте код во вновь созданном модуле.

Сам отвечу на свой вопрос ))  

  Sub Open_Workbooks()  
Application.ScreenUpdating = False  
Application.Calculation = xlManual ‘xlCalculationManual  

   Const iPath$ = «C:Vedomosti2012tekushie» ‘Здесь необходимо указать нужную папку  

   If Dir(iPath$, vbDirectory) = «» Then  
  ‘проверку можно не использовать, если Вы уверены в наличии папки  
  ‘или если она выбрана с использованием диалогового окна  
  MsgBox «Странно, но указанная папка изволит отсутствовать», _  
  vbExclamation + vbSystemModal, «Ошибка пользователя !!!»  
  Exit Sub  
End If  

   iFileName$ = Dir(iPath$ & «*.xls»)  
Do While iFileName$ <> «»  
  If iFileName$ <> ThisWorkbook.Name Then  
     ‘проверку можно не использовать, если рабочая книга, в которой  
     ‘находится исполняемый код находится совсем в другой папке  
    With Workbooks.Open(Filename:=iPath$ & iFileName$)  
          ‘если эта книга всё же находится в указанной папке,  
          ‘то достаточно Workbooks.Open(FileName:=iFileName$)  
          ‘  
          ‘Здесь манипуляции с Вашей рабочей книгой  
          ‘.Close saveChanges:=True  
     End With  
   End If  
 iFileName$ = Dir  
Loop  
Application.ScreenUpdating = True  
Application.Calculation = xlAutomatic ‘xlCalculationAutomatic  
End Sub

nt_dmn

0 / 0 / 0

Регистрация: 28.04.2011

Сообщений: 60

1

Открытие по очереди всех файлов из каталога

04.10.2011, 17:07. Показов 26267. Ответов 7

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Здравствуйте, подскажите как правильно написать строку Application.Workbooks.Open («c:Âõîäÿùèå3.xls»), что бы в имени файла была переменная. В моем случае s
Суть в том что бы открыть все файлы из каталога по очереди.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Sub êîë_âõ()
 Dim s As String
 Dim n As Integer
 s = Dir("c:Âõîäÿùèå*.xls")
 Application.Workbooks.Open ("c:Âõîäÿùèå3.xls")
 n = 0
 Debug.Print s
 Do While s <> ""
   s = Dir
   n = n + 1
   Debug.Print s
   Application.Workbooks.Open ("c:Âõîäÿùèå3.xls")
 Loop
 Debug.Print n
End Sub



0



Казанский

15136 / 6410 / 1730

Регистрация: 24.09.2011

Сообщений: 9,999

04.10.2011, 17:35

2

Если номера идут по очереди, без пропусков, то так:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Sub кол_вх()
Dim s As String
Dim n As Integer
n = 0
Do
    s = "c:Входящие" & n & ".xls"
    Debug.Print s
    If Dir(s) = "" Then Exit Do
    With Workbooks.Open(s)
        'действия с книгой
        .Close
    End With
    n = n + 1
Loop
Debug.Print n
End Sub

Добавлено через 4 минуты
А лучше так

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Sub кол_вх()
Dim s As String
Dim n As Integer
For n = 0 To 9999
    s = "c:Входящие" & n & ".xls"
    Debug.Print s
    If Dir(s) = "" Then Exit For
    With Workbooks.Open(s)
        'действия с книгой
        .Close
    End With
Next
Debug.Print n
End Sub



2



0 / 0 / 0

Регистрация: 28.04.2011

Сообщений: 60

04.10.2011, 17:37

 [ТС]

3

Спасибо!
Но имена файлов будут не числовые, точнее могут быть какие угодно (там ФИО будет писаться)… поэтому и выбрал свой способ….



0



Казанский

15136 / 6410 / 1730

Регистрация: 24.09.2011

Сообщений: 9,999

04.10.2011, 18:00

4

Тогда еше проще.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Sub кол_вх()
Dim s As String, fldr As String
fldr = "c:Входящие"
s = Dir(fldr & "*.xls")
Do While s <> ""
    With Workbooks.Open(fldr & s)
        'действия с книгой
        .Close
    End With
    s = Dir
Loop
End Sub



1



nt_dmn

0 / 0 / 0

Регистрация: 28.04.2011

Сообщений: 60

04.10.2011, 19:03

 [ТС]

5

Сейчас попробую

Добавлено через 8 минут
Спасибо! Всё работает!
…я просто совсем новичок, точнее кроме школьного курса программирования ничего не было, а теперь прижало, надо сделать для уменьшения своих трудозатрат!
Спасибо что помогаете таким как мы

Добавлено через 46 минут
А ещё маленький вопросик:
как написать

Visual Basic
1
.Close

что бы документ закрывался без сохранения? Спасибо!



0



Казанский

15136 / 6410 / 1730

Регистрация: 24.09.2011

Сообщений: 9,999

04.10.2011, 21:39

6

Можно открыть файл для чтения (на всякий случай) и закрыть без сохранения:

Visual Basic
1
2
3
4
    With Workbooks.Open(fldr & s, Readonly:=True)
        'действия с книгой
        .Close 0
    End With

Добавлено через 4 минуты
Кстати, вот что: Dir отслеживает только первые 3 символа расширения. То есть по маске *.xls будут найдены файлы *.xlsx, *.xlsm. Иногда это полезно, иногда нет.



2



0 / 0 / 0

Регистрация: 28.04.2011

Сообщений: 60

05.10.2011, 10:19

 [ТС]

7

Спасибо огромное!



0



NikolayHAOS

-3 / 2 / 0

Регистрация: 29.10.2013

Сообщений: 178

08.10.2017, 11:02

8

Казанский,
А как измениться макрос если нужно открыть файлы по маске.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Sub кол_вх()
Dim s As String, fldr As String
fldr = "c:Входящие"
s = Dir(fldr & "*.xls")
Do While s <> ""
    With Workbooks.Open(fldr & s)
        'действия с книгой
        .Close
    End With
    s = Dir
Loop
End Sub

Нужно отрыть файлы содержащие в названии символ №
Запись s = Dir(fldr & «*№*.xls») не сработала.

Добавлено через 23 минуты
Использовал другой код.
Там работает и выбор каталога есть.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Sub Get_All_File_from_Folder()
    Dim sFolder As String, sFiles 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
    sFiles = Dir(sFolder & "*№*.xlsm")
    Do While sFiles <> ""
        'открываем книгу
        Workbooks.Open sFolder & sFiles
        'действия с файлом
        'Запишем на первый лист книги в ячейку А1 - www.excel-vba.ru
        ActiveWorkbook.Sheets(1).Range("A1").Value = "www.excel-vba.ru"
        'Закрываем книгу с сохранением изменений
        ActiveWorkbook.Close False 'если поставить False - книга будет закрыта без сохранения
        sFiles = Dir
    Loop
    'возвращаем ранее отключенное обновление экрана
    Application.ScreenUpdating = True
End Sub



0



В этой статье я представляю макрос для открытия всех книг из определенной папки.

Откройте все книги в папке с VBA

Перечислите все имена файлов одной конкретной папки с помощью Kutools for Excel хорошая идея3


Откройте все книги в папке с VBA

1. Нажмите Alt + F11 ключи для открытия Microsoft Visual Basic для приложений окно.

2. Нажмите Вставить > Модулии вставьте в скрипт приведенный ниже код.

VBA: открыть все файлы Excel в папке

Sub OpenFiles()
'UpdateByExtendoffice20160623
    Dim xStrPath As String
    Dim xFileDialog As FileDialog
    Dim xFile As String
    On Error Resume Next
    Set xFileDialog = Application.FileDialog(msoFileDialogFolderPicker)
    xFileDialog.AllowMultiSelect = False
    xFileDialog.Title = "Select a folder [Kutools for Excel]"
    If xFileDialog.Show = -1 Then
        xStrPath = xFileDialog.SelectedItems(1)
    End If
    If xStrPath = "" Then Exit Sub
    xFile = Dir(xStrPath & "*.xlsx")
    Do While xFile <> ""
        Workbooks.Open xStrPath & "" & xFile
        xFile = Dir
    Loop
End Sub

doc открывать файлы из папки 1

3. Нажмите F5 , появится диалоговое окно для выбора папки, в которой вы хотите открыть все книги в ней. Смотрите скриншот:
doc открывать файлы из папки 2

4. Нажмите OK, и все книги в конкретной папке были открыты.


Перечислите все имена файлов одной конкретной папки с помощью Kutools for Excel

За исключением открытия файлов в папке, пробовали ли вы когда-нибудь перечислить все имена файлов в одной конкретной папке? С участием Kutools for ExcelАвтора Список имен файлов Утилита, вы можете быстро перечислить все типы или один определенный тип файлов в одной папке.

После бесплатная установка Kutools for Excel, пожалуйста, сделайте следующее:

1. Нажмите Кутулс Плюс > Импорт Экспорт > Список имен файлов. Смотрите скриншот:
doc открывать файлы из папки 4

2. в Список имен файлов В диалоговом окне выберите папку, из которой вы хотите вывести список файлов, укажите тип файла, который вы хотите перечислить, а затем укажите единицы измерения размера файла, которые вам нужны. Если хотите, вы можете создать гиперссылки на имена файлов, которые будут перечислены. Смотрите скриншот:
doc открывать файлы из папки 5

3. Нажмите Ok, и все файлы в определенной папке были перечислены на новом листе активной книги. Смотрите скриншот:
doc открывать файлы из папки 6


Лучшие инструменты для работы в офисе

Kutools for Excel Решит большинство ваших проблем и повысит вашу производительность на 80%

  • Снова использовать: Быстро вставить сложные формулы, диаграммы и все, что вы использовали раньше; Зашифровать ячейки с паролем; Создать список рассылки и отправлять электронные письма …
  • Бар Супер Формулы (легко редактировать несколько строк текста и формул); Макет для чтения (легко читать и редактировать большое количество ячеек); Вставить в отфильтрованный диапазон
  • Объединить ячейки / строки / столбцы без потери данных; Разделить содержимое ячеек; Объединить повторяющиеся строки / столбцы… Предотвращение дублирования ячеек; Сравнить диапазоны
  • Выберите Дубликат или Уникальный Ряды; Выбрать пустые строки (все ячейки пустые); Супер находка и нечеткая находка во многих рабочих тетрадях; Случайный выбор …
  • Точная копия Несколько ячеек без изменения ссылки на формулу; Автоматическое создание ссылок на несколько листов; Вставить пули, Флажки и многое другое …
  • Извлечь текст, Добавить текст, Удалить по позиции, Удалить пробел; Создание и печать промежуточных итогов по страницам; Преобразование содержимого ячеек в комментарии
  • Суперфильтр (сохранять и применять схемы фильтров к другим листам); Расширенная сортировка по месяцам / неделям / дням, периодичности и др .; Специальный фильтр жирным, курсивом …
  • Комбинируйте книги и рабочие листы; Объединить таблицы на основе ключевых столбцов; Разделить данные на несколько листов; Пакетное преобразование xls, xlsx и PDF
  • Более 300 мощных функций. Поддерживает Office/Excel 2007-2021 и 365. Поддерживает все языки. Простое развертывание на вашем предприятии или в организации. Полнофункциональная 30-дневная бесплатная пробная версия. 60-дневная гарантия возврата денег.

вкладка kte 201905


Вкладка Office: интерфейс с вкладками в Office и упрощение работы

  • Включение редактирования и чтения с вкладками в Word, Excel, PowerPoint, Издатель, доступ, Visio и проект.
  • Открывайте и создавайте несколько документов на новых вкладках одного окна, а не в новых окнах.
  • Повышает вашу продуктивность на 50% и сокращает количество щелчков мышью на сотни каждый день!

офисный дно

Комментарии (0)


Оценок пока нет. Оцените первым!

Like this post? Please share to your friends:
  • Vba excel открыть word документ
  • Vba excel открыть chrome
  • Vba excel отключить пересчет формул
  • Vba excel отключить все сообщения
  • Vba excel отключить автофильтр