Получение списка файлов в указанной папке с помощью кода VBA Excel. Коллекция Files объекта Folder, возвращенного методом FileSystemObject.GetFolder.
Коллекция Files объекта Folder
Для получения списка файлов в указанной папке используется свойство Files
объекта Folder
. Объект Folder
в VBA Excel возвращается методом GetFolder
объекта FileSystemObject по полному имени папки в качестве аргумента.
Если в указанной папке нет файлов, применение свойства Folder.Files
приведет к возникновению ошибки. Для корректного завершения программы используйте обработчик ошибок или условие, проверяющее наличие файлов в папке.
Получение списка файлов в папке
Пример 1
Код VBA Excel для получения списка файлов в указанной папке и записи полных имен файлов в массив (с поздней привязкой объектов к переменным):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
Sub Primer1() Dim fso, myPath, myFolder, myFile, myFiles(), i ‘Записываем в переменную myPath полное имя папки myPath = «C:DATAТекущая папка» ‘Создаем новый экземпляр FileSystemObject Set fso = CreateObject(«Scripting.FileSystemObject») ‘Присваиваем переменной myFolder ссылку на объект Folder Set myFolder = fso.GetFolder(myPath) ‘Проверяем, есть ли файлы в папке myFolder If myFolder.Files.Count = 0 Then MsgBox «В папке «» & myPath & «» файлов нет» Exit Sub End If ‘Задаем массиву размерность ReDim myFiles(1 To myFolder.Files.Count) ‘Загружаем в массив полные имена файлов For Each myFile In myFolder.Files i = i + 1 myFiles(i) = myFile.Path Next ‘Просматриваем первый элемент массива MsgBox myFiles(1) End Sub |
Используемые переменные:
- fso – ссылка на экземпляр объекта FileSystemObject;
- myPath – полное имя папки;
- myFolder – ссылка на объект Folder (папка);
- myFile – ссылка на один объект File из коллекции myFolder.Files;
- myFiles() – массив для записи имен файлов;
- i – счетчик элементов массива.
Пример 2
Получение списка файлов в указанной папке и запись имен файлов в ячейки первого столбца рабочего листа Excel (с ранней привязкой объектов к переменным):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Sub Primer2() Dim myPath, myFolder As Folder, myFile As File, i ‘Записываем в переменную myPath полное имя папки myPath = «C:DATAТекущая папка» ‘Создаем новый экземпляр FileSystemObject Dim fso As New FileSystemObject ‘Присваиваем переменной myFolder ссылку на объект Folder Set myFolder = fso.GetFolder(myPath) ‘Проверяем, есть ли файлы в папке myFolder If myFolder.Files.Count = 0 Then MsgBox «В папке «» & myPath & «» файлов нет» Exit Sub End If ‘Записываем имена файлов в первый столбец активного листа For Each myFile In myFolder.Files i = i + 1 Cells(i, 1) = myFile.Name Next End Sub |
Ранняя привязка позволяет использовать подсказки свойств и методов объектов при написании кода VBA Excel.
Как получить список папок до 3 уровней вложенности, смотрите в статье VBA Excel. Список папок.
Фразы для контекстного поиска: обход файлов.
Функция FilenamesCollection предназначена для получения списка файлов из папки, с учётом выбранной глубины поиска в подпапках.
Используется рекурсивный перебор папок, до заданного уровня вложенности.
В процессе перебора папок, пути у найденным файлам помещаются в коллекцию (объект типа Collection) для последующего перебора.
К статье прикреплено 2 примера файла с макросами на основе этой функции:
- Пример в файле FilenamesCollection.xls выводит список файлов на чистый лист новой книги (формируя заголовки)
- Пример в файле FilenamesCollectionEx.xls более функционален — он, помимо списка файлов из папки, отображает размер файла, и дату его создания, а также формирует в ячейках гиперссылки на найденные файлы.
Вывод списка производится на лист запуска, параметры поиска файлов задаются в ячейках листа (см. скриншот)
Смотрите также расширенную версию макроса на базе этой функции:
Макрос FolderStructure выводит в таблицу Excel список файлов и подпапок с отображением структуры (вложенности файлов и подпапок)
ПРИМЕЧАНИЕ: Если вы выводите на лист список имен файлов картинок (изображений), то при помощи этой надстройки вы сможете вставить сами картинки в ячейки соседнего столбца (или в примечания к этим ячейкам)
Внимание: если требуется, чтобы поиск не зависел от регистра символов в маске файла
(к примеру, обнаруживались не только файлы .txt, но и .TXT и .Txt),
поставьте первой строкой в модуле директиву Option Compare Text
Function FilenamesCollection(ByVal FolderPath As String, Optional ByVal Mask As String = "", _ Optional ByVal SearchDeep As Long = 999) As Collection ' © EducatedFool excelvba.ru/code/FilenamesCollection ' Получает в качестве параметра путь к папке FolderPath, ' маску имени искомых файлов Mask (будут отобраны только файлы с такой маской/расширением) ' и глубину поиска SearchDeep в подпапках (если SearchDeep=1, то подпапки не просматриваются). ' Возвращает коллекцию, содержащую полные пути найденных файлов ' (применяется рекурсивный вызов процедуры GetAllFileNamesUsingFSO) Set FilenamesCollection = New Collection ' создаём пустую коллекцию Set FSO = CreateObject("Scripting.FileSystemObject") ' создаём экземпляр FileSystemObject GetAllFileNamesUsingFSO FolderPath, Mask, FSO, FilenamesCollection, SearchDeep ' поиск Set FSO = Nothing: Application.StatusBar = False ' очистка строки состояния Excel End Function Function GetAllFileNamesUsingFSO(ByVal FolderPath As String, ByVal Mask As String, ByRef FSO, _ ByRef FileNamesColl As Collection, ByVal SearchDeep As Long) ' перебирает все файлы и подпапки в папке FolderPath, используя объект FSO ' перебор папок осуществляется в том случае, если SearchDeep > 1 ' добавляет пути найденных файлов в коллекцию FileNamesColl On Error Resume Next: Set curfold = FSO.GetFolder(FolderPath) If Not curfold Is Nothing Then ' если удалось получить доступ к папке ' раскомментируйте эту строку для вывода пути к просматриваемой ' в текущий момент папке в строку состояния Excel ' Application.StatusBar = "Поиск в папке: " & FolderPath For Each fil In curfold.Files ' перебираем все файлы в папке FolderPath If fil.Name Like "*" & Mask Then FileNamesColl.Add fil.Path Next SearchDeep = SearchDeep - 1 ' уменьшаем глубину поиска в подпапках If SearchDeep Then ' если надо искать глубже For Each sfol In curfold.SubFolders ' перебираем все подпапки в папке FolderPath GetAllFileNamesUsingFSO sfol.Path, Mask, FSO, FileNamesColl, SearchDeep Next End If Set fil = Nothing: Set curfold = Nothing ' очищаем переменные End If End Function
‘ Пример использования функции в макросе:
Sub ОбработкаФайловИзПапки() On Error Resume Next Dim folder$, coll As Collection folder$ = ThisWorkbook.Path & "Платежи" If Dir(folder$, vbDirectory) = "" Then MsgBox "Не найдена папка «" & folder$ & "»", vbCritical, "Нет папки ПЛАТЕЖИ" Exit Sub ' выход, если папка не найдена End If Set coll = FilenamesCollection(folder$, "*.xls") ' получаем список файлов XLS из папки If coll.Count = 0 Then MsgBox "В папке «" & Split(folder$, "")(UBound(Split(folder$, "")) - 1) & "» нет ни одного подходящего файла!", _ vbCritical, "Файлы для обработки не найдены" Exit Sub ' выход, если нет файлов End If ' перебираем все найденные файлы For Each file In coll Debug.Print file ' выводим имя файла в окно Immediate Next End Sub
Этот код позволяет осуществить поиск нужных файлов в выбранной папке (включая подпапки), и выводит полученный список файлов на лист книги Excel:
Sub ПримерИспользованияФункции_FilenamesCollection() ' Ищем на рабочем столе все файлы TXT, и выводим на лист список их имён. ' Просматриваются папки с глубиной вложения не более трёх. Dim coll As Collection, ПутьКПапке As String ' получаем путь к папке РАБОЧИЙ СТОЛ ПутьКПапке = CreateObject("WScript.Shell").SpecialFolders("Desktop") ' считываем в колекцию coll нужные имена файлов Set coll = FilenamesCollection(ПутьКПапке, ".txt", 3) Application.ScreenUpdating = False ' отключаем обновление экрана ' создаём новую книгу Dim sh As Worksheet: Set sh = Workbooks.Add.Worksheets(1) ' формируем заголовки таблицы With sh.Range("a1").Resize(, 3) .Value = Array("№", "Имя файла", "Полный путь") .Font.Bold = True: .Interior.ColorIndex = 17 End With ' выводим результаты на лист For i = 1 To coll.Count ' перебираем все элементы коллекции, содержащей пути к файлам sh.Range("a" & sh.Rows.Count).End(xlUp).Offset(1).Resize(, 3).Value = _ Array(i, Dir(coll(i)), coll(i)) ' выводим на лист очередную строку DoEvents ' временно передаём управление ОС Next sh.Range("a:c").EntireColumn.AutoFit ' автоподбор ширины столбцов [a2].Activate: ActiveWindow.FreezePanes = True ' закрепляем первую строку листа End Sub
Ещё один пример использования:
Sub ЗагрузкаСпискаФайлов() ' Ищем файлы в заданной папке по заданной маске, ' и выводим на лист список их параметров. ' Просматриваются папки с заданной глубиной вложения. Dim coll As Collection, ПутьКПапке$, МаскаПоиска$, ГлубинаПоиска% ПутьКПапке$ = [c1] ' берём из ячейки c1 МаскаПоиска$ = [c2] ' берём из ячейки c2 ГлубинаПоиска% = Val([c3]) ' берём из ячейки c3 If ГлубинаПоиска% = 0 Then ГлубинаПоиска% = 999 ' без ограничения по глубине ' считываем в колекцию coll нужные имена файлов Set coll = FilenamesCollection(ПутьКПапке$, МаскаПоиска$, ГлубинаПоиска%) Application.ScreenUpdating = False ' отключаем обновление экрана ' выводим результаты (список файлов, и их характеристик) на лист For i = 1 To coll.Count ' перебираем все элементы коллекции, содержащей пути к файлам НомерФайла = i ПутьКФайлу = coll(i) ИмяФайла = Dir(ПутьКФайлу) ДатаСоздания = FileDateTime(ПутьКФайлу) РазмерФайла = FileLen(ПутьКФайлу) ' выводим на лист очередную строку Range("a" & Rows.Count).End(xlUp).Offset(1).Resize(, 5).Value = _ Array(НомерФайла, ИмяФайла, ПутьКФайлу, ДатаСоздания, РазмерФайла) ' если нужна гиперссылка на файл во втором столбце ActiveSheet.Hyperlinks.Add Range("b" & Rows.Count).End(xlUp), ПутьКФайлу, "", _ "Открыть файл" & vbNewLine & ИмяФайла DoEvents ' временно передаём управление ОС Next End Sub
PS: Найти подходящие имена файлов в коллекции можно при помощи следующей функции:
Function CollectionAutofilter(ByRef coll As Collection, ByVal filter$) As Collection ' Функция перебирает все элементы коллекции coll, ' оставляя лишь те, которые соответствуют маске filter$ (например, filter$="*некий текст*") ' Возвращает коллекцию, содержащую только подходящие элементы ' Если элементы не найдены - возвращается пустая коллекция (содержащая 0 элементов) On Error Resume Next: Set CollectionAutofilter = New Collection For Each Item In coll If Item Like filter$ Then CollectionAutofilter.Add Item Next End Function
- 301786 просмотров
Не получается применить макрос? Не удаётся изменить код под свои нужды?
Оформите заказ у нас на сайте, не забыв прикрепить примеры файлов, и описать, что и как должно работать.
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 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 |
Private Sub cmdCopy_Click() ' Выполняет копирование указанной папки со всем его содержимым с одного места ' на другое. Метод Copy идентичен операции, выполняемой с помощью ' FileSystemObject.CopyFolder. Однако обратите внимание на то, ' что данный метод дает возможность копирования нескольких папок. On Error Resume Next If fso.FolderExists("C:WindowsCursors") Then If fso.FolderExists("C:Documents and SettingsAll UsersДокументы") Then Dim fld, s Set fld = fso.GetFolder("C:WindowsCursors") Set s = fso.GetFolder("C:Documents and SettingsAll UsersДокументы") fld.Copy sFolder s.Copy sFolder MsgBox "Копирование завершено" Else MsgBox "Папки: ""C:WindowsCursors"" и ""C:Documents and SettingsAll UsersДокументы"" - не существуют" End If End If End Sub Private Sub cmdMove_Click() ' Перемещает указанную папку со всем содержимым с одного места на другое. ' Результаты использования метода Move для объектов Folder идентичны получаемым ' с помощью выражений FileSystemObject.MoveFolder. Однако следует отметить, ' что данный метод позволяет перемещать несколько папок. Dim fld If fso.FolderExists("C:FsoTestFsoMoveTest") Then Set fld = fso.GetFolder("C:FsoTestFsoMoveTest") fld.Move "C:" s.Move "C:" MsgBox "Папка перемещена" Else MsgBox "Папка C:FsoTestFsoMoveTest не существует" End If End Sub '********************************************************************************** '---------------------------------------------------------------------------------- 'Объект File '&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& Private Sub cmdFType_Click() ' Возвращает словесное описание о типе файла. If fso.FileExists("C:AUTOEXEC.BAT") Then Dim f, s Set f = fso.GetFile("C:AUTOEXEC.BAT") s = f.Name & " - " & f.Type MsgBox s Else MsgBox "Файл C:AUTOEXEC.BAT не существует" End If End Sub Private Sub cmdfDrive_Click() ' Возвращает символ того дисковода, на котором находится указанный файл. If fso.FileExists(sPath) Then Dim f, s Set f = fso.GetFile(sPath) s = f.Name & " находится на диске " & f.Drive MsgBox s Else MsgBox "Файл " & sPath & " не существует" End If End Sub Private Sub cmdFParentFolder_Click() ' Возвращает объект родительской папки(содержащей данный файл). If fso.FileExists(sPath) Then Dim f, s Set f = fso.GetFile(sPath) s = f.Name & " находится в папке " & f.ParentFolder MsgBox s Else MsgBox "Файл " & sPath & " не существует" End If End Sub Private Sub cmdFLastModified_Click() ' Возвращает дату и время последней модификации файла. If fso.FileExists(sPath) Then Dim f, message Set f = fso.GetFile(sPath) message = "Файл " & sPath & " был изменен: " & f.DateLastModified MsgBox message Else MsgBox "Файл " & sPath & " не существует" End If End Sub Private Sub cmdFDateCreated_Click() ' Возвращает дату и время создания указанного файла. If fso.FileExists(sPath) Then Dim f Set f = fso.GetFile(sPath) MsgBox "Файл " & sPath & " создан: " & f.DateCreated Else MsgBox "Файл " & sPath & " не существует" End If End Sub Private Sub cmdFLastAccessed_Click() ' Возвращает дату и время последнего доступа к указанному файлу. If fso.FileExists(sPath) Then Dim f, message Set f = fso.GetFile(sPath) message = "Файл " & sPath & " был открыт: " & f.DateLastAccessed MsgBox message Else MsgBox "Файл " & sPath & " не существует" End If End Sub Private Sub cmdFShortName_Click() ' Возвращает короткое имя без пути, используемое программами, для которых ' требуется имя, соответствующее применявшемуся ранее соглашению DOS 8.3. Dim f, s, a If Not fso.FolderExists(sFolder) Then fso.CreateFolder sFolder End If Set a = fso.CreateTextFile("C:TestFileSystemObject - FileShortName.txt", True) Set f = fso.GetFile("C:TestFileSystemObject - FileShortName.txt") s = "Короткое имя для " & f.Name s = s & " : " & f.ShortName MsgBox s End Sub Private Sub cmdFShortPath_Click() ' Возвращает короткий путь, используемый программами, для которых ' требуется задание пути, соответствующее применявшемуся ранее соглашению DOS 8.3. Dim f, s, s1, a If Not fso.FolderExists(sFolder) Then fso.CreateFolder sFolder End If If Not fso.FolderExists("C:TestFileSystemObject - FileShortPath") Then fso.CreateFolder "C:TestFileSystemObject - FileShortPath" End If Set a = fso.CreateTextFile("C:TestFileSystemObject - FileShortPathTest.txt", True) Set f = fso.GetFile("C:TestFileSystemObject - FileShortPathTest.txt") s = "Короткий путь для " & f.Name s = s & ": " & vbCrLf s = s & f.ShortPath & vbCrLf & vbCrLf s1 = "Обычный путь для " & f.Name s1 = s1 & ": " & vbCrLf s1 = s1 & "C:TestFileSystemObject - FileShortPathTest.txt" MsgBox s & s1 End Sub Private Sub cmdFAttributes_Click() ' Устанавливает или возвращает атрибуты файла. ' Ключи: ' 0 - Normal (Обычный файл. Атрибуты не установлены. По умолчанию) ' 1 - ReadOnly (Только для чтения. Установлен атрибут чтение/запись) ' 2 - Hidden (Скрытый файл. Установлен атрибут чтение/запись) ' 4 - System (Системный файл. Установлен атрибут чтение/запись) ' 8 - Volume (Метка тома дискового накопителя. Установлен атрибут только для чтения) ' 16 - Directory (Папка или каталог. Установлен атрибут только для чтения) ' 32 - Archive (Файл был изменен после последнего резервирования. Установлен атрибут чтение/запись) ' 1024 - Alias (Ссылка или ярлык. Установлен атрибут только для чтения) ' 2048 - (Compressed Сжатый файл. Установлен атрибут только для чтения) Dim fld If Not fso.FileExists(sPath) Then MsgBox "Файл " & sPath & " не существует" Else Set fld = fso.GetFile(sPath) If fld.Attributes And 2 Then fld.Attributes = fld.Attributes - 2 MsgBox "Атрибут Скрытый для файла " & sPath & " - сброшен" Else fld.Attributes = fld.Attributes + 2 MsgBox "Атрибут Скрытый для файла " & sPath & " - установлен" End If End If ' Примечание: Остальные атрибуты устанавливаются по аналогии, т.е. вместо ' fld.Attributes = fld.Attributes + 2-2 нужно написать ' fld.Attributes = fld.Attributes + 1-1 (т.е. атрибут - Только для чтения) и т.д. End Sub Private Sub cmdFCopy_Click() ' Выполняет копирование указанного файла с одного места на другое. ' Примечание: в данном примере будет скопирован не сам файл autoexec.bat, а его ' содержимое и затем это содержимое будет скопировано в файл FsoTest.txt Dim f If fso.FileExists("C:autoexec.bat") Then Set f = fso.GetFile("C:autoexec.bat") f.Copy sPath MsgBox "Копирование завершено" Else MsgBox "Файл C:autoexec.bat не существует" End If End Sub Private Sub cmdFMove_Click() ' Перемещает указанный файл с одного места на другое. Dim f If fso.DriveExists("C") Then If Not fso.FolderExists(sFolder) Then fso.CreateFolder sFolder End If If Not fso.FileExists(sPath) Then MsgBox "Файл " & sPath & " не существует" Else Set f = fso.GetFile(sPath) f.Move "C:" MsgBox "В папку ""C:"" перемещен файл FsoTest.txt из папки " & sFolder End If Else MsgBox "Диск C: не существует" End If End Sub '&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& '---------------------------------------------------------------------------------- ' Объект TextStream '################################################################################## Private Sub cmdColumn_Click() ' Возвращает номер позиции текущего символа в текстовый файле. Const ForReading = 1, ForWriting = 2 If fso.FileExists(sPath) Then Dim ts, m Set ts = fso.OpenTextFile(sPath, ForWriting, True) ts.Write "Test string" ts.Close Set ts = fso.OpenTextFile(sPath, ForReading) m = ts.ReadLine MsgBox "Позиция текущего символа в файле " & sPath & " - " & ts.Column Else MsgBox "Файл " & sPath & " не существует" End If End Sub Private Sub cmdLine_Click() ' Возвращает текущий номер строки в текстовом файле. Const ForReading = 1, ForWriting = 2 If fso.FileExists(sPath) Then Dim ts, ra Set ts = fso.OpenTextFile(sPath, ForWriting, True) ts.Write "Тестовая строка." & vbCrLf & "Показывает пример использования свойства:" & _ vbCrLf & "Line" Set ts = fso.OpenTextFile(sPath, ForReading) ra = ts.ReadAll MsgBox "Текущий номер строки в файле " & sPath & " - " & ts.Line Else MsgBox "Файл " & sPath & " не существует" End If End Sub Private Sub cmdRead_Click() ' Читает указанное количество символов из текстового файла. If fso.FileExists(sPath) Then Dim ts Set ts = fso.OpenTextFile(sPath, ForReading) MsgBox "Первые 8 символов в файле " & sPath & " - " & vbCrLf & ts.Read(8) Else MsgBox "Файл " & sPath & " не существует" End If End Sub Private Sub cmdReadAll_Click() ' Считывает весь текстовый файл. If fso.FileExists(sPath) Then Dim ts Set ts = fso.OpenTextFile(sPath, ForReading) MsgBox "Содержимое файла " & sPath & " - " & vbCrLf & ts.ReadAll Else MsgBox "Файл " & sPath & " не существует" End If End Sub Private Sub cmdReadLine_Click() ' Читает полную строку. If fso.FileExists(sPath) Then Dim ts Set ts = fso.OpenTextFile(sPath, ForWriting, True) ts.WriteLine "Тестовая строка." ts.WriteLine "Показывает пример использования метода:" ts.WriteLine "ReadLine" ts.Close Set ts = fso.OpenTextFile(sPath, ForReading) MsgBox ts.ReadLine MsgBox ts.ReadLine MsgBox ts.ReadLine Else MsgBox "Файл " & sPath & " не существует" End If End Sub Private Sub cmdSkip_Click() ' Пропускает указанное число символов при чтении из текстового файла. If fso.FileExists(sPath) Then Dim ts Set ts = fso.OpenTextFile(sPath, ForWriting, True) ts.Write "Тестовая строка показывающая пример использование метода Scip" Set ts = fso.OpenTextFile(sPath, ForReading) ts.Skip (8) MsgBox ts.ReadLine & vbCrLf & "В файле " & sPath & " пропущено 8 первых символов." Else MsgBox "Файл " & sPath & " не существует" End If End Sub Private Sub cmdScipLine_Click() ' Пропускает следующую строку при чтении из текстовый файла. If fso.FileExists(sPath) Then Dim ts Set ts = fso.OpenTextFile(sPath, ForWriting, True) ts.Write "Тестовая строка." & vbCrLf & "Показывает пример использования метода: " & _ "ScipLine" Set ts = fso.OpenTextFile(sPath, ForReading) ts.SkipLine MsgBox ts.ReadLine & vbCrLf & "В файле " & sPath & " пропущена первая строка." Else MsgBox "Файл " & sPath & " не существует" End If End Sub Private Sub cmdWrite_Click() ' Записывает указанную строку в текстовый файл. If fso.FileExists(sPath) Then Dim ts Set ts = fso.OpenTextFile(sPath, ForWriting, True) ts.Write "Пример использования метода Write" ts.Close Set ts = fso.OpenTextFile(sPath, ForReading) MsgBox ts.ReadLine Else MsgBox "Файл " & sPath & " не существует" End If End Sub Private Sub cmdWriteLine_Click() ' Записывает в текстовый файл указанную строку и символ новой строки. If fso.FileExists(sPath) Then Dim ts Set ts = fso.OpenTextFile(sPath, ForWriting, True) ts.WriteLine "Тестовая строка." ts.WriteLine "Показывает пример использования метода:" ts.WriteLine "WriteLine" Set ts = fso.OpenTextFile(sPath, ForReading) MsgBox ts.ReadAll Else MsgBox "Файл " & sPath & " не существует" End If End Sub Private Sub cmdWriteBlankLines_Click() ' Записывает в текстовый файл указанное число пустых строк. If fso.FileExists(sPath) Then Dim ts Set ts = fso.OpenTextFile(sPath, ForWriting, True) ts.WriteBlankLines 6 ts.WriteLine "Тестовая строка." ts.WriteLine "Показывает пример использования метода:" ts.WriteLine "WriteBlankLines" Set ts = fso.OpenTextFile(sPath, ForReading) MsgBox ts.ReadAll Else MsgBox "Файл " & sPath & " не существует" End If End Sub '################################################################################## '---------------------------------------------------------------------------------- Private Sub cmdDriveExample_Click() frmDrive.Show End Sub Private Sub cmdFoFExample_Click() frmFoldrerFile.Show End Sub Private Sub lblInfo_Click(Index As Integer) If Index = 8 Then ShellExecute 0, vbNullString, _ "mailto:Axel.Coding@gmail.com?subject=FileSystemObject", vbNullString, _ vbNullString, SW_SHOWNORMAL End If End Sub |
Return to VBA Code Examples
In this tutorial, you will learn how to get names of all files in a folder and put them into a Worksheet.
Instead, if you want to learn how to check if a file exists, you can click on this link: VBA File Exists
Using the FileSystemObject to Get the List of Files in a Folder
VBA allows you to list all files from a folder, using the FileSystemObject.
We will show how to get a list of files in the folder C:VBA Folder and put it into the first column of the Worksheet. This folder consists of 5 files, as shown in Image 1:
Image 1. Files in folder C:VBA Folder
Here is the code:
Sub LoopThroughFiles ()
Dim oFSO As Object
Dim oFolder As Object
Dim oFile As Object
Dim i As Integer
Set oFSO = CreateObject("Scripting.FileSystemObject")
Set oFolder = oFSO.GetFolder("C:VBA Folder")
For Each oFile In oFolder.Files
Cells(i + 1, 1) = oFile.Name
i = i + 1
Next oFile
End Sub
In the example, first create an object of the class Scripting.FileSystemObject:
Set oFSO = CreateObject("Scripting.FileSystemObject")
Then set the folder using the method GetFolder:
Set oFolder = oFSO.GetFolder("C:VBA Folder")
Next loop through each file in oFolder, using oFile.Name to get the name of every file in the folder and write it in the next empty row:
For Each oFile In oFolder.Files
Cells(i + 1, 1) = oFile.Name
i = i + 1
Next oFile
Image 2. Worksheet with the list of files in the folder
As you can see in Image 2, all 5 files from the C:VBA Folder are listed in the first column.
VBA Coding Made Easy
Stop searching for VBA code online. Learn more about AutoMacro — A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!
Learn More!
Файлы к уроку:
- Для спонсоров Boosty
- Для спонсоров VK
- YouTube
- VK
Описание
Создадим макросы, которые выводят на листах Excel списки всех файлов в папке, папок и файлов внутри папок.
Решение
Список всех файлов внутри папки
' Перечень файлов внутри папки
Sub get_file_names()
Dim objFSO As Object ' В этой переменной будет объект FileSystemObject
Dim objFolder As Object ' В этой переменной будет объект Folder
' Получаем доступ к файловой системе компьютера
Set objFSO = CreateObject("Scripting.FileSystemObject")
' Создаем объект Folder
Set objFolder = objFSO.GetFolder("c:Userstimur.kryukovDownloadscomrade.excel ideasVBA. Практика. Список всех файлов в папкеDirectory")
' Строка для вывода
row = 2
' Цикл по каждому файлу в папке
For Each file In objFolder.Files
' Имя файла
Cells(row, 1) = file.Name
' Путь к папке
Cells(row, 2) = objFolder
' Переход на следующую строку
row = row + 1
Next file
' Автоподбор ширины
Columns("A").EntireColumn.AutoFit
End Sub
Список всех папок внутри папки
' Перечень папок внутри папки
Sub get_subfolder_names()
Dim objFSO As Object
Dim objFolder As Object
' Получаем доступ к файловой системе компьютера
Set objFSO = CreateObject("Scripting.FileSystemObject")
' Создаем объект Folder
Set objFolder = objFSO.GetFolder("c:Userstimur.kryukovDownloadscomrade.excel ideasVBA. Практика. Список всех файлов в папкеDirectory")
' Строка для вывода
row = 2
' Цикл по каждой папке в папке
For Each folder In objFolder.subfolders
' Вывод имени файла
Cells(row, 1) = folder.Name
' Путь к папке
Cells(row, 2) = folder.Path
' Переход на следующую строку
row = row + 1
Next folder
' Автоподбор ширины
Columns("A").EntireColumn.AutoFit
End Sub
Список всех файлов в папке, папок и файлов внутри папок
' Перечень папок и файлов внутри них
Sub get_subfolder_and_file_names()
Dim objFSO As Object
Dim objFolder As Object
' Получаем доступ к файловой системе компьютера
Set objFSO = CreateObject("Scripting.FileSystemObject")
' Создаем объект Folder
Set objFolder = objFSO.GetFolder("c:Userstimur.kryukovDownloadscomrade.excel ideasVBA. Практика. Список всех файлов в папкеDirectory")
' Строка для вывода
row = 2
' Цикл по каждой папке
For Each subfolder In objFolder.subfolders
' Цикл по каждому файлу
For Each file In subfolder.Files
' Имя папки
Cells(row, 1) = subfolder.Name
' Имя файла
Cells(row, 2) = file.Name
' Путь к файлу/папке
Cells(row, 3) = file.Path
' Переход на следующую строчку
row = row + 1
Next file
Next subfolder
For Each file In objFolder.Files
' Имя папки
Cells(row, 1) = objFolder.Name
' Имя файла
Cells(row, 2) = file.Name
' Путь к файлу
Cells(row, 3) = file.Path
' Переход на следующую строчку
row = row + 1
Next file
End Sub
Примененные функции
- .GetFolder
- Cells
- CreateObject
- For Each
- Scripting.FileSystemObject
The Dir function is the way to go, but the problem is that you cannot use the Dir
function recursively, as stated here, towards the bottom.
The way that I’ve handled this is to use the Dir
function to get all of the sub-folders for the target folder and load them into an array, then pass the array into a function that recurses.
Here’s a class that I wrote that accomplishes this, it includes the ability to search for filters. (You’ll have to forgive the Hungarian Notation, this was written when it was all the rage.)
Private m_asFilters() As String
Private m_asFiles As Variant
Private m_lNext As Long
Private m_lMax As Long
Public Function GetFileList(ByVal ParentDir As String, Optional ByVal sSearch As String, Optional ByVal Deep As Boolean = True) As Variant
m_lNext = 0
m_lMax = 0
ReDim m_asFiles(0)
If Len(sSearch) Then
m_asFilters() = Split(sSearch, "|")
Else
ReDim m_asFilters(0)
End If
If Deep Then
Call RecursiveAddFiles(ParentDir)
Else
Call AddFiles(ParentDir)
End If
If m_lNext Then
ReDim Preserve m_asFiles(m_lNext - 1)
GetFileList = m_asFiles
End If
End Function
Private Sub RecursiveAddFiles(ByVal ParentDir As String)
Dim asDirs() As String
Dim l As Long
On Error GoTo ErrRecursiveAddFiles
'Add the files in 'this' directory!
Call AddFiles(ParentDir)
ReDim asDirs(-1 To -1)
asDirs = GetDirList(ParentDir)
For l = 0 To UBound(asDirs)
Call RecursiveAddFiles(asDirs(l))
Next l
On Error GoTo 0
Exit Sub
ErrRecursiveAddFiles:
End Sub
Private Function GetDirList(ByVal ParentDir As String) As String()
Dim sDir As String
Dim asRet() As String
Dim l As Long
Dim lMax As Long
If Right(ParentDir, 1) <> "" Then
ParentDir = ParentDir & ""
End If
sDir = Dir(ParentDir, vbDirectory Or vbHidden Or vbSystem)
Do While Len(sDir)
If GetAttr(ParentDir & sDir) And vbDirectory Then
If Not (sDir = "." Or sDir = "..") Then
If l >= lMax Then
lMax = lMax + 10
ReDim Preserve asRet(lMax)
End If
asRet(l) = ParentDir & sDir
l = l + 1
End If
End If
sDir = Dir
Loop
If l Then
ReDim Preserve asRet(l - 1)
GetDirList = asRet()
End If
End Function
Private Sub AddFiles(ByVal ParentDir As String)
Dim sFile As String
Dim l As Long
If Right(ParentDir, 1) <> "" Then
ParentDir = ParentDir & ""
End If
For l = 0 To UBound(m_asFilters)
sFile = Dir(ParentDir & "" & m_asFilters(l), vbArchive Or vbHidden Or vbNormal Or vbReadOnly Or vbSystem)
Do While Len(sFile)
If Not (sFile = "." Or sFile = "..") Then
If m_lNext >= m_lMax Then
m_lMax = m_lMax + 100
ReDim Preserve m_asFiles(m_lMax)
End If
m_asFiles(m_lNext) = ParentDir & sFile
m_lNext = m_lNext + 1
End If
sFile = Dir
Loop
Next l
End Sub