Как найти файл vba excel

Макрос 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
  • 302889 просмотров

Не получается применить макрос? Не удаётся изменить код под свои нужды?

Оформите заказ у нас на сайте, не забыв прикрепить примеры файлов, и описать, что и как должно работать.

 

Как правильно вызвать окно проводника, чтобы вывести список файлов определенного расширения?
Например: Ищем все файлы с расширением txt на диске C:/

Попытался использовать следующий код, но выводит только окно поиска.
Не знаю как правильно подставить аргументы
Set oFnd = CreateObject(“Shell.Application”).FindFiles

 

Слэн

Пользователь

Сообщений: 5192
Регистрация: 16.01.2013

#2

22.11.2013 14:08:15

Код
Dim dlg As FileDialog, rez
 Set dlg = Application.FileDialog(msoFileDialogFilePicker)
 dlg.AllowMultiSelect = False
 dlg.Title = "Укажите файл для обработки"
 dlg.InitialFileName = "*.txt"
 rez = dlg.Show

например

Живи и дай жить..

 

Ёк-Мок

Пользователь

Сообщений: 1777
Регистрация: 16.01.2013

#3

22.11.2013 14:16:45

или

Код
Dim sFile As String
sFile = Application.GetOpenFilename("Files(*.txt),*.txt", , "Выбрать файл", , Files)

Удивление есть начало познания © Surprise me!
И да пребудет с нами сила ВПР.

 

The_Prist

Пользователь

Сообщений: 14239
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

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

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

Мне нужно вывести окно проводника с результатом поиска.

Если я использую CreateObject(“Shell.Application”).FindFiles, выводиться пустое окно, т.к. не заданы аргументы для поиска (Искомые файлы, папка поиска).

 

SkyPro

Пользователь

Сообщений: 309
Регистрация: 23.07.2013

#6

22.11.2013 14:57:07

Цитата
Мне нужно вывести окно проводника с результатом поиска.

Не получится. У FindFiles нет аргументов. Это просто запуск окна поиска.

SkyPro

 

Николай Шелковников

Пользователь

Сообщений: 123
Регистрация: 01.01.1970

#7

22.11.2013 15:48:41

Нашел похожую процедуру.
Помогите расшифровать аргументы и добавить поиск файлов по маске *.txt

Код
Option Explicit
'API declaration for the windows "Search Results" dialog
Private Declare Function ShellSearch& Lib "shell32.dll" _
        Alias "ShellExecuteA" (ByVal hwnd As Long, _
        ByVal lpOperation As String, _
        ByVal lpFile As String, ByVal lpParameters As String, _
        ByVal lpDirectory As String, _
        ByVal nShowCmd As Long)
        
Private Const SW_SHOWNORMAL = 1


Sub ShowWindowsSearchDialog_API()
'   Specified drive to Search
    Const szSDrive As String = "C:"
    
    ShellSearch 0, "find", szSDrive, "", "", SW_SHOWNORMAL
End Sub
 

ikki

Пользователь

Сообщений: 9709
Регистрация: 22.12.2012

Изменено: ikki22.11.2013 16:06:43

фрилансер Excel, VBA – контакты в профиле
“Совершенствоваться не обязательно. Выживание — дело добровольное.” Э.Деминг

 

Когда работаю с аргументом find, выводится ошибка  “No association for file extension”.  В остальных случаях находит  указанный файл (explore,  open,  edit, print), но с маской *.txt не работает.

Как правильно задать аргументы?

 

Юрий М

Модератор

Сообщений: 60700
Регистрация: 14.09.2012

Контакты см. в профиле

А чем не устраивает вариант Слэна?

 

SkyPro

Пользователь

Сообщений: 309
Регистрация: 23.07.2013

Чилавеку нужна именна акно поиска вендовскае.

Подозреваю, что суть в использовании виндовского окна поиска.

Изменено: SkyPro22.11.2013 20:21:14

 

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

 

Юрий М

Модератор

Сообщений: 60700
Регистрация: 14.09.2012

Контакты см. в профиле

Окно проводника и окно поиска – разные вещи.

 

Мне нужно окно вызываемое вот этим кодом Set oFnd = CreateObject(“Shell.Application”).FindFiles

 

anvg

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

#15

23.11.2013 11:58:46

Как вариант, не без проблем (ниже почему). Нужно подключить бибилиотеку Miscrosoft Shell Controls and Automation.

Код
Private Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)
Public Sub ShowFilteredWindow()
    Const FolderPath As String = "c:projects"
    Dim pShell As New Shell32.Shell
    Dim pWin As Object, shFolderView As Shell32.ShellFolderView
    Dim pFolder As Shell32.Folder3
    
    Set pFolder = pShell.Namespace(FolderPath)
    pShell.Explore FolderPath
    Sleep 200
    For Each pWin In pShell.Windows
        Set shFolderView = pWin.document
        'узкое место, такая папка в проводнике может быть открыта не один раз
        If shFolderView.Folder.Title = pFolder.Title Then
            shFolderView.FilterView "*.txt"
        End If
    Next
End Sub
 

Библиотеку подключил, на строке shFolderView.FilterView “*.txt выдает ошибку: “Object doesn´t support this property or method”.

 

anvg

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

Я тестировал в win7 64bit, Excel 2010 32bit. Если у вас  win xp… насколько помню, там поиск файлов не входил в состав проводника. Посмотреть смогу только в понедельник.
Простите за любопытство, но зачем нужно использовать именно проводник?

Изменено: anvg23.11.2013 16:58:10

 

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

 

ikki

Пользователь

Сообщений: 9709
Регистрация: 22.12.2012

#19

23.11.2013 18:09:37

Цитата
В нашей организации сотрудники привыкли

имхо

: у сотрудников в вашей организации сложились плохие привычки. у данного типа задач есть гораздо более приятные и “вкусные” варианты решения.
раз уж у вас есть реестр в Excel и соответствующие файлы с текстами, то гораздо проще. правильнее и удобнее организовать гиперссылки из этого самого реестра на эти самые файлы.
правда, место хранения файлов желательно организовать правильно, раз и навсегда – например, разложить по папкам-контрагентам или датам или ответственным сотрудникам и т.д.
если же и это невозможно и ваши сотрудники “привыкли” таскать файлы туда-сюда – то и это не такая уж большая проблема, особенно в случае наличия какой-либо системы в наименованиях таких файлов – обычный поиск средствами VBA с этим справится достаточно легко.

хотя, конечно. хозяин – барин… ;)

фрилансер Excel, VBA – контакты в профиле
“Совершенствоваться не обязательно. Выживание — дело добровольное.” Э.Деминг

 

Все это реализовано, но для тех кто не хочет менять привычки хочу сделать поиск через проводник.

 

KuklP

Пользователь

Сообщений: 14868
Регистрация: 21.12.2012

E-mail и реквизиты в профиле.

#21

23.11.2013 18:24:25

Цитата
для тех кто не хочет менять привычки

существуют дисциплинарные взыскания(например для Украины- Кзот):
1) Выговор;
2) Увольнение.
Думаю, уже после первого все дружно “захотят”! Если кто дождется второго, то на его место того, кто хочет. У себя дома пусть хотят. На работе надо работать.

Я сам – дурнее всякого примера! …

 

ikki

Пользователь

Сообщений: 9709
Регистрация: 22.12.2012

#22

23.11.2013 18:27:01

Цитата
На работе надо работать.

кстати, да.
неэффективный способ работы просто потому, что “мне так нравится” – это неправильно.
тем более – при наличии реализованного эффективного варианта.

но в реальной жизни бывают исключения – “большие” начальники. :(

фрилансер Excel, VBA – контакты в профиле
“Совершенствоваться не обязательно. Выживание — дело добровольное.” Э.Деминг

 

KuklP

Пользователь

Сообщений: 14868
Регистрация: 21.12.2012

E-mail и реквизиты в профиле.

Точно, Саш. Но! “”большие” начальники” в большинстве своем малосведущи в Эксе, ВБА и иже.. И если авторитетный в той организации знаток Экса скажет: “А низзя! И чревато!”, то в подавляющем числе случаев получится см. пост №21[IMG]
На самом деле, в бытность мою инженером, девчата(моего возраста и старше) дружили со мной, чтоб я им помогал не учиться информационным технологиям. Я писал им программки, иногда выполнял их работу. Но это было в 1999-2001гг. Делаем выводы, время не стоит и работодатели не хотят заниматься благотворительностью на собственных производствах. Да и талантливой(и при этом невостребованной) молодежи хватает. Поэтому считаю пост №21 не противоречащим нормальной, человеческой морали.

Я сам – дурнее всякого примера! …

 

anvg

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

В WinXP как то всё сложно. Может и Find по-умолчанию и Windows Desktop Search выскочить при использовании CreateObject(“Shell.Application”).FindFiles (в зависимости что стоит).
Так что, может вам проще сделать форму с ListBox с двумя колонками, в первую видимую выводить имена файлов, а в скрытой колонке хранить путь и имена файлов, и по щелчку на имени файла открывать его в блокноте, организовав поиск файлов по заданному пути через тот же Dir?

Изменено: anvg25.11.2013 03:28:54

 

У меня стоит WinXP, по умолчанию запускается  Find.

 

Николай Шелковников

Пользователь

Сообщений: 123
Регистрация: 01.01.1970

#26

27.11.2013 15:42:21

Без вариантов?

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

В папке с:отчеты лежат отчёты по дням:
“отчёт за 16.05.2017”.xls
“отчёт за 15.05.2017”.xls
“отчёт за 14.05.2017”.xls
И т.д.

Пишу макрос, который будет искать по маске: “отчёт за ” & Date – x”.xls” , за какую дату был записан последний отчёт, то есть ‘x’. Перерыв в формировании отчёта может достигать 5 дней.
Что мешает: не могу понять, как выйти из двух циклов после первого вхождения.
У меня получается так, или не останавливается, цикл X и выдаёт последнее, а не первое совпадение, или наоборот не найдя х=1 не переходит к x=2.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Sub
fail = Dir ("с:отчетыотчёт за *.xls")
Do while fail <> " "
Cells (r, 1) = fail
r = r + 1
fail = Dir
Loop
for x=1 to 5 
f1 = "отчёт за " & Date - x & ".xls"
For r = 1 To WorksheetFunction.CountA(Range("A:A"))
If f1 = Cells(r, 1) Exit For
End If
Next r
Exit For
Next x
MsgBox (x)
End Sub

Получение списка файлов в указанной папке с помощью кода 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. Список папок.


Фразы для контекстного поиска: обход файлов.


Главная » Функции VBA »

28 Апрель 2011              99652 просмотров

  • CurDir() – функция, которая возвращает путь к каталогу(для указанного диска), в котором по умолчанию будут сохраняться файлы:
        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"
    • 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

      Важно помнить, что при открытии файла таким методом(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
  • FileDateTime() — позволяет получить информацию о последнем времени обращения к указанному файлу. Если к файлу после создания ни разу не обращались, то это будет время создания файла. Если попытаться обратиться к уже открытой книге/файлу – то будет получено время открытия книги/файла, а не создания или сохранения.
        sFileDateTime = FileDateTime("C:Text1.txt")
  • FileLen() — позволяет определить длину указанного файла в байтах:
        MsgBox FileLen("C:Text1.txt") & " bites", vbInformation, "www.excel-vba.ru"
  • GetAttr() — возможность обратиться к файлу к файловой системе и получить информацию об его атрибутах (скрытый, доступен только для чтения, архивный и т.п.)
  • InputB() — позволяет указывать количество байт, которые надо считать из файла. Альтернатива методу Open в случаях, когда необходимо считывать данные не по конкретным строкам, а именно побайтово.
  • Loc() — от Location, то есть местонахождение — возвращает число, которое определяет текущее место вставки или чтения в открытом файле.
  • Seek() — очень похожа на функцию Loc(), но Seek() возвращает информацию о позиции, с которой будет выполняться следующая операция чтения или вставки.
  • LOF() — length of file — позволяет определить длину открытого файла в байтах.

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

Добавить комментарий