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

378

 

 

 

 

 

 

 

 

 

 

 

 

Часть

III. Visual Basic for Applications

P riv a te

D e cla re

P trS a fe

F u n c tio n

G e tP ro file S trin g A L ib _

_

"k e rn e l3 2 "

(ByVal

IpAppName

As S trin g ,

ByVal

lpKeyName As

S trin g ,

ByVal

 

lp D e fa u lt As

S trin g ,

ByVal Ip R e tu rn e d S trin g

As _

S trin g ,

ByVal

nS ize

As

Long)

As

Long

 

 

 

Sub D e f a u lt P r in t e r ln f o ()

255

 

 

 

 

 

 

 

Dim

strL P T

As

 

S trin g

*

 

 

 

 

 

 

 

Dim

R e s u lt

As

 

S trin g

 

_

 

 

 

 

 

 

 

C a ll

G e tP ro file S trin g A

 

 

254)

 

 

 

("W indow s",

"D e v ic e ", strL P T ,

 

 

 

R e s u lt

= A p p lic a tio n . T rim (s trL P T )

 

 

 

 

R e s u ltL e n g th

=

L e n (R e s u lt)

 

 

 

1)

 

 

 

Comma1

= I n S t r ( l,

R e s u lt,

R e s u lt,

1)

 

 

Comma2

= InS tr(C om m al

+ 1,

" , " ,

 

 

'Получение имени принтера

P r in te r = L e ft(R e s u lt, Commal - 1)

'Получение драйвера

D riv e r

=

M id (R e s u lt,

Commal + 1,

Comma2 - Commal - 1)

1 Получение

последней

ч а сти стр о ки

ус тр о й ств а

P o rt =

R ig h t(R e s u lt,

R e s u ltL e n g th

- Comma2)

'Создание сообщения

Msg

=

"П р интер :" & C hr(9) &

P r in te r & C hr(13)

Msg

=

Msg

&

"Д райвер:" & C hr(9) & D riv e r & C hr(13)

Msg

= Msg

Sc

"П о р т:" & C hr(9)

& P o rt

'Отображение сообщения

MsgBox Msg, v b ln fo rm a tio n , "Информация о принтере по умолчанию"

End Sub

Примечание

Свойство A c tiv e P r in te r объекта A p p lic a tio n возвращает название ак­ тивного принтера (и позволяет его изменить). Но не существует способа оп­ ределить используемый драйвер принтера или порт. Поэтому эта функция столь полезна.

На рис. 11.21 показано окно сообщения, полученное после выполнения этой процедуры.

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

Этот пример можно найти на прилагаемом к книге компакт-диске в файле p r in t e r i n f о . xlsm .

Определение текущего видеорежима

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

D e cla re

P trS a fe F u n c tio n

G etS ystem M etrics L ib _

"u se r3 2 " (ByVal n ln d e x

As

Long)

As Long

P u b lic

Const SM_CMONITORS

= 8 0

 

P u b lic

Const SM_CXSCREEN

=

0

 

P u b lic

Const SM_CYSCREEN

=

1

78

P u b lic

Const SM_CXVIRTUALSCREEN =

P u b lic

Const SM_CYVIRTUALSCREEN =

79

Sub D is p la y V id e o In fo ()

 

 

 

 

Dim

num M onitors As Long

 

 

 

380

 

 

 

 

Часть

III. Visual Basic for Applications

P riv a te

D e cla re F u n c tio n PlaySound L ib

"w in m m .d ll" _

 

A lia s

"PlaySoundA" (ByVal IpszName

As S trin g ,

_

 

ByVal

hModule As Long, ByVal dwFlags As Long) As Long

Const SND_SYNC = &H0

 

 

 

Const SND_ASYNC = &H1

 

 

 

Const SND_FILENAME = &H2 0000

 

 

 

Sub

PiayWAV()

 

 

 

 

WAVFi 1e

= " sound . wav"

 

 

 

 

WAVFile

= T hisW orkbook.P ath

& " \ " & WAVFile

 

 

C a ll

PlaySound(W AVFile, 0&,

SND_ASYNC Or SND_FILENAME)

End

Sub

 

 

 

 

 

В предыдущем примере WAV-файл воспроизводился в асинхронном режиме. Это означа­ ет, что выполнение кода продолжается во время воспроизведения звука. Чтобы прекратить выполнение кода во время проигрывания звука, воспользуйтесь следующим оператором:

C a ll PlaySound(W AVFile, 0&, SND_SYNC Or SND_FILENAME)

Воспроизведение MIDI-файла

Если звуковой файл имеет формат MIDI, то необходимо применить вызов другой API-функции. MIDI-файлы воспроизводит процедура P la y M ID I. Выполнение процеду­ ры S to p M ID I останавливает проигрывание MIDI-файла. В данном примере применяет­ ся файл x f i l e s .mid.

P riv a te D e cla re F u n c tio n

m ciE xecute L ib "w in m m .d ll" _

 

(ByVal IpstrCommand As

S trin g )

As

Long

Sub

P la y M ID I()

 

 

 

 

 

M ID IF ile

=

" x f ile s . m id "

" \ "

& M ID IF ile

M ID IF ile

=

T hisW orkbook.P ath &

m ciE xecute

(" p la y

" & M ID IF ile )

 

 

End

Sub

 

 

 

 

 

 

Sub

S to p M ID I()

 

 

 

 

 

 

M ID IF ile

=

" x f ile s . m id "

" \ "

& M ID IF ile

 

M ID IF ile

=

T hisW orkbook.P ath &

 

m ciE xecute

("s to p

" & M ID IF ile )

 

 

End

Sub

 

 

 

 

 

 

Воспроизведение звука с помощью функции рабочего листа

Функция Alarm, показанная ниже, предназначена для применения в формуле рабоче­ го листа. Она использует функцию Windows API для проигрывания звука, если ячейка соответствует определенному условию.

D e cla re

F u n c tio n PlaySound

L ib

"w in m m .d ll"

_

_

A lia s

"PlaySoundA"

(ByVal

IpszName As S tr in g ,

ByVal

hModule As Long,

ByVal

dwFlags

As

Long)

As Long

F u n c tio n

A la rm (C e ll,

C o n d itio n )

 

 

 

 

 

Dim WAVFile

As S trin g

 

 

 

 

 

 

 

Const SND_ASYNC = &H1

 

 

 

 

 

 

 

Const

SND_FILENAME = &H20000

 

 

 

 

 

I f E v a lu a te (C e ll.V a lu e

& C o n d itio n )

Then

 

 

WAVFile

= T hisW orkbook.P ath

& "\so u n d .w a v"

 

C a ll

PlaySound(W AVFile,

0&,

SND_ASYNC Or SND_FILENAME)

A larm

=

True

 

 

 

 

 

 

 

 

E lse

 

=

F alse

 

 

 

 

 

 

 

 

A larm

 

 

 

 

 

 

 

 

Глава 11. Приемы и методы программирования на VBA

381

End I f

End F un ction

Функция Alarm имеет два аргумента: ссылку на ячейку и “условие” (выраженное в виде строки). Например, следующая формула использует функцию Alarm для проигры­ вания WAV-файла, если значение в ячейке В13 больше или равно 1000.

=ALARM(B13, ">=1000")

Функция использует функцию VBA E v a lu a te для определения, соответствует ли значение ячейки заданному критерию. Если условие выполнено (и звук воспроизведен), функция возвращает ИСТИНА, в противном случае она возвращает значение ЛОЖЬ.

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

Рассмотренные в этом разделе примеры доступны на прилагаемом к книге компакт-диске в файле sound .xlsm .

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

Более простой способ использовать звук в функции — воспользоваться описанной ранее функцией s a y lt .

Чтение и запись параметров системного реестра

Многие приложения Windows используют системный реестр для хранения парамет­ ров (о реестре речь шла в главе 4). Процедуры VBA могут считывать значения из реестра и записывать в него новые значения. Для этого необходимы следующие объявления функцийWindows API.

Private

D e cla re

P trS a fe

F u n c tio n

RegOpenKeyA L ib

"ADVAPI32.DLL"

_

 

(ByVal

hKey

As Long,

ByVal

sSubKey As S trin g ,

_

 

 

 

 

 

ByRef

 

h ke yR e su lt

As

Long)

As

Long

 

 

 

 

 

 

 

Private

D e cla re

P trS a fe

F u n c tio n

RegCloseKey L ib

"ADVAPI32.DLL"

_

 

(ByVal

hKey

As Long)

As

Long

 

 

 

 

 

 

 

 

Private

D e cla re

P trS a fe

F u n c tio n

RegSetValueExA

L ib

"ADVAPI32.DLL"

_

(ByVal

hKey

As Long,

ByVal

sValueName As S trin g ,

_

 

 

 

ByVal

 

dwReserved

As

Long, ByVal dwType As Long, _

 

 

 

 

ByVal

 

sValue

As

S tr in g ,

ByVal

dwSize As Long) As Long

 

_

Private

D e cla re

P trS a fe

F u n c tio n

RegCreateKeyA

L ib

"ADVAPI32.DLL"

(ByVal

hKey

As Long,

ByVal

sSubKey As S trin g ,

_

 

 

 

 

 

ByRef

 

h ke yR e su lt

As

Long)

As

Long

 

 

 

 

 

 

 

Private

D e cla re

P trS a fe

F u n c tio n

RegQueryValueExA

L ib

"ADVAPI32.DLL" _

(ByVal

hKey

As Long,

ByVal

sValueName As S trin g ,

_

 

 

 

ByVal

 

dwReserved

As

Long,

ByRef lV a lu e T yp e

As

Long,

_

 

 

ByVal

 

sValue

As

S trin g ,

ByRef

IR e s u ltL e n As

Long)

As Long

 

 

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

Мною разработаны две функции-“оболочки”, упрощающие управление рее­

стром: G e tR e g is try и W rite R e g is try .

Их можно найти на прилагаемом

к книге компакт-диске в файле windows

r e g is t r y .xlsm . В этой рабочей

книге также находится процедура, которая демонстрирует запись и чтение данных из системного реестра.

382

Часть III. Visual Basic for Applications

Чтение данных реестра

 

Функция Get R eg is tr y

возвращает раздел из указанного места регистра. Она рас­

полагает тремя аргументами.

 

Root Key. Строка, представляющая ветвь реестра, к которой обращается функция. Данная строка может принимать одно из следующих значений:

HKEY_CLASSES_ROOT;

HKEY_CURRENT_USER;

НКЕY_LOCAL_MACHINE;

HKEY_USERS;

HKEY_CURRENT_CONFIG;

HKEY_DYN_DATA.

Path. Полный путь к разделу реестра, к которому обращается функция.

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

А теперь рассмотрим пример. Если необходимо найти графический файл, используе­ мый в качестве обоев рабочего стола, используйте функцию G e tR e g istr y следующим образом (обратите внимание, что аргументы не чувствительны к регистру).

RootKey

= "h k iy _ c u rre n t_ u s e r"

Path =

"C o n tro l P a n e l\D e skto p "

R egE ntry = "W a llp a p e r"

MsgBox

G e tR e g istry(R o o tK e y, P ath, R e g E n try ), _

v b ln fo rm a tio n , Path & "\R e g E n try "

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

Запись данных в реестр

Функция W r ite R e g istr y записывает значение в указанный раздел реестра. Если операция завершается успешно, функция возвращает ИСТИНА; в противном случае функция возвращает ЛОЖЬ. Функция W r ite R e g istr y получает следующие аргументы

(все они являются строками).

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

HKEY_CLASSES_ROOT;

HKEY_CURRENT_USER;

НКЕY_LOCAL_MACHINE;

HKEY_USERS;

HKEY_CURRENT_CONFIG;

HKEY_DYN_DATA.

Path. Полный путь в реестре. Если пути не существует, он будет создан.

RegEntry. Название раздела реестра, в который записывается значение. Если раздела не существует, он будет добавлен в реестр.

RegVal. Значение, которое записывается в реестр.

Глава 11. Приемы и методы программирования на VBA

383

Ниже приведен пример, в котором записывается значение, представляющее время и дату запуска Excel. Эта информация сохраняется в разделе настроек Excel.

Sub Workbook_Open ()

 

RootKey

= "h k e y _ c u rre n t_ u s e r"

 

Path =

" s o ftw a r e \m ic r o s o ft\o ffic e \1 4 . 0 \e x c e l\L a s tS ta rte d "

RegEntry = "D ateTim e"

 

RegVal

= Now()

 

I f W rite R e g is try (R o o tK e y , P ath,

R egE ntry, RegVal) Then

msg

= RegVal & " сохранено в

р еестре ."

E lse msg = "произошла ошибка"

End I f

MsgBox msg

End Sub

Если вы сохраните эту процедуру в личной книге макросов, то указанный параметр будетв дальнейшем автоматически обновляться при каждом запуске Excel.

Простой способ просмотра системного реестра

Если вы решили воспользоваться системным реестром для хранения и выборки настроек приложений Excel, не стоит обращаться к функциям Windows API. Лучше воспользоваться функциями VBA G e tS e ttin g и S a ve S e ttin g .

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

HKEY_CURRENT_USER\Software\VB and VBA Program S e ttin g s

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

Часть

Пользовательские

формы

Вэтой части...

Глава12

Создание собственных диалоговых окон

Глава13

Работа с пользовательскими формами

Глава14

Примеры пользовательских форм

Глава15

Дополнительные приемы работы с пользовательскими формами

13Зак. 3107