Как открыть все файлы в папке vba
Получение списка файлов в папке и подпапках
Функция 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
Как получить список файлов в Excel с помощью VBA
Специально для примера я создал папку, в которой разместил несколько файлов различных типов и две подпапки. Вот так они выглядят:
Давайте рассмотрим несколько способов получения списка файлов.
Способ 1. Использование функции Dir
Этот способ хорош тем, что в данном случае мы не подключаем дополнительных библиотек, а пользуемся только предустановленным функционалом. Способ подойдет, если вам необходимо просто получить список файлов в папке и не нужно выводить их размер, определять тип файла, дату его создания/изменения и т.п. Тут мы получаем только наименования файлов и больше ничего.
Вот там код данной функции, который выводит на лист 1 перечень файлов.
'************************************************************** ' Sub : ExampleOne ' Author : Алексей Желтов ' Date : 15.06.2020 ' Purpose : Вывод всех файлов в папке на лист '************************************************************** Sub ExampleOne() Dim Sh As Worksheet Dim Folder As String Dim FileName As String Dim i As Long Set Sh = ThisWorkbook.Sheets(1) Folder = Sh.Cells(3, 2) ' Проверка корректности введенных данных If PathExists(Folder) = False Then MsgBox "Указанной папки не существует", 16, "Ошибка исходных данных" Exit Sub End If ' Удаляем содержимое Sh.Rows("7:" & Sh.Range("A7").End(xlDown).Row).Delete Shift:=xlUp i = 7 FileName = Dir(Folder & "/", vbNormal) Do While FileName <> "" Sh.Cells(i, 1) = i - 6 Sh.Cells(i, 2) = FileName i = i + 1 ' переход к следующему файлу FileName = Dir Loop End Sub
Тут мы проверяем существование папки с помощью дополнительной функции. Опять таки не используем сторонних библиотек, а используем туже функцию Dir.
'************************************************************** ' Function : PathExists ' Author : Алексей Желтов ' Date : 15.06.2020 ' Purpose : Возвращает ИСТИНА если путь pname существует '************************************************************** Private Function PathExists(pname As String) As Boolean On Error Resume Next If Dir(pname, vbDirectory) = "" Then PathExists = False Else PathExists = (GetAttr(pname) And vbDirectory) = vbDirectory End If End Function
Вот так выглядит результат работы функции. Программа записала список файлов на текущий лист Excel.
Здесь мы не делали проверку на тип файла и вывели все файлы которые у нас были.
Если же необходимо отобрать только определенные типы файлов, например Excel файлы, то в нашем коде необходимо сделать дополнительную проверку:
Do While FileName <> "" If LCase(FileName) Like "*xls*" Then Sh.Cells(i, 1) = i - 6 Sh.Cells(i, 2) = FileName i = i + 1 End If ' переход к следующему файлу FileName = Dir Loop
Знак "*" означает любой набор символов. Таким образом, мы учли различные версии файлов Excel (xls, xlsx, xlsm).
Способ 2. Используем объект FileSystemObject
В данном случае мы будем не просто получать названия файлов, но также определять тип файла, получать его размер и дату создания. Для этого нам потребуется использовать объект FileSystemObject. Он предоставляет нам сведения о файловой системе компьютера.
Однако, чтобы начать его использовать придется подключить одну библиотеку. Не пугайтесь, она есть на всех компьютерах с Windows, потому скачивать ничего не придется. Чтобы подключить ее необходимо:
- Открыть пункт меню Tools и выбрать пункт References.
- Выбрать ссылку на библиотеку Microsoft Scripting Runtime.
- Нажать Ок.
Теперь перейдем к коду. Он немного упростился:
'************************************************************** ' Sub : ExampleTwo ' Author : Алексей Желтов ' Date : 15.06.2020 ' Purpose : Вывод всех файлов в папке на лист '************************************************************** Sub ExampleTwo() Dim Sh As Worksheet Dim FSO As New FileSystemObject Dim FolderPath As String Dim MyFolder As Folder Dim iFile As File Dim i As Long Set Sh = ThisWorkbook.Sheets(2) FolderPath = Sh.Cells(3, 2) ' Проверка корректности введенных данных If Not FSO.FolderExists(FolderPath) Then MsgBox "Указанной папки не существует", 16, "Ошибка исходных данных" Exit Sub End If ' Удаляем содержимое Sh.Rows("7:" & Sh.Range("A7").End(xlDown).Row).Delete Shift:=xlUp Set MyFolder = FSO.GetFolder(FolderPath) i = 7 For Each iFile In MyFolder.Files Sh.Cells(i, 1) = i - 6 Sh.Cells(i, 2) = iFile.Name Sh.Cells(i, 3) = iFile.Type Sh.Cells(i, 4) = iFile.DateCreated Sh.Cells(i, 5) = iFile.Size i = i + 1 Next End Sub
Обратите внимание на переменные. Переменная FSO - это новый экземпляр объекта FileSystemObject. Тут мы его объявляем и сразу создаем. Директива New очень важна, многие тут допускают ошибку. Также создаем объекты MyFolder и iFile - это тоже объекты FileSystemObject
Dim Sh As Worksheet Dim FSO As New FileSystemObject ' объявляем и создаем новый экземпляр объекта Dim FolderPath As String Dim MyFolder As Folder Dim iFile As File Dim i As Long
Далее делаем проверку на существование папки. В данном случае нам не нужна дополнительная функция , мы пользуемся методом FolderExists объекта (класса) FileSystemObject.
Ну и остается аналогично перебрать все файлы в директории. Тут удобно использовать цикл For Each - Next.
For Each iFile In MyFolder.Files Sh.Cells(i, 1) = i - 6 Sh.Cells(i, 2) = iFile.Name ' название файла Sh.Cells(i, 3) = iFile.Type ' тип файла Sh.Cells(i, 4) = iFile.DateCreated ' дата создания Sh.Cells(i, 5) = iFile.Size ' размер i = i + 1 Next
Результат работы программы следующий:
Способ 3. Создаем функцию, которая возвращает файлы в папке и подпапках
Напоследок разберем функцию, которая будет возвращать нам все файлы в текущей папке и во вложенных папках. Вообще это универсальная функция, которая подойдет на все случаи жизни. Смело копируйте ее в свой проект!
Итак перейдем к коду:
'************************************************************** ' Function : GetFiles ' Author : Алексей Желтов ' Date : 15.06.2020 ' Purpose : Получение файлов из папок и подпапок '************************************************************** Public Function GetFiles(ByVal Path As String, Optional ByVal Filter As String = "*", Optional ByVal Nesting As Long = 100) As Collection Dim MainFolder As Folder Dim iFolder As Folder Dim iFile As File Dim FSO As New FileSystemObject Dim MainColl As New Collection Dim iColl As Collection Dim spltFilter() As String Dim i As Long Set MainFolder = FSO.GetFolder(Path) If MainFolder Is Nothing Then Exit Function spltFilter = Split(Filter, ",") ' Перебираем файлы For Each iFile In MainFolder.Files ' Игнорируем временные файлы If InStr(1, iFile.Name, "~") = 0 Then ' Проверяем фильтры файлов For i = 0 To UBound(spltFilter) If LCase(iFile.Name) Like "*" & LCase(spltFilter(i)) Then MainColl.Add iFile, iFile.Path End If Next End If Next ' Перебираем вложенные папки If Nesting > 0 Then For Each iFolder In MainFolder.SubFolders ' рекурсивный вызов функции Set iColl = GetFiles(iFolder.Path, Filter, Nesting - 1) 'добавляем файлы из вложенных папок For i = 1 To iColl.Count MainColl.Add iColl(i), iColl(i).Path Next Next End If Set GetFiles = MainColl End Function
Разберем основные моменты этой функции. На вход она принимает один обязательный аргумент - это путь к папке Path. Также может принимать два необязательных параметра:
- Filter - перечисление списка файлов, которые мы хотим получить. Перечислять необходимо через запятую, например "doc, xls*". Вы можете использовать символ "*" чтобы включить сравнение по шаблону. По умолчанию фильтр отсутствует и возвращаются все типы файлов.
- Nesting - вложенность. Это максимальное число вложенных папок в которые "проваливается" алгоритм. По умолчанию равно 100.
В целом по алгоритму комментарии лишние, все должно быть понятно. Основной момент хочу обратить на строку 38.
For Each iFolder In MainFolder.SubFolders ' рекурсивный вызов функции Set iColl = GetFiles(iFolder.Path, Filter, Nesting - 1) 'добавляем файлы из вложенных папок For i = 1 To iColl.Count MainColl.Add iColl(i), iColl(i).Path Next Next
Тут мы рекурсивно вызываем эту же функцию. Т.е. получается что функция вызывает саму себя. И это происходит до тех пор пока либо не останется вложенных папок, либо не будет достигнут желаемый уровень вложенности.
Теперь когда наша функция готова, просто используем ее где нам требуется вот так:
'************************************************************** ' Sub : ExampleThree ' Author : Алексей Желтов ' Date : 15.06.2020 ' Purpose : Вывод всех файлов в папке на лист '************************************************************** Sub ExampleThree() Dim Sh As Worksheet Dim FolderPath As String Dim iFile As File Dim i As Long Dim Coll As Collection Dim FSO As New FileSystemObject Set Sh = ThisWorkbook.Sheets(3) FolderPath = Sh.Cells(3, 2) Set Coll = GetFiles(FolderPath) For i = 1 To Coll.Count Set iFile = Coll(i) Sh.Cells(i + 6, 1) = i Sh.Cells(i + 6, 2) = iFile.Name Sh.Cells(i + 6, 3) = FSO.GetFolder(iFile.ParentFolder).Name Sh.Cells(i + 6, 4) = iFile.Type Sh.Cells(i + 6, 5) = iFile.DateCreated Sh.Cells(i + 6, 6) = iFile.Size Next End Sub
Функция нам возвращает коллекцию файлов в папке и подпапках. Вот так:
Пример файлы можете скачать по кнопке ниже и использовать в своей работе. Оставляйте комментарии, буду рад на них ответить.
Скачать
Операции с файлами и каталогами - Visual Basic
- Чтение занимает 7 мин
В этой статье
В этом пошаговом руководстве приводятся основные сведения о файловом вводе-выводе в Visual Basic.This walkthrough provides an introduction to the fundamentals of file I/O in Visual Basic. В нем описывается создание небольшого приложения, перечисляющего текстовые файлы в каталоге и анализирующего их.It describes how to create a small application that lists and examines text files in a directory. Для каждого выбранного текстового файла приложение предоставляет атрибуты файла и первую строку содержимого.For each selected text file, the application provides file attributes and the first line of content. Кроме того, предоставляется возможность записать информацию в файл журнала.There is an option to write information to a log file.
В этом пошаговом руководстве используются члены My.Computer.FileSystem Object
, доступные в Visual Basic.This walkthrough uses members of the My.Computer.FileSystem Object
, which are available in Visual Basic. Дополнительные сведения см. в разделе FileSystem.See FileSystem for more information. В конце пошагового руководства приводится эквивалентный пример, в котором используются классы пространства имен System.IO.At the end of the walkthrough, an equivalent example is provided that uses classes from the System.IO namespace.
Примечание
Отображаемые на компьютере имена или расположения некоторых элементов пользовательского интерфейса Visual Studio могут отличаться от указанных в следующих инструкциях.Your computer might show different names or locations for some of the Visual Studio user interface elements in the following instructions. Это зависит от имеющегося выпуска Visual Studio и используемых параметров.The Visual Studio edition that you have and the settings that you use determine these elements. Дополнительные сведения см. в разделе Персонализация среды IDE.For more information, see Personalizing the IDE.
Создание проектаTo create the project
В меню Файл выберите пункт Создать проект.On the File menu, click New Project.
Откроется диалоговое окно Новый проект .The New Project dialog box appears.
В области Установленные шаблоны разверните узел Visual Basic и выберите элемент Windows.In the Installed Templates pane, expand Visual Basic, and then click Windows. В середине области Шаблоны щелкните Приложение Windows Forms.In the Templates pane in the middle, click Windows Forms Application.
В поле Имя введите
FileExplorer
, чтобы задать имя проекта, а затем нажмите кнопку ОК.In the Name box, typeFileExplorer
to set the project name, and then click OK.Visual Studio добавит проект в обозреватель решений, после чего откроется конструктор Windows Forms.Visual Studio adds the project to Solution Explorer, and the Windows Forms Designer opens.
Добавьте в форму элементы управления из приведенной ниже таблицы и установите для их свойств соответствующие значения.Add the controls in the following table to the form, and set the corresponding values for their properties.
Элемент управленияControl СвойствоProperty ЗначениеValue ListBoxListBox НазваниеName filesListBox
КнопкаButton НазваниеName ТекстText
browseButton
ОбзорBrowse
КнопкаButton НазваниеName ТекстText
examineButton
ИсследоватьExamine
CheckBoxCheckBox НазваниеName ТекстText
saveCheckBox
Сохранить результатыSave Results
FolderBrowserDialogFolderBrowserDialog НазваниеName FolderBrowserDialog1
Выбор папки и перечисление файлов в нейTo select a folder, and list files in a folder
Создайте обработчик событий нажатия
Click
для кнопкиbrowseButton
, дважды щелкнув этот элемент управления в форме.Create aClick
event handler forbrowseButton
by double-clicking the control on the form. Откроется редактор кода.The Code Editor opens.Добавьте следующий код в обработчик событий
Click
.Add the following code to theClick
event handler.If FolderBrowserDialog1.ShowDialog() = DialogResult.OK Then ' List files in the folder. ListFiles(FolderBrowserDialog1.SelectedPath) End If
Вызов
FolderBrowserDialog1.ShowDialog
открывает диалоговое окно Выбор папки.TheFolderBrowserDialog1.ShowDialog
call opens the Browse For Folder dialog box. Когда пользователь нажимает OK, свойство SelectedPath передается как аргумент методуListFiles
, который добавляется в следующем шаге.After the user clicks OK, the SelectedPath property is sent as an argument to theListFiles
method, which is added in the next step.Добавьте приведенный ниже метод
ListFiles
.Add the followingListFiles
method.Private Sub ListFiles(ByVal folderPath As String) filesListBox.Items.Clear() Dim fileNames = My.Computer.FileSystem.GetFiles( folderPath, FileIO.SearchOption.SearchTopLevelOnly, "*.txt") For Each fileName As String In fileNames filesListBox.Items.Add(fileName) Next End Sub
Этот код сперва очищает элемент ListBox.This code first clears the ListBox.
Затем метод GetFiles возвращает коллекцию строк — по одной для каждого файла в каталоге.The GetFiles method then retrieves a collection of strings, one for each file in the directory. Метод
GetFiles
принимает аргумент шаблона поиска, чтобы извлечь файлы, соответствующие определенному шаблону.TheGetFiles
method accepts a search pattern argument to retrieve files that match a particular pattern. В этом примере возвращаются только файлы с расширением TXT.In this example, only files that have the extension .txt are returned.Строки, возвращаемые методом
GetFiles
, затем добавляются в элемент управления ListBox.The strings that are returned by theGetFiles
method are then added to the ListBox.Запустите приложение.Run the application. Нажмите кнопку Обзор.Click the Browse button. В диалоговом окне Выбор папки перейдите в папку, содержащую TXT-файлы, выберите папку и нажмите кнопку ОК.In the Browse For Folder dialog box, browse to a folder that contains .txt files, and then select the folder and click OK.
Элемент
ListBox
содержит список TXT-файлов в выбранной папке.TheListBox
contains a list of .txt files in the selected folder.Остановите работу приложения.Stop running the application.
Получение атрибутов файла и содержимого текстового файлаTo obtain attributes of a file, and content from a text file
Создайте обработчик событий нажатия
Click
для кнопкиexamineButton
, дважды щелкнув этот элемент управления в форме.Create aClick
event handler forexamineButton
by double-clicking the control on the form.Добавьте следующий код в обработчик событий
Click
.Add the following code to theClick
event handler.If filesListBox.SelectedItem Is Nothing Then MessageBox.Show("Please select a file.") Exit Sub End If ' Obtain the file path from the list box selection. Dim filePath = filesListBox.SelectedItem.ToString ' Verify that the file was not removed since the ' Browse button was clicked. If My.Computer.FileSystem.FileExists(filePath) = False Then MessageBox.Show("File Not Found: " & filePath) Exit Sub End If ' Obtain file information in a string. Dim fileInfoText As String = GetTextForOutput(filePath) ' Show the file information. MessageBox.Show(fileInfoText)
Этот код проверяет, выбран ли элемент в элементе
ListBox
.The code verifies that an item is selected in theListBox
. Затем он получает запись пути к файлу из элементаListBox
.It then obtains the file path entry from theListBox
. Метод FileExists позволяет проверить, существует ли файл.The FileExists method is used to check whether the file still exists.Путь к файлу передается как аргумент методу
GetTextForOutput
, который добавляется в следующем шаге.The file path is sent as an argument to theGetTextForOutput
method, which is added in the next step. Этот метод возвращает строку, содержащую информацию о файле.This method returns a string that contains file information. Информация о файле отображается в элементе MessageBox.The file information appears in a MessageBox.Добавьте приведенный ниже метод
GetTextForOutput
.Add the followingGetTextForOutput
method.Private Function GetTextForOutput(ByVal filePath As String) As String ' Verify that the file exists. If My.Computer.FileSystem.FileExists(filePath) = False Then Throw New Exception("File Not Found: " & filePath) End If ' Create a new StringBuilder, which is used ' to efficiently build strings. Dim sb As New System.Text.StringBuilder() ' Obtain file information. Dim thisFile As System.IO.FileInfo = My.Computer.FileSystem.GetFileInfo(filePath) ' Add file attributes. sb.Append("File: " & thisFile.FullName) sb.Append(vbCrLf) sb.Append("Modified: " & thisFile.LastWriteTime.ToString) sb.Append(vbCrLf) sb.Append("Size: " & thisFile.Length.ToString & " bytes") sb.Append(vbCrLf) ' Open the text file. Dim sr As System.IO.StreamReader = My.Computer.FileSystem.OpenTextFileReader(filePath) ' Add the first line from the file. If sr.Peek() >= 0 Then sb.Append("First Line: " & sr.ReadLine()) End If sr.Close() Return sb.ToString End Function
Метод GetFileInfo используется в коде для получения параметров файла.The code uses the GetFileInfo method to obtain file parameters. Параметры файла добавляются в StringBuilder.The file parameters are added to a StringBuilder.
Метод OpenTextFileReader считывает содержимое файла в StreamReader.The OpenTextFileReader method reads the file contents into a StreamReader. Первая строка содержимого файла извлекается из
StreamReader
и добавляется вStringBuilder
.The first line of the contents is obtained from theStreamReader
and is added to theStringBuilder
.Запустите приложение.Run the application. Нажмите кнопку Обзор и перейдите в папку с TXT-файлами.Click Browse, and browse to a folder that contains .txt files. Нажмите кнопку ОК.Click OK.
Выберите файл в элементе
ListBox
и щелкните Исследовать.Select a file in theListBox
, and then click Examine. В окнеMessageBox
будет выведена информация о файле.AMessageBox
shows the file information.Остановите работу приложения.Stop running the application.
Добавление записи в журналTo add a log entry
В конец обработчика событий
examineButton_Click
добавьте приведенный ниже код.Add the following code to the end of theexamineButton_Click
event handler.If saveCheckBox.Checked = True Then ' Place the log file in the same folder as the examined file. Dim logFolder As String = My.Computer.FileSystem.GetFileInfo(filePath).DirectoryName Dim logFilePath = My.Computer.FileSystem.CombinePath(logFolder, "log.txt") Dim logText As String = "Logged: " & Date.Now.ToString & vbCrLf & fileInfoText & vbCrLf & vbCrLf ' Append text to the log file. My.Computer.FileSystem.WriteAllText(logFilePath, logText, append:=True) End If
Код задает путь к файлу журнала, чтобы файл журнала помещался в тот же каталог, где находится выбранный файл.The code sets the log file path to put the log file in the same directory as that of the selected file. Запись журнала должна содержать текущие дату и время, а далее информацию о файле.The text of the log entry is set to the current date and time followed by the file information.
Метод WriteAllText, которому передается аргумент
append
со значениемTrue
, используется для создания записи в журнале.The WriteAllText method, with theappend
argument set toTrue
, is used to create the log entry.Запустите приложение.Run the application. Перейдите к текстовому файлу, выберите его в элементе
ListBox
, установите флажок Сохранить результаты и щелкните Исследовать.Browse to a text file, select it in theListBox
, select the Save Results check box, and then click Examine. Проверьте, добавлена ли запись в файлlog.txt
.Verify that the log entry is written to thelog.txt
file.Остановите работу приложения.Stop running the application.
Использование текущего каталогаTo use the current directory
Создайте обработчик событий для события
Form1_Load
, дважды щелкнув форму.Create an event handler forForm1_Load
by double-clicking the form.Добавьте в обработчик событий приведенный ниже код.Add the following code to the event handler.
' Set the default directory of the folder browser to the current directory. FolderBrowserDialog1.SelectedPath = My.Computer.FileSystem.CurrentDirectory
Этот код задает текущий каталог в качестве каталога по умолчанию для обозревателя папок.This code sets the default directory of the folder browser to the current directory.
Запустите приложение.Run the application. При первом нажатии кнопки Обзор открывается диалоговое окно Выбор папки с текущим каталогом.When you click Browse the first time, the Browse For Folder dialog box opens to the current directory.
Остановите работу приложения.Stop running the application.
Выборочное включение элементов управленияTo selectively enable controls
Добавьте приведенный ниже метод
SetEnabled
.Add the followingSetEnabled
method.Private Sub SetEnabled() Dim anySelected As Boolean = (filesListBox.SelectedItem IsNot Nothing) examineButton.Enabled = anySelected saveCheckBox.Enabled = anySelected End Sub
Метод
SetEnabled
включает и отключает элементы управления в зависимости от того, выбран ли элемент в элементеListBox
.TheSetEnabled
method enables or disables controls depending on whether an item is selected in theListBox
.Создайте обработчик событий
SelectedIndexChanged
для элементаfilesListBox
, дважды щелкнув элемент управленияListBox
в форме.Create aSelectedIndexChanged
event handler forfilesListBox
by double-clicking theListBox
control on the form.Добавьте вызов метода
SetEnabled
в новый обработчик событийfilesListBox_SelectedIndexChanged
.Add a call toSetEnabled
in the newfilesListBox_SelectedIndexChanged
event handler.Добавьте вызов метода
SetEnabled
в конце обработчика событийbrowseButton_Click
.Add a call toSetEnabled
at the end of thebrowseButton_Click
event handler.Добавьте вызов метода
SetEnabled
в конце обработчика событийForm1_Load
.Add a call toSetEnabled
at the end of theForm1_Load
event handler.Запустите приложение.Run the application. Флажок Сохранить результаты и кнопка Исследовать отключены, если элемент не выбран в элементе
ListBox
.The Save Results check box and the Examine button are disabled if an item is not selected in theListBox
.
Полный пример с использованием My.Computer.FileSystemFull example using My.Computer.FileSystem
Ниже приведен полный пример.Following is the complete example.
' This example uses members of the My.Computer.FileSystem ' object, which are available in Visual Basic. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' Set the default directory of the folder browser to the current directory. FolderBrowserDialog1.SelectedPath = My.Computer.FileSystem.CurrentDirectory SetEnabled() End Sub Private Sub browseButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles browseButton.Click If FolderBrowserDialog1.ShowDialog() = DialogResult.OK Then ' List files in the folder. ListFiles(FolderBrowserDialog1.SelectedPath) End If SetEnabled() End Sub Private Sub ListFiles(ByVal folderPath As String) filesListBox.Items.Clear() Dim fileNames = My.Computer.FileSystem.GetFiles( folderPath, FileIO.SearchOption.SearchTopLevelOnly, "*.txt") For Each fileName As String In fileNames filesListBox.Items.Add(fileName) Next End Sub Private Sub examineButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles examineButton.Click If filesListBox.SelectedItem Is Nothing Then MessageBox.Show("Please select a file.") Exit Sub End If ' Obtain the file path from the list box selection. Dim filePath = filesListBox.SelectedItem.ToString ' Verify that the file was not removed since the ' Browse button was clicked. If My.Computer.FileSystem.FileExists(filePath) = False Then MessageBox.Show("File Not Found: " & filePath) Exit Sub End If ' Obtain file information in a string. Dim fileInfoText As String = GetTextForOutput(filePath) ' Show the file information. MessageBox.Show(fileInfoText) If saveCheckBox.Checked = True Then ' Place the log file in the same folder as the examined file. Dim logFolder As String = My.Computer.FileSystem.GetFileInfo(filePath).DirectoryName Dim logFilePath = My.Computer.FileSystem.CombinePath(logFolder, "log.txt") Dim logText As String = "Logged: " & Date.Now.ToString & vbCrLf & fileInfoText & vbCrLf & vbCrLf ' Append text to the log file. My.Computer.FileSystem.WriteAllText(logFilePath, logText, append:=True) End If End Sub Private Function GetTextForOutput(ByVal filePath As String) As String ' Verify that the file exists. If My.Computer.FileSystem.FileExists(filePath) = False Then Throw New Exception("File Not Found: " & filePath) End If ' Create a new StringBuilder, which is used ' to efficiently build strings. Dim sb As New System.Text.StringBuilder() ' Obtain file information. Dim thisFile As System.IO.FileInfo = My.Computer.FileSystem.GetFileInfo(filePath) ' Add file attributes. sb.Append("File: " & thisFile.FullName) sb.Append(vbCrLf) sb.Append("Modified: " & thisFile.LastWriteTime.ToString) sb.Append(vbCrLf) sb.Append("Size: " & thisFile.Length.ToString & " bytes") sb.Append(vbCrLf) ' Open the text file. Dim sr As System.IO.StreamReader = My.Computer.FileSystem.OpenTextFileReader(filePath) ' Add the first line from the file. If sr.Peek() >= 0 Then sb.Append("First Line: " & sr.ReadLine()) End If sr.Close() Return sb.ToString End Function Private Sub filesListBox_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles filesListBox.SelectedIndexChanged SetEnabled() End Sub Private Sub SetEnabled() Dim anySelected As Boolean = (filesListBox.SelectedItem IsNot Nothing) examineButton.Enabled = anySelected saveCheckBox.Enabled = anySelected End Sub
Полный пример с использованием System.IOFull example using System.IO
Следующий пример выполняет те же действия, используя классы из пространства имен System.IO вместо объектов My.Computer.FileSystem
.The following equivalent example uses classes from the System.IO namespace instead of using My.Computer.FileSystem
objects.
' This example uses classes from the System.IO namespace. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' Set the default directory of the folder browser to the current directory. FolderBrowserDialog1.SelectedPath = System.IO.Directory.GetCurrentDirectory() SetEnabled() End Sub Private Sub browseButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles browseButton.Click If FolderBrowserDialog1.ShowDialog() = DialogResult.OK Then ' List files in the folder. ListFiles(FolderBrowserDialog1.SelectedPath) SetEnabled() End If End Sub Private Sub ListFiles(ByVal folderPath As String) filesListBox.Items.Clear() Dim fileNames As String() = System.IO.Directory.GetFiles(folderPath, "*.txt", System.IO.SearchOption.TopDirectoryOnly) For Each fileName As String In fileNames filesListBox.Items.Add(fileName) Next End Sub Private Sub examineButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles examineButton.Click If filesListBox.SelectedItem Is Nothing Then MessageBox.Show("Please select a file.") Exit Sub End If ' Obtain the file path from the list box selection. Dim filePath = filesListBox.SelectedItem.ToString ' Verify that the file was not removed since the ' Browse button was clicked. If System.IO.File.Exists(filePath) = False Then MessageBox.Show("File Not Found: " & filePath) Exit Sub End If ' Obtain file information in a string. Dim fileInfoText As String = GetTextForOutput(filePath) ' Show the file information. MessageBox.Show(fileInfoText) If saveCheckBox.Checked = True Then ' Place the log file in the same folder as the examined file. Dim logFolder As String = System.IO.Path.GetDirectoryName(filePath) Dim logFilePath = System.IO.Path.Combine(logFolder, "log.txt") ' Append text to the log file. Dim logText As String = "Logged: " & Date.Now.ToString & vbCrLf & fileInfoText & vbCrLf & vbCrLf System.IO.File.AppendAllText(logFilePath, logText) End If End Sub Private Function GetTextForOutput(ByVal filePath As String) As String ' Verify that the file exists. If System.IO.File.Exists(filePath) = False Then Throw New Exception("File Not Found: " & filePath) End If ' Create a new StringBuilder, which is used ' to efficiently build strings. Dim sb As New System.Text.StringBuilder() ' Obtain file information. Dim thisFile As New System.IO.FileInfo(filePath) ' Add file attributes. sb.Append("File: " & thisFile.FullName) sb.Append(vbCrLf) sb.Append("Modified: " & thisFile.LastWriteTime.ToString) sb.Append(vbCrLf) sb.Append("Size: " & thisFile.Length.ToString & " bytes") sb.Append(vbCrLf) ' Open the text file. Dim sr As System.IO.StreamReader = System.IO.File.OpenText(filePath) ' Add the first line from the file. If sr.Peek() >= 0 Then sb.Append("First Line: " & sr.ReadLine()) End If sr.Close() Return sb.ToString End Function Private Sub filesListBox_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles filesListBox.SelectedIndexChanged SetEnabled() End Sub Private Sub SetEnabled() Dim anySelected As Boolean = (filesListBox.SelectedItem IsNot Nothing) examineButton.Enabled = anySelected saveCheckBox.Enabled = anySelected End Sub
См. также разделSee also
Решение: Прочитать все файлы в папке
Dim objFS, objItem, objFile, strPath, arrTemp, strTemp, intTemp, strList, i strPath = "d:\" Set objFS = CreateObject("Scripting.FileSystemObject") If objFS.FolderExists(strPath) Then For Each objItem In objFS.GetFolder(strPath).Files If LCase(Right(objItem.Name, 4)) = ".txt" Then Set objFile = objFS.OpenTextFile(objItem.Path, 1) arrTemp = Split(objFile.ReadAll, vbNewLine) objFile.Close For i = 0 To UBound(arrTemp) If Len(arrTemp(i)) > intTemp Then intTemp = Len(arrTemp(i)): strTemp = arrTemp(i) Next strList = strList & "Файл: " & objItem.Name & vbNewLine & _ "Макс. длина строки: " & CStr(intTemp) & vbNewLine & _ "Строка: " & strTemp & vbNewLine & "---" & vbNewLine intTemp = 0: strTemp = vbNullString End If Next Erase arrTemp: Set objFile = Nothing: Set objItem = Nothing WScript.Echo strList Else WScript.Echo "Не найден путь " & strPath End If Set objFS = Nothing WScript.Quit 0
Файловые функции VBA | Excel для всех
Файловые функции VBA | Excel для всех Главная » Функции VBA » 28 Апрель 2011 Дмитрий 78834 просмотров- CurDir() - функция, которая возвращает путь к каталогу(для указанного диска), в котором по умолчанию будут сохраняться файлы:
Dim sCurDir As String sCurDir = CurDir("D")
Dim sCurDir As String sCurDir = CurDir("D")
- Dir() — позволяет искать файл или каталог по указанному пути на диске. Пример использования можно посмотреть в статье: Просмотреть все файлы в папке
- EOF() — при операции записи в файл на диске эта функция вернет True, если вы находитесь в конце файла. Обычно используется при работе с текстовыми файлами — .txt. При сохранении книг Excel лучше использовать стандартные методы: Save и SaveAs.
- Error() - позволяет вернуть описание ошибки по ее номеру. Генерировать ошибку нужно при помощи метода RaiseError() специального объекта Er.
- Print - записывает в открытый файл указанный текст. Далее будет приведен пример использования данной функции
- FreeFile() — позволяет определить номер следующего свободного файла, который можно использовать как номер файла при его открытии методом Open. Предпочтительно применять именно этот метод определения номера файла(вместо статичного #1), чтобы не было неоднозначности обращения к файлам. Ниже приведены примеры применения данной функции при обращении к файлам
- FileAttr() — позволяет определить, как именно был открыт файл в файловой системе: на чтение, запись, добавление, в двоичном или текстовом режиме и т.п. Применяется для работы с текстовыми файлами, открытыми при помощи
Open "C:\Text1.txt" For [] As #1
Открыть файл можно несколькими способами, приведу примеры наиболее распространенных вариантов:- Input() — открывает текстовый файл на чтение. Т.е. таким методом можно открыть файл и вытянуть из него данные. Например, чтобы считать информацию из файла C:Text1.txt и вывести ее в окно Immediate можно применить такой код:
Dim MyChar Open "C:\Text1.txt" For Input As #1 'Открываем файл функцией Open() на чтение(Input) Do While Not EOF(1) 'пока файл не кончился ' Получаем по одному символу и добавляем его к предыдущим MyChar = MyChar & Input(1, #1) Loop Close #1 ' Закрываем файл 'Выводим его содержание в окно Immediate '(отобразить Immediate: Ctrl+G в окне редактора VBA) Debug.Print MyChar 'или в MsgBox MsgBox MyChar, vbInformation, "www.excel-vba.ru"
Dim MyChar Open "C:\Text1.txt" For Input As #1 'Открываем файл функцией Open() на чтение(Input) Do While Not EOF(1) 'пока файл не кончился ' Получаем по одному символу и добавляем его к предыдущим MyChar = MyChar & Input(1, #1) Loop Close #1 ' Закрываем файл 'Выводим его содержание в окно Immediate '(отобразить Immediate: Ctrl+G в окне редактора VBA) Debug.Print MyChar 'или в MsgBox MsgBox MyChar, vbInformation, "www.excel-vba.ru"
- Ouput() — метод открывает файл для записи. Например, чтобы записать в файл строку, содержащую все ячейки в выделенном диапазоне, можно использовать такой код:
Sub SelectionToTxt() Dim s As String, rc As Range Dim ff 'запоминаем все значения из выделенной строки в строку For Each rc In Selection If s = "" Then 'если пока ничего не записали - присваиваем только значение ячейки s = rc.Value Else 'если уже записано - добавляем через TAB s = s & vbTab & rc.Value End If Next ff = FreeFile 'Открываем текстовый файл 'если файла нет - он будет создан Open "C:\Text1.txt" For Output As #ff 'записываем значение строки в файл Print #ff, s Close #ff ' Закрываем файл End Sub
Sub SelectionToTxt() Dim s As String, rc As Range Dim ff 'запоминаем все значения из выделенной строки в строку For Each rc In Selection If s = "" Then 'если пока ничего не записали - присваиваем только значение ячейки s = rc.Value Else 'если уже записано - добавляем через TAB s = s & vbTab & rc.Value End If Next ff = FreeFile 'Открываем текстовый файл 'если файла нет - он будет создан Open "C:\Text1.txt" For Output As #ff 'записываем значение строки в файл Print #ff, s Close #ff ' Закрываем файл End Sub
Важно помнить, что при открытии файла таким методом(Output) все предыдущие данные из файла стираются и в файле будет записано только то, что мы записали в текущем сеансе. Если данные необходимо добавить к имеющимся - используется метод Append
- Append() — метод открывает файл для записи, но в отличии от Output записывает данные в конец файла, а не перезаписывает текущие данные. Например, код добавления выделенных ячеек как одной строки в имеющийся файл будет выглядеть так:
Sub SelectionToTxt_Add() Dim s As String, rc As Range Dim ff 'запоминаем все значения из выделенной строки в строку For Each rc In Selection If s = "" Then 'если пока ничего не записали - присваиваем только значение ячейки s = rc.Value Else 'если уже записано - добавляем через TAB s = s & vbTab & rc.Value End If Next ff = FreeFile 'Открываем текстовый файл 'если файла нет - он будет создан Open "C:\Text1.txt" For Append As #ff 'записываем значение строки в файл Print #ff, s Close #ff ' Закрываем файл End Sub
Sub SelectionToTxt_Add() Dim s As String, rc As Range Dim ff 'запоминаем все значения из выделенной строки в строку For Each rc In Selection If s = "" Then 'если пока ничего не записали - присваиваем только значение ячейки s = rc.Value Else 'если уже записано - добавляем через TAB s = s & vbTab & rc.Value End If Next ff = FreeFile 'Открываем текстовый файл 'если файла нет - он будет создан Open "C:\Text1.txt" For Append As #ff 'записываем значение строки в файл Print #ff, s Close #ff ' Закрываем файл End Sub
- Input() — открывает текстовый файл на чтение. Т.е. таким методом можно открыть файл и вытянуть из него данные. Например, чтобы считать информацию из файла C:Text1.txt и вывести ее в окно Immediate можно применить такой код:
- FileDateTime() — позволяет получить информацию о последнем времени обращения к указанному файлу. Если к файлу после создания ни разу не обращались, то это будет время создания файла. Если попытаться обратиться к уже открытой книге/файлу - то будет получено время открытия книги/файла, а не создания или сохранения.
sFileDateTime = FileDateTime("C:\Text1.txt")
sFileDateTime = FileDateTime("C:\Text1.txt")
- FileLen() — позволяет определить длину указанного файла в байтах:
MsgBox FileLen("C:\Text1.txt") & " bites", vbInformation, "www.excel-vba.ru"
MsgBox FileLen("C:\Text1.txt") & " bites", vbInformation, "www.excel-vba.ru"
- GetAttr() — возможность обратиться к файлу к файловой системе и получить информацию об его атрибутах (скрытый, доступен только для чтения, архивный и т.п.)
- InputB() — позволяет указывать количество байт, которые надо считать из файла. Альтернатива методу Open в случаях, когда необходимо считывать данные не по конкретным строкам, а именно побайтово.
- Loc() — от Location, то есть местонахождение — возвращает число, которое определяет текущее место вставки или чтения в открытом файле.
- Seek() — очень похожа на функцию Loc(), но Seek() возвращает информацию о позиции, с которой будет выполняться следующая операция чтения или вставки.
- LOF() — length of file — позволяет определить длину открытого файла в байтах.
Статья помогла? Сделай твит, поделись ссылкой с друзьями!
Юридическая информация
Так же с этой статьей читают:
Наши партнеры
Спасибо за сообщение
Ваше сообщение было получено и отправлено администратору.
Перебрать файлы в папке с помощью VBA?
функция Dir-это путь, но проблема в том, что вы не можете использовать Dir
функция рекурсивно как заявил здесь, ближе к низу.
то, как я справился с этим, - это использовать Dir
функции, чтобы получить все вложенные папки в целевую папку и загрузить их в массив, затем массив передается в функцию, которая рекурсивно вызывает.
вот класс, который я написал, который выполняет это, он включает в себя возможность поиск фильтров. (вы должны простить венгерскую нотацию, это было написано, когда это было в моде.)
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
21
автор: LimaNightHawk
excel - макрос - открыть все файлы в папке
Переполнение стека- Около
- Продукты
- Для команд
- Переполнение стека Общественные вопросы и ответы
- Переполнение стека для команд
excel - Как зациклить и открыть все файлы csv в моей текущей папке в VBA
Переполнение стека- Около
- Продукты
- Для команд
- Переполнение стека Общественные вопросы и ответы
excel - VBA - попытка открыть все книги в папке
Переполнение стека- Около
- Продукты
- Для команд
- Переполнение стека Общественные вопросы и ответы
- Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
- Вакансии Программирование и связанные с ним технические возможности карьерного роста
- Талант Нанимайте технических специалистов и создавайте свой бренд работодателя
vba - Откройте все файлы .doc в папке и примените код
Переполнение стека- Около
- Продукты
- Для команд
- Переполнение стека Общественные вопросы и ответы
- Переполнение стека для команд
Цикл по всем файлам Excel в заданной папке - Гуру электронных таблиц
Sub LoopAllExcelFilesInFolder ()
'ЦЕЛЬ: просмотреть все файлы Excel в указанной пользователем папке и выполнить для них заданную задачу
' ИСТОЧНИК: www.TheSpreadsheetGuru. com
Dim wb As Workbook
Dim myPath As String
Dim myFile As String
Dim myExtension As String
Dim FldrPicker As FileDialog
'Оптимизировать скорость макроса
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
'Получить путь к целевой папке от пользователя
Установить FldrPicker = Application.FileDialog (msoFileDialogFolderPicker)
с FldrPicker
. Target3Select
. Показать -1, затем перейти к следующему коду
myPath = .SelectedItems (1) & "\"
Конец на
'в случае отмены
следующий код:
myPath = myPath
Если myPath = "" затем перейти к сбросу настроек
' Целевое расширение файла (должен включать подстановочный знак "*")
myExtension = "*.xls * "
'Целевой путь с конечным расширением
myFile = Dir (myPath & myExtension)
' Перебрать каждый файл Excel в папке
Do While myFile" "
'Установить переменную, равную открытой книге
Установить wb = Workbooks. Open (Filename: = myPath & myFile)
'Убедитесь, что рабочая книга открылась, прежде чем переходить к следующей строке кода
DoEvents
' Изменить фоновую заливку первого рабочего листа синим
wb.Worksheets (1).Диапазон ("A1: Z1"). Interior.Color = RGB (51, 98, 174)
'Сохранить и закрыть книгу
wb.Close SaveChanges: = True
' Перед переходом к следующей строке убедитесь, что рабочая книга закрылась. код
DoEvents
'Получить следующее имя файла
myFile = Dir
Loop
' Окно сообщения после завершения задачи
MsgBox «Задача завершена!»
ResetSettings:
'Сбросить настройки макрооптимизации
Application.EnableEvents = True
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub
.excel - перебирать файлы в папке с помощью VBA?
Переполнение стека- Около
- Продукты
- Для команд
- Переполнение стека Общественные вопросы и ответы
- Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами