Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

2 семестр / vba_2002

.pdf
Скачиваний:
82
Добавлен:
09.04.2015
Размер:
9.9 Mб
Скачать

Команды 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

Соседние файлы в папке 2 семестр