Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
курсовая / Источники / excel_2010_professionalnoe_programmirovanie_na_vba_RuLit_Me_412629.pdf
Скачиваний:
4
Добавлен:
27.09.2025
Размер:
22.97 Mб
Скачать

320 Часть III. Visual Basic for Applications

Использование надстроек для хранения пользовательских функций

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

Предположим, у вас

есть пользовательская

функция ZapSpaces;

она хранится

в файле M yfuncs. xlsm .

Чтобы применить ее

в формуле другой

рабочей книги

(отличной от Myfuncs . xlsm), необходимо ввести следующую формулу:

 

= M yfuncs. x ls m ! Z a p S p a ce s(A l: C12)

 

 

Если вы создадите надстройку на основе файла Myfuncs . xlsm и эта надстройка бу­ дет загружена в текущем сеансе работы Excel, то ссылку на файл можно пропустить, введя следующую формулу:

= Z a pS pa ces(A l: С12)

Перекрестная ссылка

Подробнее надстройки будут рассмотрены в главе 21.

Предупреждение

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

Использование функций Windows API

VBA может заимствовать методы из других файлов, которые не имеют ничего обще­ го с Excel или VBА, например файлы DLL (Dynamic Link Library — динамически под­ ключаемая библиотека), которые используются Windows и другими программами. В ре­ зультате в VBA появляется возможность выполнять операции, которые без заимствован­ ных методов находятся за пределами возможностей языка.

Windows API (Application Programming Interface — интерфейс прикладного програм­ мирования) представляет собой набор функций, доступных программистам в среде Windows. При вызове функции Windows из VBA вы обращаетесь к Windows API. Мно­ гие ресурсы Windows, используемые программистами Windows, можно получить из фай­ лов DLL, в которых хранятся программы и функции, подсоединяемые в процессе выпол­ нения программы, а не во время компиляции.

API-функции и 64-разрядная Excel

Разработчики кода VBA должны учитывать особенности 64-разрядной версии Excel 2010. Если нужно обеспечить совместимость кода с 32-разрядными версиями (включая Excel 2007) и 64-разрядной версией Excel 2010, API-функции следует объяв­ лять дважды (используйте директивы компилятора, которые гарантируют корректность используемого объявления).

U serF orm , Л ист
Э таК нига ),

Глава 10. Создание функций

321

Например, приведенное ниже объявление совместимо с 32-разрядными версиями Excel, но выдает ошибку компиляции при использовании в 64-разрядной версии Excel 2010.

Declare F u n c tio n G e tW in d o w s D ire c to ry A L ib

" k e rn e l3

2 "

_

(ByVal lp B u f f e r As S t r in g , B yV al n S iz e

As Long)

As

Long

Во многих случаях для обеспечения совместимости объявления с 64-разрядной версией Excel достаточно воспользоваться ключевым словом P trS a f е вместо ключево­ го слова D e c la re . Приведенное ниже объявление совместимо как с 32-разрядной вер­ сией Excel 2010, так и с 64-разрядной версией Excel 2010.

Declare P t r S a f е F u n c tio n G e tW in d o w s D ire c to ry A

L ib

" k e rn e l3 2 " _

(ByVal lp B u f f e r As S t r in g , B yV al n S iz e As

Long)

As Long

Но при выполнении этого кода в Excel 2007 (и более ранних версиях) появится сооб­ щение об ошибке, поскольку ключевое слово P trS a f е в этих версиях не распознается.

В главе 26 будут описаны методы обеспечения совместимости объявлений APIфункций со всеми 32-разрядными версиями Excel и 64-разрядной версией Excel 2010.

Примеры функций Windows API

Прежде чем использовать функцию Windows API, ее необходимо объявить вверху программного модуля. Если программный модуль — это не стандартный модуль VBA (т.е. модуль для или то API-функцию необходимо объя­ вить как P r iv a t e .

Объявление API-функции имеет некоторую сложность — функция должна объяв­ ляться максимально точно. Оператор объявления указывает VBA следующее:

какую API-функцию вы используете;

в какой библиотеке расположена API-функция;

аргументы API-функции.

После объявления API-функцию можно использовать в программе VBA.

Определение папки Windows

В этом разделе представлен пример API-функции, которая отображает имя папки Windows (с помощью стандартных операторов VBA эту задачу порой выполнить невоз­ можно). Этот код будет неработоспособным в Excel 2007.

Ниже показан пример объявления API-функции.

Declare F u n c tio n G e tW in d o w s D ire c to ry A L ib

" k e rn e l3

2 "

_

(ByVal lp B u f f e r As S t r in g , B yV al n S iz e

As Long)

As

Long

Эта функция, имеющая два аргумента, возвращает название папки, в которой уста­ новлена операционная система Windows (с помощью одной лишь программы VBA такое действие выполнить невозможно). После вызова этой функции путь к папке Windows бу­ детхраниться в переменной lp B u ffe r, а длина строки пути — в переменной nS ize.

После вставки оператора D e c la re вверху модуля вы можете обратиться к функции G e tW in d o w sD ire cto ryA . Ниже следует пример вызова функции и отображения ре­ зультата в окне сообщения.

Sub ShowWindowsDir ()

Dim

W inP ath

As

S t r in g * 255

Dim

W in D ir

As

S t r in g

11 3ak. 3107

322

 

Часть

III. Visual Basic for Applications

W in P ath

=

Space (25 5)

 

W in D ir

=

L e ft(W in P a th , G e tW in d o w s D ire c to ry A

_

(W in P a th , L e n (W in P a th )))

 

MsgBox

W in D ir, v b ln fo r m a tio n , "Папка Windows"

End Sub

 

 

 

В процессе выполнения процедуры ShowWindowsDir отображается окно сообще­ ния с указанием расположения папки Windows.

Иногда требуется создать оболочку (wrapper) для API-функций. Другими словами, вы создадите собственную функцию, использующую API-функцию. Такой подход сущест­ венно упрощает использование API-функции. Ниже приведен пример такой функции VBA.

F u n c tio n W in d o w sD irO As S t r in g

'Возвращает путь к папке Windows

Dim W in P ath

As S t r in g * 255

W in P ath =

S p a c e (25 5)

W in d ow sD ir

=

L e ft(W in P a th , G e tW in d o w s D ire c to ry A _

(W in P ath ,

L e n (W in P a th )))

End F u n c tio n

 

 

После объявления этой функции можно вызвать ее из другой процедуры.

MsgBox W in d o w s D ir()

Можно также использовать эту функцию в формуле рабочего листа.

= W in d o w s D ir()

Компакт-диск

Пример файла windows d ir e c t o r y .x ls m можно найти на прилагаемом к книге компакт-диске.

API-функции выполняют действия, которые другим способом выполнить невозможно (или очень сложно). Если приложение должно найти путь к папке Windows, вы можете целый день искать и не найти в Excel или VBA функцию, которая выполняет эту задачу. Но зная, как получить доступ к функциям Windows API, вы без особого труда решите свою проблему.

Предупреждение

Не удивляйтесь сбоям в системе при использовании в VBA функций Windows API. Заранее сохраните свою работу перед тестированием.

Определение состояния клавиши <Shift>

Приведем еще один пример. Предположим, вы написали макрос VBA, который бу­ дет выполняться с помощью кнопки на панели инструментов. Необходимо, чтобы этот макрос выполнялся по-другому, если пользователь после щелчка на кнопке удержива­ ет клавишу <Shift>. Чтобы узнать о нажатии клавиши <Shift>, можно использовать API-функцию G e tK e y S ta te . Функция G e tK e y S ta te сообщает о том, нажата ли конкретная клавиша. Функция имеет один аргумент, n V ir tK e y , который представля­ ет код интересующей вас клавиши.

Ниже приведена программа, которая выявляет, что при выполнении процедуры обра­ ботки события B u t t o n _ C lic k была нажата клавиша <Shift>. Обратите внимание, что для определения состояния клавиши <Shift> используется константа (принимающая ше­

Глава 10. Создание функций

323

стнадцатеричное значение), которая затем применяется как аргумент функции G e t- KeyState. Если G e tK e y S ta te возвращает значение меньше 0, это означает, что кла­ виша<Shift> нажата; в противном случае клавиша <Shift> не нажата.

Declare F u n c tio n G e tK e y S ta te

L ib

"u s e r3 2 " _

(ByVal n V ir tK e y

As

Long)

As

In t e g e r

Sub B u tto n _ C lic k ()

 

 

 

 

 

Const VK_SHIFT

As

In t e g e r

=

&H10

I f G e tK e y S ta te (V K _ S H IF T )

<

0

Then

MsgBox

"Клавиша

< S h ift>

нажата"

Else

 

 

 

 

 

 

MsgBox

"Клавиша

< S h if t >

не

нажата"

End I f

 

 

 

 

 

 

End Sub

 

 

 

 

 

 

©

Компакт-диск

В рабочей книге k e y p r e s s . xlsm , которая находится на прилагаемом к кни­

ге компакт-диске, вы найдете примеры определения состояния следующих

 

клавиш (и их комбинаций): <Ctrl>, <Shift> и <Alt>.

Дополнительная информация о функциях Windows API

Работа с функциями Windows API может быть довольно сложной. Во многих книгах по программированию перечислены операторы объявления API-функций с соответст­ вующими примерами. Как правило, можно просто скопировать выражения объявления и использовать функции, не вникая в их суть. Большинство VBA-программистов в Excel рассматривают API-функции как панацею для решения большинства задач. В Интернете вы найдете сотни вполне надежных примеров, которые можно скопировать и вставить в собственную программу.

Перекрестная ссылка

©В главе 11 можно найти ряд дополнительных примеров использования функций Windows API.

Компакт-диск

На прилагаемом к книге компакт-диске находится файл w in 3 2 a p i.t x t , представляющий собой текстовый файл, содержащий объявления и кон­ станты Windows API. Можно открыть этот файл в текстовом редакторе и ско­ пировать соответствующие объявления в модуль VBA.