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

802

Часть VII. Дополнительные темы

Примечание

Описанная выше процедура имеет один недостаток: она не может импорти­ ровать такие значения, как символы кавычек или запятой. Кроме того, импортированные значения даты окружены символами решетки, например

#2007-05-12#.

Протоколирование операций в Excel

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

Следующая процедура, которая находится в модуле кода объекта ThisW orkbook (ЭтаКнига), выполняется каждый раз при открытии файла.

P riv a te

Sub

Workbook_Open()

Open

A p p lic a tio n .P a th

& " \e x c e lu s a g e .tx t" For Append As #1

P r in t

#1,

"Запущено "

& Now

Close

#1

 

 

End Sub

 

 

 

В результате выполнения этой процедуры в файл e x c e lu sa g e . t x t добавляется но­ вая строка. Эта строка содержит текущие значения даты и времени и может выглядеть следующим образом:

Запущено 1 1 /1 6 /1 0 9 :2 7 :4 3 РМ

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

P riv a te

Sub

W orkbook_B eforeC lose(C ancel

As Boolean)

Open

A p p lic a tio n .P a th

&

" \e x c e lu s a g e .tx t" _

For Append As #1

 

 

 

P r in t

#1,

"Остановлено

"

& Now

 

C lose

#1

 

 

 

 

End Sub

 

 

 

 

 

 

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

 

 

 

 

Рабочая книга под названием e x c e l

usage lo g .x s lm включает все опи­

 

санные в разделе процедуры и находится на прилагаемом компакт-диске.

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

Обратитесь к главе 19, где содержатся дополнительные сведения о процедурах обработки событий, таких как Workbook_Open и W orkbook_Beforeclose.

Фильтрация текстового файла

Пример данного раздела демонстрирует одновременную работу с двумя текстовыми файлами. Процедура F i l t e r F i l e , которая приводится ниже, читает текстовый файл ( i n f i l e . t x t ) и копирует строки, содержащие определенный текст, во второй тексто­ вый файл ( o u tp u t. tx t) .

Sub F i l t e r F i l e ()

Open ThisW orkbook. P ath & " \ i n f i l e . t x t " For In p u t As #1

Глава 27. Управление файлами с помощью VBA

803

Open A p p lic a tio n . D e fa u ltF ile P a th

& " \ o u t p u t . t x t " _

For

O utput

As

#2

 

 

T extT o F ind = "Январь"

 

 

Do U n t il

EOF(1)

 

 

 

L in e

In p u t

#1,

d a ta

Then

 

I f

I n S t r ( l,

d a ta , T extToF ind)

 

 

P r in t #2, d a ta

 

 

End

I f

 

 

 

 

Loop

 

 

 

 

 

 

Close

#1

 

 

 

 

 

End Sub

 

 

 

 

 

 

 

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

 

 

 

Пример,

рассматриваемый в этом

разделе, находится на прилагаемом

 

к книге компакт-диске в файле f i l t e r

te x t f i l e . xlsm .

Экспортирование диапазона в формат HTML

Рассматриваемый в этой главе пример демонстрирует порядок экспортирования диа­ пазона в файл HTML. Этот файл фактически представляет собой текстовый файл, вклю­ чающий специальные теги форматирования, описывающие способ представления ин­ формации в окне веб-браузера.

Что мешает использовать команду Excel Файл^Сохранить как веб-страницу

(File^Save As)? Процедура, приведенная в данном примере, имеет одно заметное пре­ имущество: она не создает “раздутый” код HTML. Например, процедура E x p o r t - ToHTML использовалась для экспорта диапазона из 70 ячеек. Результирующий файл име­ ет размер 2,6 Кбайт. Если выполнить команду Excel Файл^Сохранить как веб­ страницу (File^Save as Web Page), то результирующий файл будет иметь размер 15,8 Кбайт (в шесть раз больше).

С другой стороны, процедура E x p o r t ToHTML не сохраняет все параметры форма­ тирования ячеек. Она поддерживает только форматирование с помощью полужирного и курсивного начертания, а также выравнивание по горизонтали. Эта процедура также может применяться во многих ситуациях, а также служить основой для улучшений в дальнейшем.

Sub ExportToHTM L()

V a ria n t

Dim

Filenam e As

Dim

TDOpenTag

As

S tr in g , TDCloseTag As S trin g

Dim

C e llC o n te n ts

As

S trin g

Dim

Rng As Range

As

In te g e r

Dim

r As Long,

с

'Использование выделенного диапазона ячеек

Set

Rng

=

A p p lic a tio n . In te r s e c t( A c tiv e s h e e t. UsedRange, _

I f

S e le c tio n )

Then

Rng

Is

N o th in g

MsgBox

"Нечего

э ксп о р ти р о в а ть .", v b C r it ic a l

End

E x it

Sub

 

I f

 

 

 

'Получить имя файла

Filenam e = A p p lic a tio n .G e tS a v e A s F ile n a m e ( _

In itia lF ile N a m e := "m yrange. h tm ",

_

f i l e F i l t e r := "HTML F ile s ( * . h tm ),

* .h tm ")

I f Filenam e = F alse Then E x it Sub

804

 

 

 

 

Часть VII. Дополнительные темы

1

Открытие

те к с то в о го файла

#1

 

Open Filenam e For

O u tp ut As

'

Запись

те го в

 

 

 

P r in t

#1,

" <HTML>"

BORDER=0

CELLPADDING=3 >"

 

P r in t

#1,

"<TABLE

'Циклический обход я чеек

For г

= 1

To

Rng. Rows. Count

 

 

 

 

P r in t

#1,

"<TR>"

 

 

 

 

 

 

For

с

= 1 To Rng. Columns. Count

 

 

 

S e le c t

Case R n g .C e lls (r,

c ) .H o riz o n ta lA lig n m e n t

 

Case x lH A lig n L e ft

 

 

 

 

 

 

TDOpenTag = " <TD ALIGN=LEFT>"

 

Case x lH A lig n C e n te r

 

 

 

 

 

 

TDOpenTag = " <TD ALIGN=CENTER>"

 

Case x lH A lig n G e n e ra l

 

 

 

c ) ) Then

 

 

I f

Is N u m e ric (R n g .C e lls (r,

 

 

 

TDOpenTag

= "<TD ALIGN=RIGHT>"

 

 

E lse

 

 

 

 

 

 

 

 

 

End

TDOpenTag = " <TD ALIGN=LEFT>"

 

 

I f

 

 

 

 

 

 

 

 

Case x lH A lig n R ig h t

 

 

 

 

 

End

TDOpenTag

=

"<TD ALIGN=RIGHT>"

 

S e le c t

 

 

 

 

 

 

 

 

TDCloseTag

=

"</TD>"

 

 

 

Then

 

I f

R n g .C e lls ( r /

c ) .F o n t.B o ld

 

 

TDOpenTag = TDOpenTag & "<B>"

 

End

TDCloseTag

=

"< /B > "

& TDCloseTag

 

I f

 

 

 

c ) . F o n t. I t a

l i c Then

 

I f

R n g .C e lls (r,

 

 

TDOpenTag

= TDOpenTag

&

" < I> "

 

End

TDCloseTag

=

" < /I> "

& TDCloseTag

 

I f

 

 

 

 

 

 

 

 

 

C e llC o n te n ts

=

R n g .C e lls (r,

 

c ) .T e x t

 

P r in t

#1,

TDOpenTag & C e llC o n te n ts & TDCloseTag

N ext с

#1,

"</TR>"

 

 

 

 

 

P r in t

 

 

 

 

 

N ext r

 

 

 

 

 

 

 

 

 

 

'Закрытие таблицы

P r in t

#1,

"< /TABLE>"

P r in t

#1,

"</HTML>"

'Закрытие файла

Close #1

'Сообщение для пользователя

MsgBox Rng.Count & " Экспортируемые ячейки " & Filenam e End Sub

Процедура начинает свою работу с определения экспортируемого диапазона. Данный диапазон определяется как пересечение выделенного диапазона и используемой области рабочего листа. Это позволяет удостовериться, что не будет обрабатываться весь столбец или строка. Пользователь видит на экране диалоговое окно с просьбой указать имя фай­ ла. Далее открывается указанный текстовый файл. Основная работа выполняется в двух циклах F or-N ext. Код генерирует соответствующий код HTML (записывает необходи­ мые дескрипторы) и заносит в файл экспортируемые данные. Наконец, файл закрывает­ ся, и пользователь может увидеть окно сообщения с итоговой информацией.

Глава 27. Управление файлами с помощью VBA

807

П р и м еч ан и е

Хотя, начиная с версии Excel 2003, появилась улучшенная поддержка XMLфайлов, даже в Excel 2010 невозможно создание XML-файла на основе про­ извольного диапазона данных без наличия файла карты (схемы) для данных.

Ниже приведен код процедуры E xportT oX M L . Как видите, она имеет много общего с процедурой E xportT oH T M L, рассмотренной в предыдущем разделе.

Sub ExportToXM L()

 

V a ria n t

Dim

Filenam e As

Dim

Rng As Range

As Long

Dim

r As Long,

с

'Настройка диапазона

Set Rng = Range( "T a b le l[# A 1 1 ] ")

'Получение имени файла

Filenam e = A p p lic a tio n .G e tS a v e A s F ile n a m e ( _

In itia lF ile N a m e := "m y ra n g e .x m l",

_

f i l e F i l t e

r : ="XML

F ile s ( * . x m l) ,

* .x m l")

I f Filenam e

= F a lse

Then E x it Sub

 

'Открытие те ксто во го файла

Open Filenam e For O utput As #1

1 Запись

тего в

<xml>

P r in t

#1,

"<?xm l v e rs io n = "" 1 .0 " " encoding= _

""U T F -8

""

s ta n d a lo n e = "" y e s " "?>"

P r in t

#1,

"< E m ploye e List

x m ln s :x s i=

" " h t t p : //w w w .w 3. org/2001/X M LS chem a -instance" ">"

'Циклический обход ячеек

For г

= 2

To

Rng. Rows. Count

 

 

 

P r in t

#1,

"<Employee>"

 

 

 

For

с

= 1

To

Rng. Columns. Count

c)

&

"> ";

 

P r in t

#1,

"< "

Sc

R n g .C e lls (1,

 

I f

Is D a te (R n g . C e lls ( r , c ) ) Then

c) , "yyyy-m m -dd") ;

 

 

P r in t

#1,

Form at(R ng. C e lls ( r ,

 

E lse

 

#1,

R n g .C e lls ( r / c ) .T e x t;

 

 

End

P r in t

 

 

I f

#1,

" < /"

Sc R n g .C e lls (1,

c)

&

">"

 

P r in t

N ext с

#1,

"</E m ployee>"

 

 

 

P r in t

 

 

 

N ext r

 

 

 

 

 

 

 

 

 

'Закрытие таблицы

P r in t

#1,

"< /E m p lo y e e L is t> "

1 Закрытие

файла

Close

#1

 

'Сообщение для пользователя

MsgBox

Rng. Rows. Count - 1 & " записей экспортировано в " _

Sc

Filenam e

End Sub

 

 

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

 

Этот пример находится на прилагаемом компакт-диске в файле e x p o rt to

 

XML.xlsm.

812

 

Часть VII. Дополнительные темы

1 Информация

о

б азе данных

DBFullName

=

ThisW orkbook. Path & "\b u d g e t d a ta .a c c d b "

'Открытие соединения

Set

C on ne ction

= New ADODB. C on ne ction

Cnct

= "P ro vid e r= M icro so ft.A C E .O L E D B .1 2 .0 ;"

Cnct

= Cnct & "D ata Source=" & DBFullName & " ; "

C onnection.O pen

C o n n e c tio n S trin g : =Cnct

1 Создание набора

записей

Set

R ecordset = New ADODB. R ecordset

W ith

R ecordset

 

'Фильтр

 

Src

=

"SELECT *

FROM Budget

WHERE Ite m

=

'L e a se ' "

 

Src

=

Src

Sc

"and

D iv is io n =

'N . A m e rica '

"

 

Src

=

Src

Sc

"and

Year =

'2 0 0 8 '"

 

 

 

.Open

S o u rce := S rc, A c tiv e C o n n e c tio n : =C onnection

'

Запись имени

поля

 

 

 

 

 

For

Col =

0

To R e c o rd s e t. F ie ld s . Count

-

1

 

 

Range( " A l" ) . O f f s e t (0,

C o l).V a lu e =

_

 

 

Next

R e c o rd s e t. F ie ld s (C o l).N a m e

 

 

 

 

 

 

 

 

 

 

 

'Запись набора записей

 

Range( " A l" ) . O f f s e t (1,

0 ) . CopyFromRecordset

R ecordset

End

W ith

 

 

Set

R ecordset = N o th in g

 

 

C o n n e c tio n . C lose

 

 

Set

C on ne ction = N o th in g

 

 

End Sub

 

 

 

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

 

 

 

Рассматриваемый в этом разделе пример (sim p le ado exam ple .xlsm ) на­

 

ряду с файлом базы данных Access (budget

d a ta .a ccd b ) находится на

 

прилагаемом к книге компакт-диске. Также на этом компакт-диске можно

 

найти пример использования технологии ADO для запроса текстового файла

 

CSV. Файл sim p le ado

exam ple2 .xlsm использует большой CSV-файл под

именем m usic lis t . c s v .