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

358

 

Часть III. Visual Basic for Applications

F o u n d F ile s = F ou nd F ile s

+

1

ReDim P reserve F i le L i s t ( l

To F ou nd F ile s)

F ile L is t( F o u n d F ile s ) =

FileName & " * "

Loop

 

 

'Просмотр и обработка файлов

For i

=

1 То F o u n d F ile s

C a ll

P r o c e s s F ile s ( F ile L is t( i) )

N ext

i

 

End Sub

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

Файл рассмотренного выше примера b a tc h p ro c e s s in g .x ls m находится на прилагаемом к книге компакт-диске. Здесь же можно найти дополни­ тельные файлы t e x t O l. t x t , te x t0 2 . t x t и te x t0 3 . t x t .

Если нужно импортировать другие текстовые файлы, процедуру придется немного изменить. Соответствующие заданному критерию файлы находятся в массиве Found­ F ile s , а процедура использует для обработки файлов цикл F o r - N e x t. В цикле обра­ ботка выполняется процедурой P r o c e s s F ile s , показанной ниже. Эта простая проце­ дура использует метод O p e n T e xt для импорта файла и вставки в него пяти формул. Ко­ нечно, вы можете заменить такую процедуру собственной, соответствующей более конкретной задаче.

Sub P ro ce ssF ile s(F ile N a m e As S trin g )

' Импорт файла

 

 

 

W orkbooks. OpenText

F ileN am e: =FileN am e, _

O r ig in : =xlW indow s,

_

S ta rtR o w := l,

_

 

 

D ataType: = x lF ix e d W id th / _

F ie ld In fo :=

_

 

 

A r r a y ( A r ra y (0,

1 ),

A r r a y (3, 1 ), A r r a y (12, 1))

'Ввод формул суммирования

R a n g e ("D l").V a lu e

=

"A"

R a n g e ("D 2 ").V a lu e

=

"B"

R a n g e ("D 3 ").V a lu e

=

"C"

Range( "E l:E 3 ").F o rm u la

=

"=COUNTIF(В : B , D l) "

Range( " F I:F 3 ").F o rm u la

=

"=SUMIF(В : B ,D l#С: С )"

End Sub

 

 

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

©Дополнительныев главе 27. сведения о работе с файлами с помощью VBA можно найти

Полезные функции для программ VBA

В данном разделе представлены некоторые “практичные” функции, которые будут использоваться в ваших приложениях либо помогут в создании аналогичных функций. Эти функции наиболее полезны, когда вызываются из другой процедуры V B A . Следова­ тельно, они объявляются с ключевым словом P r iv a t e и не отображаются в диалоговом окне Excel М астер функций (Insert Function).

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

359

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

Примеры, описанные в этом разделе, можно найти на прилагаемом к книге компакт-диске в файле VBA u t i l i t y fu n c tio n s .xlsm .

Функция FileExists

Данная функция получает один аргумент (путь и имя файла) и возвращает ИСТИНА, если файл существует.

Private F u n c tio n

F ile E x is ts (fn a m e )

As Boolean

' Возвращает

ИСТИНА, если

файл

сущ ествует

F ile E x is ts

=

(D ir(fn a m e )

<>

"" )

 

End F u n c tio n

 

 

 

 

 

Функция FileNameOnly

Функция получает один аргумент (путь и имя файла) и возвращает только имя файла. Другими словами, функция “обрезает” путь.

Private F u n c tio n

FileNam eO nly(pnam e) As S trin g

' Возвращает

имя

файла

из стр о ки п уть /и м я файла

Dim temp

As

V a ria n t

 

le n g th

=

Len(pname)

 

temp =

S p lit(p n a m e ,

A p p lic a tio n . P a th S e p a ra to r)

FileNam eOnly =

tem p(U B ound(tem p))

End F u n ctio n

 

 

 

 

Функция использует функцию VBA S p lit, которая принимает строку (вместе с симво- лами-разделителями) и возвращает массив типа v a r ia n t, содержащий элементы, которые находятся между символами-разделителями. В рассматриваемом случае переменной temp присваивается массив, содержащий текстовые строки между A p p lic a tio n .P a th S e - parater (обычно в качестве разделителя используется обратная косая черта). Дополни­ тельные примеры использования функции S p l it будут рассмотрены далее.

Если в качестве аргумента указать с : \e x c e l f ile s\2 0 1 0 \b a c k u p \b u d g e t .x lsx , функция возвратит строку b u d g e t. x lsx .

Функция FileN am eO nly обрабатывает любой путь и имя файла (даже если файла не существует). Если файл существует, лучше воспользоваться следующей более простой функцией.

Private F u n c tio n

FileNam eOnly2(pname) As S trin g

FileNameOnly2

= D ir(pnam e)

End F u n ctio n

 

Функция PathExists

Функция получает один аргумент (путь) и возвращает ИСТИНА, если путь существует.

Private F u n c tio n

P athE xists(pnam e)

As Boolean

' Возвращает ИСТИНА, если путь

сущ ествует

I f D ir(pnam e,

v b D ire c to ry ) =

""

Then

P a th E x is ts

=

F alse

 

 

Else

=

(G etA ttr(pn am e)

And v b D ire c to ry ) = v b D ire c to ry

P a th E x is ts

End I f

 

 

 

 

End F un ction

 

 

 

 

360

Часть III. Visual Basic for Applications

Функция RangeNameExists

Функция получает один аргумент (название диапазона) и возвращает ИСТИНА, если в активной рабочей книге существует указанное название диапазона.

P riv a te

F u n c tio n RangeNameExists(nname)

As Boolean

'

Возвращает ИСТИНА,

если имя диапазона

сущ ествует

 

Dim n

As Name

 

 

 

RangeNameExists = F alse

 

 

For Each n In ActiveW orkbook.Nam es

 

 

I f

UCase(n.Name)

= UCase(nname) Then

 

 

RangeNameExists = True

 

 

 

E x it F u n c tio n

 

 

 

End I f

 

 

End

N ext

n

 

 

F u n c tio n

 

 

Ниже представлен еще один вариант этой функции. Она создает объектную перемен­ ную, использующую имя. Если имени не существует, генерируется ошибка.

P riv a te

F u n c tio n RangeNameExists2(nname)

As

Boolean

'

Возвращает ИСТИНА,

если

имя диапазона

сущ ествует

 

Dim

n

As

Range

 

 

 

 

 

On

E rro r

Resume N ext

 

 

 

 

Set

n

= Range(nname)

 

 

 

 

I f

E rr.N um ber = 0

Then RangeNameExists2

= True _

 

 

E lse

RangeNameExists2

= F alse

 

 

End

F u n c tio n

 

 

 

 

Функция SheetExists

Функция получает один аргумент (название рабочего листа) и возвращает ИСТИНА, если данный рабочий лист существует в активной рабочей книге.

P riv a te F u n c tio n S h eetE xists(snam e) As Boolean

'

Возвращает ИСТИНА,

если рабочий лист

сущ ествует в активной

1

рабочей

кн и ге

 

 

 

 

 

Dim

х As

O b je c t

N ext

 

 

 

On

E rro r

Resume

 

 

 

Set

x = A ctive W o rkb o o k . Sheets(snam e)

 

 

I f

E rr.N um ber =

0 Then

S h e e tE x is ts =

True _

 

 

E lse

S h e e tE x is ts

=

F alse

 

End

F u n c tio n

 

 

 

 

Функция WorkbooklsOpen

Функция получает один аргумент (название рабочей книги) и возвращает ИСТИНА, если данная рабочая книга открыта.

P riv a te

F u n c tio n WorkbooklsOpen(wbname)

As

Boolean

'

Возвращает ИСТИНА,

если

рабочая кн и га

откры та

 

Dim

х

As

Workbook

 

 

 

 

 

On

E rro r

Resume N ext

 

 

 

 

Set

x

= Workbooks(wbname)

 

 

 

I f

E rr.N um ber = 0

Then

W orkbooklsOpen

=

True _

 

 

E lse

W orkbooklsOpen

= F alse

 

 

End

F u n c tio n

 

 

 

 

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

361

Проверка принадлежности к коллекции

Следующая функция представляет собой образец “групповой” функции, с помощью которой можно определить, является ли объект членом коллекции.

Private

F u n c tio n Is In C o lle c tio n ( C o in As O b je c t, _

Item

As

S trin g )

As Boolean

Dim

Obj

As O b je c t

On E rro r

Resume

N ext

Set

Obj

= C o in (Ite m )

Is In C o lle c tio n

= Not Obj Is N o th in g

End F u n ctio n

 

Эта функция имеет два аргумента: коллекцию (объект) и элемент (строка), который может быть либо не быть членом коллекции. Функция будет создавать объектную пере­ менную, представляющую элемент коллекции. Если попытка увенчается успехом, функция возвратит True; иначе — False .

Функцию Is In C o lle c tio n можно использовать вместо трех других функций, пере­ численных в этой главе: RangeNameExists, S h e e tE x is ts и WorkbooklsOpen. Чтобы определить, содержится ли в активной рабочей книге диапазон Data, вызовите функ­ цию Is In C o lle c tio n с помощью следующего оператора:

MsgBox Is In C o lle c tio n (A c tiv e W o rk b o o k .N a m e s , "D a ta")

Для того чтобы определить, открыта ли рабочая книга с названием Budget, исполь­ зуйте следующий оператор:

MsgBox Is In C o lle c tio n (W o rk b o o k s , "b u d g e t. x ls x " )

Чтобы узнать, содержит ли активная рабочая книга рабочий лист Лист1, используйте следующий оператор:

MsgBox Is In C o lle c tio n (A c tiv e W o rk b o o k . W orksheets, "Л ист1")

Получение значения из закрытой рабочей книги

В VBA не существует метода получения значения из закрытого файла рабочей книги. Однако вы можете воспользоваться возможностью управления ссылками на файлы, ко­ торая предоставляется в Excel. В настоящем разделе описана функция VBA (G etV alue, показанная ниже), которая получает значение из закрытой книги. Эта задача выполняет­ ся в результате вызова макроса XLM, который появился в “доисторических” версиях Excel (до версии 5), но поддерживается до сих пор.

Private F u n c tio n

G e tV a lu e (p a th ,

f i l e ,

sh e e t,

r e f)

1 Выборка значения из закрытой рабочей книги

 

 

 

Dim arg

As

S trin g

 

 

 

 

 

 

 

 

 

1

Проверка

существования

файла

 

 

 

 

 

 

I f

R ig h t(p a th ,

1)

<> " \ "

Then

p a th

= p a th

&

" \ "

 

I f

D ir(p a th

&

f i l e )

=

""

Then

 

 

 

 

 

 

 

G etValue

=

"Файл

не

найден

"

 

 

 

 

 

 

E x it

F u n c tio n

 

 

 

 

 

 

 

 

 

 

End I f

 

 

 

 

 

 

 

 

 

 

 

 

1

Создание

аргумента

" ["

&

f i l e

& "] "

&

sheet

& " 1!" &

 

arg

=

& p a th

&

 

 

R a n g e (re f) . Range( " A l" ) .A d d re s s (,

,

x lR lC l)

1

Выполнение

макроса

XLM

 

 

 

 

 

 

 

 

GetValue

=

E xe cuteE xcel4 M a cro (a rg)

 

 

 

 

End F un ction