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

2 семестр / vba_2002

.pdf
Скачиваний:
82
Добавлен:
09.04.2015
Размер:
9.9 Mб
Скачать

Экспортирование диапазона в текстовый файл

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

Обратите внимание на то, что процедура использует два оператора Write #. Первый завершается точкой с запятой, поэтому последовательность возврат каретки/перевод строки в файл не добавляется. Но для последней ячейки в строке второй оператор Write # не имеет точки с запятой, что приводит к завершению строки и добавлению следующей ячейки уже в новой строке.

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

Sub ExportRangeO

Dim Filename As String

Dim NumRows As Long, NumCols As Integer Dim r As Long, с As Integer

Dim Data

Dim ExpRng As Range Set ExpRng = Selection

NumCols = ExpRng.Columns.Count HumRows = ExpRng.Rows.Count Filename * "c:\windows\textfile.txt" Open Filename For Output As #1

For r = 1 To NumRows

For с = 1 To HumCols

Data = ExpRng.Cells(r, c)-Value

If IsNumeric(Data) Then Data = Val(Data)

If IsEmpty(ExpRng.Cells(r, c) > Then Data = "" If с <> NumCols Then

Write #1, Data;

Else

Write #1, Data End If

Next с Next г

Close #1

End Sub

Этот пример доступен на Web-узле издательства.

На рис. 27.3 показано содержимое результирующего файла.

Рис.27.3.Текстовыйфайл,которыйсоздан спомощьюкода VBA

ЧастьVII.Другиетемы

66:)

Импортирование текстового файла в диапазон

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

Sub

ImportRange()

 

 

 

Dim

ImpRng As Range

 

Dim Filename As

String

 

Dim r As Long,

с As Integer

 

Dim txt As String, Char As String * 1

 

Dim Data

 

 

 

Dim i As integer

 

 

Set

ImpRng = ActiveCell

 

On

Error Resume Next

 

Filename = "c:Windows\textfile.txt"

 

Open Filename For1 Input As #1

 

If Err <> 0 Then

 

 

 

MsgBox "Невозможно найти: " & Filename, vbCritical, "ОШИБКА"

 

 

Exit Sub

 

 

 

End

If

 

 

 

r = 0

 

 

 

с = О

 

 

 

txt = ""

 

 

 

Application.ScreenUpdating - False

 

Do Until EOF|1J

 

 

 

 

Line Input #1,

Data

 

 

For i = 1 To Len(Data)

 

 

Char = Mid(Data, i, 1)

 

 

If Char = "," Then 'запятая

 

 

ActiveCell.Offset(r, c) = txt

 

 

с = с + 1

 

 

txt =

""

 

 

Elself i - Len(Data) Then 'конец строки

 

 

If Char <> Chr<34) Then txt = txt & Char

 

 

ActiveCell.Offset(r, c> ~ txt

 

 

txt =

""

 

 

Elself Char <> Chr{34) Then

 

 

txt = txt & Char

 

 

End If

 

 

 

 

Next i

 

 

 

 

с = 0

 

 

 

 

r = r + 1

 

t

 

Loop

 

 

 

Close #1

 

 

 

Application.ScreenUpdating = True

End

Sub

 

 

 

 

 

Процедура, показанная выше, имеет недостаток: она не поддерживает значе-

 

 

ния, которые содержат символы кавычек или запятой. Кроме того, импортиро-

 

 

ванныеданныебудутокруженысимволаминомера,например:#2001-05-12*.

 

 

Данный примердоступенна Web-уэлеиздательства.

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

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

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

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

Private Sub Workbook_Open()

Open Application.Path & "\excelusage.txt" _ For Append As #1

Print #1, "Started " & Now Close #1

End Sub

Процедура добавляет новую строку в файл, который называется e x c e l u s a g e . t x t . Новая строка содержит текущую дату и время, и может выглядеть следующим образом:

Started 03/09/00 9:27:43 РМ

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

Private Sub Workbook_BeforeClose(Cancel As Boolean)

Open Application.Path & "\excelusage.txt" _ For Append As #1

Print #1, "Stopped " & Now

Close #1

End Sub

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

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

Sub FilterFile(}

Open "infile.txt" For Input As #1

Open "output.txt" For Output As #2 TextToFind = "January"

Do Until EOF(l)

Line Input #1, data

If InStr(1, data, TextToFind) Then Print #2, data

End If

Loop

Close End Sub

Этот пример доступен на Web-узле издательства.

Часть VII. Другие темы

671

Импортирование более 256 столбцов данных

Часто возникает необходимость в импортировании данных, которые превышают ограничение Excel в 256 столбцов. Если попытаться открыть такой файл с помощью команды Файл^Открыть, то Excel просто проигнорирует данные, которые находятся за пределами 256-го столбца (при этом предупреждениена экране не отображается)!

Следующая процедура является вариантом процедуры ImportRange, которая приводилась ранее в этой главе. Такая процедура выполняет чтение текстового файла и импортирует данные в новую рабочую книгу. Если данные содержат более 256-ти столбцов, то в рабочую книгу добавляются дополнительные листы.

Sub ImportLongLines()

1Импорт тер:стового файла объемом более 256 столбцов

Dim ImpRange As Range

Dim r As Long, с As Integer Dim CurrLine As Long

Dim Data As String, Char As String, Txt As String Dim i As Integer

Dim CurrSheet As Worksheet

1

Создание рабочей книги

с одним листом

 

Workbooks.Add xlWorksheet

 

 

Open ThisWorkbook.Path & "\longfile.txt" For Input As #1

 

r = 0

 

 

 

с = О

 

 

 

Set ImpRange * ActiveWorkbook.Sheets(1).Range("Al")

 

Application.ScreenUpda ting =

False

 

Чтение первой строки,

вставка

листа {если требуется)

 

CurrLine = CurrLine + 1

 

 

Line Input #1, Data

 

 

 

For i = 1 To Len(Data)

 

 

 

Char - Mid(Data, i, 1)

 

1

Столбцы закончились?

 

 

If с <> 0 And с Mod 2 5 6 - 0 Then

 

Set CurrSheet = ActiveWorkbook.Sheets.Add(after:= _

 

ActiveWorkbook.Sheets(ActiveWorkbook.Sheets.Count))

 

Set ImpRange =

CurrSheet,Range{"Al")

с= О

End If

1Конец поля?

If Char - "," Then ImpRange.Offset(r, c) = Txt

с= с + 1

Txt = ""

Else

1Пропуск символов кавычек If Char <> Chr(34) Then _

Txt = Txt SL Mid (Data, i, 1)

'Конец строки?

If i = Len(Data) Then

ImpRange.Offset(r, c) = Txt с = с + 1

672

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

 

 

Тхt = •"

 

 

 

End If

 

 

End If

 

 

Next i

 

 

 

Чтение

остальных данных

 

 

с = О

 

 

 

CurrLine - 1

 

 

Set ImpRange = ActiveWorkbook.Sheets(1).Range("Al")

 

r = r + 1

 

 

Do Until EOF(l)

 

 

Set ImpRange = ActiveWorkbook.Sheets(1).Range("Al")

 

CurrLine = CurrLine + 1

 

 

Line Input #1, Data

 

 

Application.StatusEar = "Обработка строки " & CurrLine

 

For i = 1 To Len(Data)

 

 

 

Char = Mid(Data, i, 1)

 

1

Столбцы закончились?

 

 

 

If с о 0 And с Mod 256 =

0 Then

 

 

с = О

 

 

 

Set ImpRange = ImpRange.Parent.Next.Range("Al")

 

 

End If

 

1

 

Конец поля

 

 

 

If Char = ", " Then

 

 

 

ImpRange.Offset(r, c)

= Txt

 

 

с = с + 1

 

 

 

Txt = ""

 

 

 

Else

 

'Пропуск символов кавычек If Char <> Chr(34) Then

Txt = Txt & Mid(Data, i, 1)

1

Конец строки?

 

If i = Len(Data) Then

 

 

ImpRange.Offset(r, c) = Txt

 

с = с + 1

 

 

Txt = "•

 

End

If

 

End If

 

Next

i

 

с = О

 

Set

ImpRange

= ActiveWorkbook.Sheets(1),Range("Al"}

r = r + 1

 

Loop

 

 

1 Очистка Close #1

Application.ScreenUpdating = True Application.StatusBar = False

End Sub

Эта процедура состоит из двух частей. Первая часть читает первую строку данных и до-

 

бавляет новые рабочие листы, если это необходимо. Вторая часть читает оставшиеся строки

 

текстового файла. Код предполагает, что первая строка имеет тот же формат, что и оставшая-

 

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

 

ЧастьVII.Другиетемы

673

Этот пример доступен на Web-узле издательства. Более того, вместе с примером предоставляется текстовый файл, содержащий 100 строк и 600 столбцов данных.

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

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

Ниже приведен исходный код процедуры ExportToHTML.

Sub ExportToHTML()

 

 

 

 

 

Dim ws As Worksheet

 

 

 

Dim Filename As

Variant

 

 

Dim TDOpenTag

As

String, TDCloseTag

As String

 

Dim CellContents

As

String

 

 

Dim Rng As Range

 

 

 

 

Dim r As Long,

с

As

Integer

 

1

Использование

выделенного диапазона

ячеек

Set Rng = Application.Intersect{ActiveSheet.UsedRange, Selection}

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

Filename = Application.GetSaveAsFilename( _ InitialFileName:="myrange.htm", _

fileFilter:="HTML Files(*.htm), *.htm") If Filename = False Then Exit Sub

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

Open Filename For Output As #1

1

Запись дескриптора <TABLE>

 

Print #1, "<TABLE BORDER=1 CELLPADDING=3>"

'

Циклический просмотр ячеек

 

For г = 1 To Rng.Rows.Count

 

Print #1, "<TR>"

 

 

For с - 1 To Rng.Columns.Count

 

TDOpenTag = "<TD ALIGN=RIGHT>"

 

TDC1oseTag = "</TD>"

 

If Rng.Cells(r,

c).Font.Bold Then

 

TDOpenTag = TDOpenTag & "<B>"

 

TDCloseTag = "</B>" & TDCloseTag

 

End If

 

 

If Rng.Cellsfr,

c ) . F o n t . I t a l i c Then

 

TDOpenTag = TDOpenTag & "<l>"

 

TDCloseTag = "</I>" & TDCloseTag

 

End If

 

 

CellContents -

Rng.Cells(r, c).Text

 

Print #1, TDOpenTag & CellContents & TDCloseTag

 

Next с

 

 

Print #1, "</TR>"

 

 

Next r

 

674

 

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

1

Закрытие

таблицы

 

Print #1,

"</TABLE>"

1

Закрытие

файла

 

Close #1

 

1

Создание

сообщения пользователю

MsgBox Rng.Count & " ячеек экспортировано в файл " & Filename End Sub

Этот пример доступен на Web-узле издательства.

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

На рис. 27.4 показан диапазон рабочего листа, а на рис. 27.5 представлено, как этот диапазон выглядит в броузере после экспорта данных в формат HTML.

Что мешает использовать команду Excel Файл'ФСохранить как Web страницу? Процедура, приведенная в данном примере, имеет одно заметное преимущество: она не создает "раздутый" код HTML. Например, процедура ExportToHTML использовалась для экспорта диапазона из 70 ячеек. Результирующий файл имеет размер 2,7 Кбанта. Если выполнить команду

Часть VII.Другиетемы

675

Excel ФайлоСохранить как Web страницу, то результирующий файл будет иметь размер 15,8 Кбайта (в шесть раз больше). С другой стороны, процедура ExportToHTML не сохраняет все параметры форматирования ячеек. Она поддерживает только форматирование с помощью полужирного и курсивного начертания. Кроме того, процедура ExportToHTML имеет еще один серьезный недостаток: она не поддерживает объединенные ячейки.

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

Резюме

В этой главе рассматривались способы управления файлами, хранящимися на жестком диске: стандартные команды VBA, использование объекта F i l e S e a r c h и применение объекта F i l e S y s t e m O b j e c t . Вы ознакомились с примерами использования кода VBA для чтения и записи текстовых файлов.

Следующая глава демонстрирует применение приложений VBA для генерации других приложений VBA.

676

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

Управление компонентами Visual Basic

В данной главе рассматривается тема, которая может оказаться довольно важной для многих читателей, — создание кода VBA для управления компонентами проектов. Интегрированная среда разработки VBA содержит объектную модель, которая предоставляет ключевые элементы проекта VBA, включая сам редактор. Можно создавать код VBA, который добавляет или удаляет модули, создает дополнитель-

ный код VBA или даже диалоговые окна UserForm.

Введение в IDE

IDE — это интерфейс OLE Automation для редактора Visual Basic Editor. Сразу после создания ссылки на библиотеку Visual Basic Extensibility Library (с помощью команды ToolsOReferences (Сервис^Ссылки)) разработчику предоставляется доступ ко всем объектам, свойствам и методам VBE, если также позволено объявлять объекты из классов членов IDE.

В диалоговом окне References можно выбрать опцию Microsoft Visual Basic for Application Extensibility. Это предоставит доступ к объекту VBIDE. Создание ссылки на объект VBIDE позволит объявлять объекты, которые входят в состав VBIDE, а также открывает доступ к константам, определенным внутри IDE. Отметим, что доступ к объектам ШЕ можно получать и не создавая ссылку, но при этом у вас не будет возможности использовать константы ШЕ, а также объявлять объекты, которые ссылаются на компоненты IDE.

Дополнительная информация об автоматизации OLE приведена в главе 20.

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

Создавать и удалять модули VBA. Вставлять код VBA.

Создавать пользовательские диалогоиые окна.

Добавлять элементы управлении в диалоговые окна UserForm.

Важные замечания для пользователей Excel 2002

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

Отображение этого сообщения зависит от параметров, установленных в диалоговом окне Excel Безопасность (доступ к которому можно получить с помощью команды Сервис^Макрос=*Безопасность). В этом окне опция Доверять доступ к Visual Basic Project по умолчанию не выставлена. Даже если пользователь разрешит запускать макросы, которые содержатся в рабочей книге, но этот параметр будет отключен, макрос не сможет внести изменения в проект VBA. Обратите внимание, что данный параметр применяется ко всем рабочим книгам и не может изменяться только для одной рабочей книги.

Прямой доступ к этому параметру получить невозможно. Единственный способ определить наличие в среде этого параметра — попытаться получить доступ к объекту VBProject, после чего проверить» существование ошибки, Следующий код иллюстрирует этот способ.

On

Error

Resume Next

Set

x

=

ActiveWorkbook.VBProject

If Err

<>

0 Then

MsgBox "Настройки безопасности не позволяют выполнить макрос."

Exit Sub

End If

He все примеры, приведенные в этой главе, предназначены для использования конечными пользователями. Большинство из них призваны упростить задачу разработчиков по созданию новых проектов. В таких проектах может возникнуть необходимость в отключении параметра Доверять доступ к Visual Basic Project.

Объектная модель IDE

Программирование ГОЕ требует четкого понимания объектной модели. Объектом верхнего уровня в иерархии объектов выступает VBE (Visual Basic Environment — Среда разработки Visual Basic). Как и в случае с объектной моделью Excel, VBE содержит другие объекты. Упрощенная версия объектной иерархии IDE выглядит следующим образом.

VBE

VBProject

VBComponent

678

Глава 28. Управление компонентами Visual Basic

Соседние файлы в папке 2 семестр