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

2 Курс Информатика VBA(ЗО) / Книги / В.Д.Хорев - Самоучитель программирования на VBA в Microsoft Office

.pdf
Скачиваний:
2707
Добавлен:
31.05.2015
Размер:
21.66 Mб
Скачать

Операторы и встроенные функции языка VBA 285

Первый параметр. Текст приглашения задается первым параметром. Это может быть строка длиной до тысячи символов. Эта строка может состоять из нескольких физических строк. Для этого в нее следует включить символы возврата каретки и перевода строки — Chr(10) и Chr(13), соответст-

венно, или предопределенную константу vbCr.

Второй параметр (необязательный) задает текст заголовка окна. Третий параметр (необязательный) задает строку по умолчанию.

Дополнительные параметры. С помощью еще двух необязательных параметров можно указать X- и Y-координаты окна ввода относительно левого верхнего угла экрана.

Например, при помощи следующего кода на экран будет выведено окно ввода, изображенное на рис. П.4.

Dim MySearch As String

MySearch = _

InputBox("Введите фамилию клиента", "Поиск клиента", "Иванов")

If MySearch <> “” Then

...

End If

Рис. П.4. Окно ввода содержит заготовку строки, которую пользователь может отредактировать или удалить

Если пользователь щелкнет на OK или нажмет клавишу [Enter], то в переменную MySearch будет помещено значение “Иванов”. Если пользователь щелкнет на Отмена или нажмет клавишу [Esc], то функция InputBox вернет пустую строку.

Взаимодействие с операционной системой

Пользователь — не единственный объект внешнего мира, с которым приходится взаимодействовать программе. Иногда макрос может нуждаться в обмене данными с операционной системой. Самое распространенное взаимодействие такого рода — это файловые операции, когда программа читает данные из дискового файла или записывает данные в файл. Возможны также случаи, когда программе необходимо управлять работой другого приложения, причем это может осуществляться не только посредством технологии Automation (в конце концов, далеко не все приложения поддерживают Automation), но и другими способами.

Запуск приложений (функция Shell)

Функция Shell осуществляет асинхронный запуск другого приложения. Асинхронность означает, что функция не ожидает ни какой реакции от запущенной программы и выполнение VBAкода продолжается независимо от результата выполнения этого приложения. Функция возвращает целочисленное (Double) значение в формате Variant, соответствующее идентификатору стартовавшего приложения (коду задачи); если программу запустить не удалось, функция Shell возвращает значение 0.

Вот как, например, VBA-код может запустить редактор системных файлов Windows:

286 Приложение. VBA, как язык программирования: данные, синтаксис и функции

Dim MyAppNum As Variant

...

On Error Resume Next

MyAppNum = Shell("c:\windows\system\sysedit.exe", 1)

If MyAppNum=0 Then

MsgBox “Запуск программы невозможен”

End If

...

Как сделать запущенное приложение активным (оператор AppActivate)

Оператор AppActivate делает текущим окно заданного приложения. Чтобы указать требуемое приложение, необходимо использовать его идентификатор (код задачи), возвращенный функцией Shell. Вместо идентификатора можно указать текст титульной строки приложения, которое необходимо сделать текущим.

Вот как, например, можно активизировать приложение с использованием идентификатора (кода задачи), возвращенного функцией Shell:

Dim MyAppNum As Variant

On Error Resume Next

MyAppNum = Shell("c:\windows\system\sysedit.exe", 1)

AppActivate MyAppNum

Пример, активизации приложения с использованием текста из строки заголовка окна приложения:

AppActivate "Редактор файлов настройки", True

При помощи второго параметра (логическое значение True) определяется, что активация приложения осуществляется только после того, как само вызывающее приложение станет активным. По умолчанию этот параметр принимается равным False и активация требуемого приложения происходит немедленно.

Управление другим приложением при помощи имитации ввода с клавиатуры (оператор SendKeys)

VBA-программа может посылать другому приложению “нажатия клавиш”, то есть имитировать ввод с клавиатуры, управляя тем самым работой другой программы.

Поскольку нажатия клавиш с клавиатуры может получать только активное приложение, его окно необходимо вначале сделать текущим при помощи оператора AppActivate — виртуальные нажатия клавиш произойдут в активном окне.

Набор нажатий клавиш задается при помощи параметра-строки, в котором обычные символы

представлены возвращаемым ими символом, а специальные клавиши своими именами, заключенными в фигурные скобки (например, {Enter}, {Esc}, {F4}). Если при “виртуальном” нажатии должна удерживаться одновременно клавиша [Shift], то код клавиши необходимо предварить знаком “+”. Знаки “^” и “%” соответствуют одновременно нажатым клавишам [Ctrl] и [Alt]. Например, сочетание [Alt]+[F4] должно обозначаться символами

%{F4}

Вычисление факториала при помощи калькулятор Windows из VBA-кода

Опишем, каким образом, например, можно использовать калькулятор Windows для вычислений в коде VBA. Предполагается, что калькулятор последний раз был закрыт в режиме работы для

Операторы и встроенные функции языка VBA 287

инженерных вычислений. Допустим, требуется вычислить факториал от числа, содержащегося в

Integer-переменной MyNumber.

Dim MyAppNum As Variant

Dim MyNumber As Integer

MyNumber = 5

On Error Resume Next

MyAppNum = Shell("c:\windows\calc.exe", 1)

AppActivate MyAppNum

SendKeys Str(MyNumber) & "!^c%{F4}", True

Вначале функцией Shell запускается исполняемый файл калькулятора calc.exe в каталоге Windows. Затем окно калькулятора делается текущим при помощи оператора AppActivate. Теперь наступает черед SendKeys. Строка, которая задает виртуальный ввод с клавиатуры выглядит следующим образом:

Str(MyNumber) & "!^c%{F4}"

Фактическая строка символов, с учетом преобразования числа 5 в строку “5” и объединения строковых значений:

5!^c%{F4}

В окне калькулятора будет “нажата” цифровая клавиша 5, затем будет введен символ “!”, что соответствует вычислению факториала. В окошке калькулятора появится результат (число 120). Символы “^c” соответствуют нажатию [Ctrl]+[c], что влечет за собой копирование результата в буфер. Наконец, символы “%{F4}” соответствуют сочетанию [Alt]+[F4], благодаря чему окно калькулятора тут же закрывается. Остается лишь использовать хранящийся в буфере результат, например, вставить его вызовом метода Paste соответствующего объекта.

Если необходимо управлять программой, которая не поддерживает Automation, то имитация ввода с клавиатуры при помощи оператора SendKeys — единственное средство, остающееся в распоряжении VBA-программы.

см. также в раздел “Еще одно “страшное” слово — OLE”.

Файловые операции

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

VBA-программы часто имеют дело с файлами неявным образом, взаимодействуя с Word, Excel, Access или PowerPoint, они одновременно обращаются к файлам данных, принадлежащим этим приложениям. Все подобные операции выполняются автоматически. Здесь речь пойдет о файловых операциях, которые могут потребоваться VBA-программе для каких-то внутренних специальных целей.

Visual Basic для приложений обладает обширным инструментарием для файловых операций. Операторы и функции языка позволяют работать с дисковыми устройствами (приводами), каталогами и собственно файлами. В отношении файлов определен ряд операций (открытие и закрытие,

288 Приложение. VBA, как язык программирования: данные, синтаксис и функции

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

Какие бывают файлы

Visual Basic (и не только Visual Basic) различает три вида файлов (или, что практически то же самое, три режима доступа к файлу):

Файлы последовательного доступа

Все текстовые (ASCII-, ANSI-файлы) состоят из последовательности строк символов, при этом каждая строка может иметь произвольную длину и доступ к этим строкам может быть только последовательным. Если, например, программе требуется 101-я строка текстового файла, ей придется прочитать вначале первые 100 строк, причем совершенно неизвестно, во что это выльется и есть ли в файле 101-строка, быть может, он состоит из одной огромной строки.

Файлы произвольного доступа

Файл произвольного доступа состоит из записей фиксированной длины, поэтому местоположение записи в файле можно вычислить умножением номера записи на ее длину. Благодаря этому оказывается возможным позиционироваться на произвольную запись. Если программе требуется 101-я запись в файле данных, она может прочитать непосредственно 101-ю запись. Размер файла кратен размеру записи, и по этой причине всегда можно определить, сколько записей содержится в файле по его размеру, даже не открывая его.

Бинарные (двоичные) файлы

Бинарный файл представляет собой частный случай файла произвольного доступа — достаточно принять длину записи равной одному байту и становится возможным позиционироваться на произвольный байт в файле. Что означают все эти байты и как они организованы — дело самой программы.

Операции с каталогами и дисками

Для операций с файлами, каталогами и дисками в VBA существует набор операторов, функционально соответствующий командам операционной системы MS DOS.

Оператор ChDrive

Оператор ChDrive делает дисковое устройство текущим (выбирает его). В качестве параметра должна выступать текстовая строка, первым символом которой должна быть литера — имя диска. Например, оператор

ChDrive "D"

сделает текущим диск D. Обратите внимание на тот факт, что вместо строки “D” можно было бы указать, например, “D:\TEMP” с таким же успехом — оператор ChDrive распознает только первую литеру строки.

Оператор MkDir

При помощи оператора MkDir можно создать каталог (подкаталог) с заданным именем. Например, создать в корневом каталоге диска C подкаталог с именем WORK можно при помощи оператора:

MkDir "C:\WORK"

Оператор ChDir

Чтобы сменить текущий каталог на другой, то есть сделать текущим другой каталог, нужно воспользоваться оператором ChDir. Дисковое устройство, на котором располагается каталог, должно быть текущим. Если это не так, то вначале следует использовать оператор ChDrive.

Операторы и встроенные функции языка VBA 289

Вот как, например, можно использовать строку с полным именем каталога (то есть, с именем, включающим имя диска) в качестве параметра для операторов ChDir и ChDrive одновременно:

Dim MyPath As String

...

MyPath = "C:\WORK"

...

ChDrive MyPath

ChDir MyPath

При этом оператор ChDrive “поймет” только литеру “C” и сделает текущим диск C, а оператор ChDir “поймет” все остальные литеры кроме подстроки “C:” и сделает текущим каталог

WORK.

Оператор RmDir

Удалить каталог можно посредством оператора RmDir, которому в качестве параметра необходимо указать полное имя каталога, подлежащего удалению. Имя должно включать имя диска, а “обреченный” каталог должен быть пуст. Попытка удалить непустой каталог приведет к ошибке выполнения.

RmDir "C:\WORK"

Функция CurDir

Функция CurDir позволяет узнать имя текущего каталога. В качестве параметра можно указать имя диска, при отсутствии параметра будет иметься в виду текущий диск. Функция возвращает строку полного имени текущего каталога.

Например, если программе требуется сменить каталог, а затем вернуться к исходному каталогу, то она должна “запомнить” имя текущего каталога. Вот, как можно использовать при этом функцию CurDir:

Dim MyPath As String Dim TargetPath As String

...

MyPath = CurDir()

MsgBox "Путь к каталогу " + MyPath + " будет сохранен"

TargetPath = "C:\WORK" ChDrive TargetPath ChDir TargetPath

...

MsgBox "Возвращаемся к каталогу " + MyPath ChDrive MyPath

ChDir MyPath

Сохраненное в строковой переменной MyPath имя текущего каталога используется затем для того, чтобы вернуться к исходному каталогу.

Функция Dir

Для того чтобы прочитать имена файлов, содержащихся в каталоге, используют функцию Dir, которая по своему действию аналогична одноименной команде ОС MS DOS.

В качестве параметров этой функции необходимо указать имя каталога и (необязательный параметр) число, задающее атрибуты файлов (это число получается в результате суммирования предопределенных констант Visual Basic). В имя каталога можно добавить маску имен файлов, фор-

290 Приложение. VBA, как язык программирования: данные, синтаксис и функции

мируемую по тем же правилам, что и маска для команд MS DOS: символ “?” замещает любой символ, а символ “*” замещает любое число любых символов.

В результате функция вернет первое имя файла, удовлетворяющего заданным условиям, если, конечно, хотя бы один такой файл существует. Для того чтобы получить все остальные имена,

следует продолжать вызовы функции Dir уже без параметров до тех пор, пока она не вернет пустую строку.

Например, программе требуется получить имена всех файлов с расширением TXT в каталоге

WORK диска C:.

Объявим строковую переменную:

Dim MyFileName As String

Первый вызов функции Dir с указанием каталога:

MyFileName = Dir("C:\WORK\*.TXT")

MsgBox MyFileName

Далее вызываем функцию Dir без параметров до тех пор, пока она не вернет пустую строку:

Do While MyFileName <> ""

MyFileName = Dir

MsgBox MyFileName

Loop

Переименование файла или каталога (оператор Name)

Для того чтобы переименовать файл или каталог, используют оператор Name…As… В качестве параметров при этом указывают имя файла или каталога, то есть старое его имя, которое еще остается действительным, и новое имя. Оператор Name, подобно соответствующей команде MS DOS, позволяет использовать маскирующие (замещающие) символы в именах для групповых операций с файлами. Понятно, что зачастую изменения в имени файла автоматически влекут за собой его перемещение в другой каталог.

Name "C:\WORK\MyText.txt" As "C:\ARCHIVE\MyTextAr.txt"

Name "C:\WORK" As "C:\TMP\OLDFILES"

Копирование файлов (оператор FileCopy)

Копирование файлов осуществляется при помощи оператора FileCopy. Его параметры — это имя файла, подлежащего копированию, и имя нового файла-копии. Использование маскирующих символов “?” и “*” здесь недопустимо. Например:

FileCopy "C:\WORK\MyText.txt", "C:\WORK\MyBackUp.txt"

Удаления файлов (оператор Kill)

Для удаления файлов используют оператор Kill. Этот оператор позволяет использовать маскирующие символы, но, в отличие от команды Del, удаляет группу файлов без предупреждения. Например, следующий оператор удалит все текстовые файлы в каталоге C:\WORK:

Kill "C:\WORK\*.txt"

Операторы и встроенные функции языка VBA 291

Как открыть файл (оператор Open)

Прежде чем получить доступ к данным, содержащимся в файле в любом режиме, файл необходимо вначале открыть. Эта задача решается при помощи оператора Open. Синтаксис этого оператора выглядит следующим образом:

Open ИмяФайла For РежимДоступа As НомерФайла

Параметр РежимДоступа. В качестве параметра “РежимДоступа” необходимо использовать одно из ключевых слов, обозначающих различные режимы доступа. Список этих слов представлен в табл. П.6.

ТАБЛИЦА П.6. КЛЮЧЕВЫЕ СЛОВА, ОБОЗНАЧАЮЩИЕ РАЗЛИЧНЫЕ РЕЖИМЫ ДОСТУПА К ФАЙЛУ

Ключевое

Назначение

слово

 

 

 

Input

Открыть файл для чтения (ввода) в режиме последовательного доступа.

Output

Открыть файл для записи (вывода) в режиме последовательного доступа.

Append

Открыть файл для присоединения (вывода) в режиме последовательного дос-

 

тупа. При этом имеющиеся в файле данные сохраняются, а запись будет про-

 

изводиться в конец файла.

Random

Открыть файл в режиме произвольного доступа для записи или чтение в про-

 

извольной позиции файла.

Binary

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

ПРИМЕЧАНИЕ

В любом режиме кроме Input: если файл с указанным именем не существует, он будет автоматически создан без уведомления пользователя.

Параметр НомерФайла. В качестве параметра “НомерФайла” должно быть указано число — номер файла. Можно использовать произвольное целое число, не “занятое” другим файлом, но лучше, стобы избежать ошибок, использовать для получения такого числа функцию FreeFile — она возвращает новый, гарантированно не занятый номер файла. Указав этот номер, необходимо его сохранить, поскольку в дальнейшем посредством этого номера должны производиться все обращения к открытому файлу. Например, откроем файл C:\WORK\MyText.txt для чтения в режиме последовательного доступа:

Dim MyFileNum As Integer

...

MyFileNum = FreeFile()

Open "C:\WORK\MyText.txt" For Input As MyFileNum

Если требуется переписать файл сначала, то его необходимо открыть в режиме доступа For Output. При этом его предыдущее содержимое будет утеряно. Для того чтобы дописать новые строки в конец файла с сохранением прежнего содержимого, его следует открыть в режиме досту-

па For Append:

Open "C:\WORK\MyText.txt" For Append As MyFileNum

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

При открытии файла в режиме произвольного доступа имеет место ряд особенностей. В отношении записей файла возможны операции чтения и записи (ввода и вывода), при этом речь может идти только об одной из записей, как неделимом целом. Можно запретить доступ к некоторой записи для других программ (пользователей).

292 Приложение. VBA, как язык программирования: данные, синтаксис и функции

Доступ к любой записи осуществляется по ее порядковому номеру в файле. Значение переменной, играющей роль указателя текущей записи вместе со значением длины записи в файле, дает возможность поместить позицию ввода/вывода непосредственно на начало требуемой записи.

При использовании оператора Open для открытия файла в режиме произвольного доступа необходимо указать дополнительные параметры. Необходимо указать вид доступа (запись, чтение) и длину записи в файле. Например, если записать в файл данные в формате структуры Sotrudnik, то открывать такой файл необходимо было бы следующим образом.

Вначале необходимо заметить, что размер всех компонентов такой структуры должен быть фиксированным — в данном случае это означает, что строка Name должна быть строкой фиксированной длины:

Private Type Sotrudnik

PersNum As Long

Name As String * 50

BirthDay As Date

Salary As Currency

End Type

Затем, в коде процедуры можно объявить переменную типа Sotrudnik:

Dim MySotrudnik As Sotrudnik

Получив свободный номер для файла

MyFileNum = FreeFile()

можно, наконец, его открыть:

Open "C:\WORK\Sotrud.dat" For Random Access Read Write As MyFileNum _

Len=Len(MySotrudnik)

“Random Access Read Write” означает — “в режиме произвольного доступа, как для чтения, так и для записи”. С помощью параметра Len задается длина записи (ее можно вычислить при помощи одноименной функции Len, которая возвращает размер переменной в байтах). Неизвестно, сколько байт занимает в памяти переменная типа Sotrudnik, но знать этого и не требуется — в параметр Len попадет нужное значение.

Теперь можно записывать в файл C:\WORK\Sotrud.dat, который стал в этом примере “файлом номер MyFileNum”, значения любых переменных типа Sotrudnik или читать их оттуда.

Ввод данных из открытого файла (операторы Input, Line Input)

Чтение данных из открытого файла последовательного доступа осуществляется при помощи оператора Input или, если речь идет о текстовом файле, Line Input . Необходимо при этом указать номер, с которым открыт файл, а также переменную, в которую должны быть помещены введенные из файла данные. Вот как, например, можно прочитать первую строку из файла

C:\WORK\MyText.txt в строковую переменную MyTempString:

Dim MyFileNum As Integer

Dim MyTempString As String

...

MyFileNum = FreeFile()

Open "C:\WORK\MyText.txt" For Input As MyFileNum

...

Line Input MyFileNum, MyTempString

Операторы и встроенные функции языка VBA 293

Следующая строка текста будет прочитана из файла в переменную при следующем выполнении оператора Line Input. Обычно чтение всего файла обеспечивают при помощи циклической конструкции Do Until, указывая в качестве условия признак конца файла EOF. Например, следующий код прочитает в переменную MyTempString последовательно все строки из текстового файла, причем на каждом проходе цикла в переменной будет содержаться только одна, очередная строка текста:

Do Until EOF(MyFileNum)

Line Input MyFileNum, MyTempString

...

Loop

Вывод данных в открытый файл (операторы Write, Print)

Подобно тому, как ввод данных в последовательный файл может осуществляться при помощи двух операторов — Input и Line Input, для вывода в файл последовательного доступа используют операторы Write и Print. При этом Write составляет “пару” для Input (последовательный вывод произвольных данных), а для работы с текстовыми файлами используют Line

Input и Print.

Файл необходимо предварительно открыть для вывода с использованием ключевого слова

Output:

MyFileNum = FreeFile()

Open "C:\WORK\MyFile.txt" For Output As MyFileNum

В случае использования оператора Write достаточно указать номер файла и переменную, в которой содержатся данные для вывода:

Write MyFileNum, MyVar

Причем переменная MyVar может относиться к любому простому типу. Если это переменная типа Boolean, то в файл будет выведено #True# или #False#, если это переменная типа Date, то выведется текстовое значение даты в кратком формате, и так далее. В случае строковых значений лучше использовать оператор Print:

Print MyFileNum, “Переменная MyVar =”; MyVar

Можно помещать в строку вывода несколько значений (переменных или строковых констант), разделенных знаком “;”.

Вывод строк в текстовый файл

При выводе строковых значений в текстовый файл при помощи оператора Print можно использовать дополнительные возможности, позволяющие форматировать выводимый текст.

Оператор Width

Указывать длину выводимых строк можно при помощи оператора Width. Если перед первым использованием оператора Print задать

Width MyFileNum, 40

то при последующем выводе в файл с номером MyFileNum длина выводимых строк будет равняться 40 символам.

Функция Spc

Функция Spc используется в качестве одного из параметров оператора Print при выводе в последовательный файл. В результирующую строку будет вставлено заданное количество пробелов.

294 Приложение. VBA, как язык программирования: данные, синтаксис и функции

Например, в результате выполнения следующего оператора в выводимую строку будет вставлено 10 пробелов между словами “Фамилия” и “Сумма”:

Print MyFileNum, “Фамилия”; Spc(10); “Сумма”

Функция Tab

Наконец, позицию слова в строке можно задать напрямую, используя функцию Tab. Эта функция, помещенная в список вывода оператора Print, переносит позицию вывода в заданный символ строки. Например, в следующем примере слово “Сумма” в текстовом файле будет начинаться в 50-й позиции:

Print MyFileNum, “Фамилия”; Tab(50); “Сумма”

Закрытие файлов (операторы Reset, Close)

После того как все необходимые действия с открытым файлом завершены, его необходимо закрыть. Чтобы закрыть определенный файл, используют оператор Close с указанием номера файла:

Close MyFileNum

При помощи оператора Reset (без параметров) закрываются все открытые файлы:

Reset

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

При выполнении действий с файлом произвольного доступа обычно используют понятие текущей записи, то есть записи, к которой производилось обращение в последний раз, или первой записи файла, если обращений к записям еще не было. Если при последующем обращении номер требуемой записи не будет указан, то по умолчанию текущей станет следующая запись, то есть указатель текущей записи по умолчанию перемещается последовательно к последней записи в файле.

Оператор Seek

После того, как файл открыт в режиме произвольного доступа, можно поместить позицию ввода-вывода на любую запись файла — после этого операция записи или чтения будет выполняться именно для указанной записи. Чтобы сделать это, используют оператор Seek:

Open "C:\WORK\Sotrud.dat" For Random Access Read Write As MyFileNum _

Len=Len(MySotrudnik)

Seek MyFileNum, 10

Два параметра, следующие после Seek, — это номер, присвоенный файлу при его открытии и порядковый номер записи, на которую необходимо позиционироваться. В результате позиция вво- да-вывода окажется на 10-й записи файла. Если значение номера записи превышает количество записей в файле, то позиция ввода-вывода будет помещена в конец файла.

Функция Loc

Чтобы узнать, какая запись является в данный момент текущей, используют функцию Loc. После выполнения приведенных выше операций выражение Loc(MyFileNum) вернет значение

10.

Соседние файлы в папке Книги