2 семестр / vba_2002
.pdfКоманды VBA по управлению файлами
Команды VBA, которые используются для управления файлами, перечислены в табл. 27.1.
| Таблица 27.1. КомандыVBA, предназначенные для управления файлами
Команда |
Назначение |
|
|
ChDir |
Изменения текущей папки |
ChDrive |
Изменения текущего диска |
D i r |
Возвращаетимяфайла, котороесоответствуетопределенномушаблонуилиат- |
|
рибуту файла |
FileCopy |
Копирует файл |
FileDateTime |
Возвращаетдатуивремяпоследнегоизмененияфайла |
FileLen |
Возвращает размер файла (в байтах) |
GetAttr |
Возвращает значение, определяющее атрибуты файла |
Kil l |
Удаляет файл |
MkDlr |
Создает новую папку |
Name |
Переименовывает файл или лапку |
RmDir |
Удаляет пустую папку |
SetAttr |
Изменяет атрибуты файла |
Далее будут приведены примеры, которые демонстрируют применение этих команд.
Определение факта существования файла
Представленная ниже функция возвращает значение True, если определенный файл существует. Если файл не существует, функция возвращает значение False. Когда функция Dir возвращает пустую строку, то файл невозможно найти. В этом случае функция возвращает значение False.
Function FileExists{fname) As Boolean
If Dir(fname) <> "" Then _
FileExists = True _
Else FileExists в False
End Function
Аргумент функция FileExists состоит из полного пути и имени файла. Функция может использоваться на рабочем листе, а также вызываться из кода VBA.
Определение факта существования пути
Следующая функция возвращает значение True, если указанный путь существует. В противном случае функция возвращает значение False.
Function PathExists(рпшпе) |
As Boolean |
|
1 |
Возвращает TRUE, если |
путь существует |
|
On Error Resume Next |
|
|
PathExists = GetAttr(pname) And vbDirectory = vbDirectory |
|
End Function |
|
Часть VII. Другие темы |
659 |
Отображение списка файлов в папке
Следующая процедура отображает (на активном рабочем листе) список файлов, которые содержатся в определенной папке. Кроме того, отображается размер каждого файла, а также дата последнего изменения.
Sub ListFilesO
Directory = "'с: Windows\desktop\ "
г = 1
1Вставка заголовков Cells(r, 1) = "FileName" Cells(r, 2) = "Size" Cells(г, 3) = "Date/Time"
Range("A1:C1").Font-Bold = True
1 |
Получение первого |
файла |
|||
|
f = |
Dir(Directory, |
7) |
||
|
Do While f <> |
"" |
|
||
|
|
r = r + 1 |
|
|
|
|
|
Cells(r, |
1) |
= |
£ |
|
|
Cells(r, 2) = FileLerMDireczory & 1) |
|||
|
|
Cells(r, |
3) |
= |
FileDateTime(Directory & f) |
|
' |
Получение следующего файла |
|||
|
|
f = Dir |
|
|
|
|
Loop |
|
|
|
|
End Sub |
|
|
|
|
Ha pwc. 27,1 показан результат выполнения этой процедуры.
Рис.27.l.Результатвыполнения процедуры ListFiJ.es
Обратите внимание, что процедура использует функцию D i r дважды. Первый раз — для получения имени первого файла, следующий — для получения остальных имен файлов, Если больше файлов не найлено, функция D i r возвращает пустую строку.
На Web-узле издательства вы найдете более сложную версию этой процедуры. Она позволяет указывать папку в диалоговом окне.
660 |
Глава 27. Управление файлами с помощью VBA |
Функция D i r в качестве первого аргумента принимает групповые символы. Чтобы получить список, например, файлов Excel, используйте следующий оператор:
f = D i r ( D i r e c t o r y & " * . x l ? " , 7)
Данный оператор приводит к получению первого имени файла в текущей папке. Это имя соответствует шаблону * ,xl? . Второй аргумент функции D i r позволяет задать атрибуты файлов. Аргумент, равный 7, приводит к получению имен файлов, которые не имеют атрибутов (файлов, предназначенных только для чтения), а также скрытых и системных файлов. Для получении, дополнительной информации обратитесь к интерактивному справочному руководству.
Если вам необходимо отобразить список файлов, чтобы позволить пользователю выбрать один из них, то этот метод не самый удачный. Обратитесь к методу GetOpenFileName, который рассматривался в главе 12.
Использование объекта FileSearch
Объект F i l e S e a r c h является членом библиотеки объектов Microsoft Office. Этот объект снабжает код VBA функциональностью диалогового окна поиска файлов. Например, можно использовать этот объект для поиска файлов, которые соответствуют указанному шаблону (например, * . x l s ) , или даже для нахождения файлов, которые содержат определенный текст. Данный объект применяется в Excel 97 и в более поздних версиях программы.
В табл. 27.2 представлены ключевые методы и свойства, которые предоставляются объектом F i l e S e a r c h . Дополнительная информация приведена в справочном руководстве.
Таблица 27.2. Свойства и методы объекта FileSearch
Свойство или метод |
Назначение |
FileName |
Имя файла, который необходимо найти {допускается использование групповых |
|
символов) |
FoundFiies |
Возвращает объект, который содержит имена найденных файлов |
L o o k i n |
Папка, в которой производится поиск |
SearchSubFolders |
Имеет значение True, если необходимо производить поиск в подпапках |
Execute |
Выполняет поиск |
NewSearch |
Сбрасывает состояние объекта F i l e S e a r c h |
Далее вы ознакомитесь с примерами использования указанных методов и свойств объекта
FileSearch.
Отображение списка файлов в папке
Следующая процедура отображает (на активном рабочем листе) список файлов, которые находятся в указанной гтапке. Кроме того, указывается размер файлов и время из последней модификации.
Sub ListFiles2()
Directory = "с:Windows\desktop\"
'Вставка заголовоков
г = 1
Cells.ClearContents
ЧастьШДругиетемы |
661 |
Cells(r, 1) = "Имя файла" Cells(г, 2) = "Размер" Cells(г, 3) = "Дата/время"
Range("Al:C1").Font.Bold = True г = г + 1
On Error Resume Next
With Application.FileSearch
.Newsearch
.Lookln в Directory
.Filename = "* . * "
.SearchSubFolders = False
.Execute
For i = 1 To .FoundFiles.Count
Cells(r, 1) |
= |
.FoundFiles(i) |
|
Cells{r, |
2) = FileLen(.FoundFiles(i)) |
||
Cells(r, |
3) |
= |
FileDateTime(.FoundFiles(i)) |
r = r + |
1 |
|
|
Next i
End With
End Sub
Объект FileSearch игнорирует все файлы ярлыков Windows (файлы с расширением *.LNK}.
На Web-узле издательства содержится более сложная версия этого примера (она позволяетуказывать имя папки).
Определение факта существования файла
Приведенная ниже функция принимает два аргумента (путь и имя файла) и возвращает значение True, если файл существует в указанной папке. После запуска метода E x e c u t e свойство Сo u n t объекта FoundFiIes будет равно значению 1, если файл найден.
Function FileExists2(path, fname) As Boolean With Application.FileSearch
.NewSearch
.Filename = fname
.Lookln = path
.Execute
If .FoundFiles.Count = 1 Then Fi1eExists2 = True
Else
FileExists2 = False End If
End With End Function
Объект F i l e S e a r c h невозможно использовать для определения факта существования папки.
Глава27.УправлениефайламиспомощьюVBA
Поиск файлов, которые содержат определенный текст
Следующая процедура производит поиск файлов * .xls в папке My Documents и ее подпапках, которые содержат текст budget. Все найденные имена файлов добавляются в список элемента управления Li stBox диалогового окна UserForm.
Sub FindFilesO
With Application.FileSearch
.NewSearch
.Lookln = "C:\My Documents"
.SearchSubFolders = True
.TextOrProperty = "budget"
.MatchTextExactly = False
.Filename = "*.xls"
.Execute
For i = 1 To .FoundFiles.Count UserForml.ListBoxl.Addltem .FoundFiles{i)
Next i End With UserForml.Show
End Sub
Использование объекта FileSystemObject
Объект FileSystemObject является членом библиотеки Windows Scripting Host и предоставляетдоступ ic файловой системе компьютера. Этот объект часто применяется в ориентированных на использование сценариев Web-страницах (например, VBScript или JavaScript) и поддерживается в Excel 2000 и в более поздних версиях программы.
Библиотека Windows Scripting Host часто применяется для распространения компьютерных вирусов. Следовательно, Windows Scripting Host отключена в большинстве систем. Таким образом, необходимо быть очень внимательным при проектировании приложения, которое будет использоваться а различных системах.
Документацию к объекту FileSystemObject вы найдете по адресу h t t p : //itisdn. microsoft.com/scripting.
Определение факта существования файла
Функция, которая приводится ниже, принимает один аргумент (путь и имя файла), после чего возвращает значение True, если указанный файл существует.
Function FileExists3{fname) As Boolean
Set FileSys = CreateObject("Scripting.FileSystemObject") FileExists3 = FileSys.FileExists(fname)
End Function
Функция создает новый объект FileSystemObject, который называется FileSys, и получает доступ к свойству FileExists этого объекта.
На Web-узле издательства содержится пример, который демонстрирует все три
метода {команды VBA, Объект FileSearch и объект FileSystemObject) ОП-
ределения факта существования файла.
Часть VII. Другие темы |
663 |
Определение факта существования папки
Функция, которая приводится ниже, принимает один аргумент (путь) и возвращает значение True, если указанная папка существует.
Function PatriExistsB(path) As Boolean
Set FileSys = CreateObject("Scripting.FileSystemObject") On Error Resume Next
Set FolderObj = FileSys.getfolder(path) If Err = 0 Then
PathExists3 = True
Else
PathExists3 = False End If
End Function
С помощью данной функции создается новый объект F o l d e r , который называется FolderObj . Если операция завершается успешно, то папка существует. Если возникает сообщение об ошибке, то папка на диске отсутствует.
Получение информации о дисках
Следующая процедура использует объект F i l e S y s t e m O b j e c t для отображения различной информации о дисках. Процедура циклически просматривает коллекцию D r i v e s и записывает значения свойств на рабочий лист. На рис. 27.2 показаны результаты выполнения процедуры в системе, в которой установлен дисковод чтения гибких дисков, несколько жестких дисков и два устройства чтения компакт-дисков. Отображается информация о названии диска (буква), состоянии "готовности" диска, типе диска, имени тома диска, обшем объеме,
атакже объеме свободного пространства.
Внекоторых версиях Windows езойства TotalSize и AvailableSpace могут возвращать некорректные значения для дисков, емкость которых больше двух гигабайт. Данная проблема обойдена в Windows NT, а также Windows 2000 и более поздних версиях ОС,
Эта рабочая книга доступна на Web-узле издательства.
Рис. 27.2. Результат выполнения процедуры ShowDrivelnfo
664 |
Глава 27. Управление файлами с помощью VBA |
Sub ShowDrivelnfoW
Dim FileSys, Drv
Dim Row As Integer
Set FileSys = CreateObject("Scripting.FileSystemObject")
Cells.Clear
Row = 0
On Error Resume Next
For Each Drv In FileSys.Drives
Row a Row + 1
Cells(Row, 1) - Drv.DriveLetter
Cells(Row, 2) = Drv.IsReady
Select Case Drv.DriveType
Case 0: Cells(Row, 3) = "Неизвестно"
Case 1: Cells(Row, 3) = "Съемный"
Case 2: Cells(Row, 3) = "Жесткий"
Case 3: Cells(Row, 3) = "Сетевой"
Case 4: Cells(Row, 3) = "CD-ROM"
Case 5: Cells(Row, 3) = "RAM"
End Select
Cells(Row, 4) = Drv.VolumeName
Cells(Row, 5) = Drv.TotalSize
Cells(Row, 6) = Drv.AvailableSpace
Next Drv
End Sub
Работа с текстовыми файлами
VBA содержит ряд операторов, которые позволяют управлять файлами на низком уровне. Эти операторы ввода/вывода позволяют разработчику намного больше, чем стандартные средства экспорта и импорта файлов Excel.
Доступ к файлу можно осуществлять в одном из трех режимов.
•Последовательный доступ. Этот режим является самым распространенным. Он позволяет считывать и записывать отдельные символы или целые строки данных.
•Произвольный доступ. Режим, используемый только при программировании приложений баз данных (не рекомендуется использовать в VBA, поскольку для этого существуют более подходящие средства).
•Двоичный доступ. Используется для чтения и записи с любой позиции в файле с точностью до байта. Данный режим может применяться для сохранения нли отображения растрового изображения. В VBA он практически не используется.
По причине того, что произвольный и двоичный режимы доступа в VBA используются редко, в данной главе основное внимание будет уделено рассмотрению последовательного доступа. При последовательном доступе файл считывается последовательно. Другими словами, приложение начинает чтение с начале файла и последовательно получает строку за строкой. При записи файла приложение добавляет строки в конец существующего файла.
Для чтения и записи файлов в этой главе используется традиционный метод "канала данных". Еще одной возможностью является применение "объектного" подхода. Объект FileSystemobject содержит объект Textstream, который может использоваться для чтения и записи текстовых файлов. Объект FileSystemobject является частью библиотеки Windows Scripting Host. Как отмечалось ранее, такая служба поддержки сценариев отключена в большинстве систем из-за ее предрасположенности к распространению вирусов.
Часть VII. Другие темы |
685 |
Открытие текстового файла
Оператор VBA Open (не путайте с методом Open объекта Application ) используется при открытии файла для чтения или записи. Перед тем, как начать чтение или запись файла, его необходимо открыть.
Оператор Open является очень гибким, поэтому он имеет относительно сложный синтаксис.
Open путь For режим [Access доступ] [блокировка] _ As [ #]номер_файла [Ьеп=лл_записи]
•путь — аргумент путь оператора Open очень простой. Он указывает имя и путь файла, который необходимо открыть (обязательный параметр).
•режим — это режим, в котором должен открываться файл (обязательный параметр). Данный параметр может иметь следующие значения:
•Append — режим последовательного доступа позволяет осуществлять чтение файла, а также добавлять данные в конец файла;
•Input — режим последовательного доступа, который позволяет читать файл, но не даст возможности записывать в него данные;
•Output — режим последовательного доступа, который позволяет выполнять чтение и запись файла. В этом режиме всегда создается новый файл (существующий файл с текущим именем удаляется);
•Binary — режим произвольного доступа, в котором производится побайтовое чтение и запись данных;
•Random— режим произвольного доступа, который позволяет выполнять чтение
изапись данных блоками, установленными значением аргумента дд_записи оператора Open.
•доступ — этот аргумент определяет допустимые операции над файлом (необязательный параметр). Этот параметр может иметь значения Read, Write и Read Write.
•блокировка — аргумент блокировка используется для разрешения проблем многопользовательского доступа (необязательный параметр). Этот параметр может иметь сле-
дующие значения: Shared, Lock Read, Lock Write, а также Lock Head Write.
,• номер „файла — номер файла, который находится в пределах от 1 до 511 (обязательный параметр). Для получения следующего свободного номера файла можно использовать функцию FreeFile ,
•дл_записи — длина записи (для файлов с произвольным доступом) или размер буфера (для файлов с последовательным доступом) — необязательный параметр.
Чтение текстового файла
Базовой процедурой чтения текстового файла с использованием VBA является следующая последовательность действий.
1.Открытие файла с помощью оператора Open.
2.Указание позиции в файле с помощью функции Seek (не обязательно).
3. |
Чтение данных из файла с помощью функций Input, Input # или Line Input #. |
4. |
Закрытие файла с помощью оператора Close. |
666 |
Глава 27. Управление фатами с помощью VBA |
Запись в текстовый файл
Базовая процедура записи текстового файла состоит из следующей последовательности действий.
1.Открытие или создание файла с помощью оператора Open.
2.Указание позиции в файле с помощью функции Seek (не обязательно).
3. Запись данных в файл с помощью операторов Write # или P r i n t #. 4. Закрытие файла с помощью оператора Close.
Получение номера файла
Большинство программистов, использующих VBA, просто назначают номер файла в вызове оператора Open. Например:
Open "myfile . txt" For Input As #1
После этого в следующих операторах на файл можно ссылаться как на #1.
Если открыт первый файл и вы открываете второй, то последний получит номер #2.
Open "another.txt" For Input As #2
СредстваExcelимпорта иэкспортатекстовыхфайлов
Excel поддерживаеттри типа текстовых файлов.
Ч- Файлы CSV(Comma Separated Values) (Разделенные запятыми значения). Столбцы данных разделяются запятыми, а каждая строка данных завершается символом возврата каретки. Б некоторых неанглийских версиях Excel вместо запятой используется точкасзапятой.
•Ф- PRN. Столбцы данных выравниваются относительно определенного символа, а каж^ даястроказавершаетсясимволомвозвратакаретки.
•С- Файлы TXT (Tab-delimited) (Разделенные символами табуляции). Столбцы данных разделяются с помощью символов табуляции, а каждая строка данных завершается символом возврата каретки.
При попытке открыть текстовый файл с помощью команды Файл^Открыть будет отображен мастер импорта текстовых файлов, который поможет указать пользователю способ разделения столбцов. Если в тексте в качестве разделителя применялся символ табуляции или запятая, то Excel открывает файл без помощи мастера импорта текстовых файлов. Мастер преобразования текста в столбцы, доступ к которому осуществляется с помощью команды Да иные1* Текст по столбцам, является аналогом мастера импорта текстовых файлов, но работаетсданными, которыепредставленыединственнымстолбцом.
Еще одним подходом является использование функции VBA F r e e F i l e , которая позволяет получить свободный дескриптор файла. После этого на файл можно ссылаться с помощью переменной. Приведем пример использования этой функции:
Определение или установка позиции в файле
Для последователького доступа к файлу редко когда возникает необходимость в получении текущей позиции. Но если по определенной причине такая информация нужна, то можно воспользоваться функцией Seek.
Часть VII. Другие темы |
667 |
Операторы чтения и записи
VBA предоставляет несколько операторов чтения и записи данных в файл. Представленные далее операторы используются для чтения данных из файла с последова-
тельным доступом.
•I n p u t — читает из файла указанное количество символов.
•I n p u t # — читает файл в виде последовательности переменных; переменные разделяются запятой.
• L i n e I n p u t # — читает файл построчно (строки разделяются символами возврата каретки и/или перевода строки).
Для записи данных в файл с последовательным доступом используются два оператора,
•W r i t e # — записывает последовательность значений, где каждое значение отделено запятой и находится в кавычках. Если оператор завершается точкой с запятой, после
каждого значения не будет вставляться последовательность возврат каретки/перевод строки. Данные, записанные с помощью оператора W r i t e #, обычно читаются из файла с помощью оператора I n p u t #.
• P r i n t # — записывает последовательность значений, где каждое значение отделено символом пробела. Если завершить оператор точкой с запятой, то после каждого значения не будет вставляться последовательность возврат каретки/перевод строки. Данные, записанные с помощью оператора P r i n t #, обычно читаются с помощью оператора L i n e I n p u t # или оператора I n p u t .
Примеры управления текстовыми файлами
В данном разделе содержится несколько примеров, демонстрирующих различные способы управления текстовыми файлами.
Импортирование данных из текстового файла
Следующий пример читает текстовый файл и размещает каждую строку данных в отдельную ячейку (начиная с активной ячейки).
Sub ImportData(}
Set ImpRng = ActiveCell
Open "c:\windows\desktop\textfile.txt" For Input As #1 r = 0
Do Until EOF(l)
Line Input #1, data ActiveCell.Offset(r, 0) * data r = r + 1
Loop Close #1
End Sub
В большинстве случаев данная процедура не принесет пользы, так как каждая строка данных просто помещается в отдельную ячейку. Но можно воспользоваться командой Данные^ Текст по столбцам для разбора данных по столбцам.
Глава 27. Управление файлами с помощью VBA