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

2 семестр / vba_2002

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

Как увеличить количество строк рабочего листа?

В данном случае ответ такой же, как и на предыдущий вопрос.

Существует ли возможность изменить цвет ярлыков листа?

Если используется Excel 2002, щелкните правой кнопкой мыши на ярлыке листа и выберите Цвет Ярлычка. Предыдущие версии Excel не предоставляют возможности изменения цвета ярлыка.

Существует ли возможность изменить шрифт ярлыков листа?

Да, но данная задача выполняется за пределами Excel. В Windows откройте папку Панель управления и выберите Экран. В диалоговом окне Свойства: Экран перейдите на вкладку Оформление. В списке Элемент выберите Полоса прокрутки. Воспользуйтесь стрелками для увеличения или уменьшения размера. Изменение этого параметра будет влиять и на другие приложения.

Можно ли изменить цвет и шрифт комментариев к ячейкам, который принят по умолчанию?

Да. В Windows в папке Панель управления выберите Экран. В диалоговом окне Свойства: Экран перейдите на вкладку Оформление. В списке Элемент выберите ToolTip (Экранная подсказка). Воспользуйтесь предоставленными элементами управления для изменения параметров шрифта. Изменение этого параметра повлияет и на другие приложения.

Что произошло с функцией составления карт в Excel 2002?

Лицензия Microsoft на это программное обеспечение была прекращена и больше не возобновлялась. В связи с этим все следы такой возможности {включая ссылки на нее в интерактивном справочном руководстве) были удалены. Таким образом, пользователи и разработчики, которые использовали это средство и обновили программу до Excel 2002, должны искать другое решение.

Существует ли возможность проигрывать звуки в Excel?

Да. Вы можете проигрывать файлы в форматах WAV и MIDI, но для этого необходимо воспользоваться функциями Windows API (дополнительная информация приводится в главе 11). Если вы используете Excel 2002, to обратитесь к новому объекту Speech. Представленный далее оператор при выполнении приветствует пользователя по имени (предполагается, что в компьютере установлена звуковая плата):

Application . Speech . Speak ("Hello" & Application.UserName)

При открытии рабочей книги Excel выдает запрос на обновление связей. Я просмотрел все формулы, но ни в одной из них связей нет. Это ошибка?

Скорее всего, нет. Связи могут существовать не только в формулах. Если в рабочей книге находится диаграмма, то щелкните на каждой из последовательностей диаграммы и внимательно рассмотрите формулы РЯД. Если формула ссылается на другую рабочую книгу, то связь найдена. Для того чтобы ее удалить, переместите данные диаграммы в текущую рабочую книгу и заново создайте диаграмму.

Если рабочая книга содержит диалоговые листы Excel 5/95, то следует выделить каждый из объектов диалогового окна, чтобы просмотреть связанную с ним формулу. Когда объект ссылается ка другую рабочую книгу, то эту ссылку можно удалить или отредактировать.

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

709

Выполните команду Вставка^Имя^Присвоить. Прокрутите список в диалоговом окне Присвоение имени и обратите внимание на поле Формула. Удалите те имена, которые ссылаются на другую рабочую книгу, или те, которые имеют неверные ссылки #ССЫЛ!. Таким образом, вы узнали о самых распространенных причинах возникновения "фантомных" связей.

Как распечатать полный путь и имя файла рабочей книги в колонтитуле страницы?

Если используется Excel 2002, то воспользуйтесь новой возможностью диалогового окна Параметры страницы. Когда это диалоговое окно отображено, перейдите на вкладку Колонтитулы и щелкните на кнопке Соэд;ать колонтитул. Будет отображено новое диалоговое окно, которое используется для добавления кода, обеспечивающего печать пути и имени файла рабочей книги в колонтитуле страницы. Обратите внимание: если рабочая книга не сохранена, то путь может оказаться неверным (в подобном случае используется путь по умолчанию для сохранения рабочих книг).

Для более старых версий Excel необходимо воспользоваться макросом VBA и обработать событие WorkbookBef o r e P r i n t . Например, разместите следующую процедуру в модуле кода объекта ЭтаКнига, Такой код будет печатать полный путь и имя файла рабочей книги в левой части верхнего колонтитула на каждой странице:

Private Sub Workbook_BeforePrint(Cancel As Boolean) For Each sht In ThisWorkbook.Sheets

sht.PageSetup.LeftHeader = ThisWorkbook.FullName Next sht

End Sub

Я слышал, что некоторые программы имеют "секретные" команды, которые отображают список разработчиков программы. Существуют ли такие команды в Excel?

Такие скрытые сообщения иногда называются "пасхальными яйцами" (Easter Eggs). Каждая версия Excel содержит собственное сообщение Easter Egg. Для того чтобы просмотреть такое сообщение в Excel 2000, выполните следующую последовательность действий.

1.Откройте новую рабочую книгу Excel.

2.Нажмите клавишу <F5>.

3.Введите X2000:L2000 и нажмите клавишу <Enter>.

4.После этого активной должна стать ячейка 2000.

5.Один раз нажмите клавишу <ТаЬ>, что приведет к перемещению курсора в столбец М.

6.Удерживайте клавиши <Ctrl> и <Shift> и щелкните правой кнопкой мыши на пиктограмме Мастер диаграмм на панели инструментов Стандартная. Некоторые пользователи сообщали, что щелкать необходимо левой кнопкой мыши.

После этого на экране должен быть отображен список разработчиков Excel 2000.

А как насчет такого сообщения в Excel 2002?

На момент выхода оригинала книги в печать таких сообщений в Excel 2002 обнаружено не было (если они вообще существуют). Для получения последней информации о Easter Egg в Excel посетите узел автора книги по адресу h t t p : //www. j - w a l k . c o m / s s / e x c e l / e a s t e r e g g . h t m . Microsoft получала довольно много жалоб, связанных с Easter Egg, поэтому очень возможно, что практика создания таких сообщений прекращена.

710

Глава 30. Часто задаваемые вопросы о программировании в Excel

Редактор Visual Basic

В Excel 95 мои модули кода VBA были расположены в рабочей книге, но если рабочую книгу открыть в Excel 97, то модули кода исчезнут.

Модули остались в рабочей книге, однако для того, чтобы их просмотреть и отредактировать, необходимо воспользоваться редактором VBE. Комбинация клавиш <Alt+Fll> применяется для переключения между Excel и редактором VBE.

Можно ли использовать программу записи макросов VBA для записи всех макросов?

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

Excel 95 предоставляла возможность установки "метки" в макросе, что позволяло записывать команды, начиная с указанного места в существующем макросе. Доступна ли эта возможность в поздних версиях?

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

Я создал универсальные макросы, которые должны быть доступны все время. Как следует обеспечить постоянный доступ к ним?

Можно сохранить макросы в персональной книге макросов. Это (обычно) скрытая рабочая книга, которая загружается в Excel автоматически. После записи макроса у вас появляется возможность сохранить его в персональной книге макросов. Ее файл P e r s o n a l . x l s находится в папке \ X L S t a r t .

Я не могу найти свою персональную книгу макросов. Где она?

Файл P e r s o n a l . x l s не будет существовать до тех пор, пока в него не записан хотя бы один макрос.

Каждый раз, когда макрос Excel 97 копирует рабочий лист, новый лист отображается в окне Project в редакторе VBE с именем

Sheeti 1111111111(Sheet1 (9)). Что происходит?

Эти странные имена являются "кодовыми названиями" объектов Worksheet . Если выполнять большое количество операций копирования рабочих, листов, то имена быстро "удлиняются". Помните, что название рабочего листа не может состоять из более чем 32 символов — в таком случае Excel аварийно завершит работу. Кодовое имя можно заменить на более описательное с помощью окна Properties редактора VBE. Эта проблема была исправлена в Excel 2000.

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

711

Я заблокировал проект VBA с помощью пароля и забыл пароль. Существует ли способ разблокировать проект?

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

Как можно записать макрос для изменения пароля проекта?

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

При добавлении новый модуль всегда начинается со строки Option Explicit. Что она означает?

Если строка O p t i o n E x p l i c i t находится в начале модуля, это означает, что необходимо объявлять все переменные, которые будут использоваться в пределах данного модуля (достаточно неплохая идея). Если требуется, чтобы эта строка не добавлялась в новые модули, запустите VBE и выберите Tools^Options (Сервис^Парамстры). Перейдите на вкладку Editor (Редактор) и сбросьте флажок Require Variable Declaration (Явное описание переменных). После этого можно объявлять переменные или переложить задачу определения типа данных на плечн интерпретатора VBA.

Почему мой код VBA отображается другим цветом? Можно ли изменить эти цвета?

VBA использует цвета для выделения различных текстов в коде: комментариев, ключевых слов, идентификаторов, операторов с синтаксическими ошибками и т.д. Эти цвета можно переопределять, изменять шрифты, которые используются для выделения, и т.д. Воспользуйтесь командой ToolS^Options (и перейдите на вкладку Editor Format (Формат редактора)) в редакторе VBE.

Мне необходимо удалить модуль VBA с помощью кода VBA. Возможно ли это?

Да. Следующий код удаляет модуль Modulel из активной рабочей книги.

With ActiveWorkbook.VBProject

.VBComponents.Remove .VBComponents("Modulel") End With

Этот код может не работать в Excel 2002. Дополнительная информация приводится далее.

Я создал макрос для Excel 2000, который добавляет код VBA к проекту. Когда я запустил его в Excel 2002, то получил сообщение об ошибке. Что я делаю неправильно?

Excel 2002 имеет новый параметр: Доверять доступ к Visual Basic Project. По умолчанию этот параметр отключен. Для того чтобы его включить, выберите Сервис^Макрос1 ^ Безопасность и перейдите на вкладку Надежные источники в диалоговом окне Безопасность.

772

Глава 30. Часто задаваемые вопросы о программировании в Excel

Как изменить параметры безопасности макросов для пользователя? Я хочу отключить появление сообщения "Эта рабочая книга содержит макросы", когда открывается приложение.

Изменение уровня безопасности с помощью кода VBA приведет к полной бесполезности всей системы безопасности макросов. Подумайте над этим.

При открытии рабочей книги я получаю стандартное предупреждение о наличии макросов. Но я удалил все макросы из этой рабочей книги! Это вирус?

Скорее всего, нет. Кроме удаления макросов, необходимо удалить и модуль VBA. который содержал эти макросы.

Я не понимаю, как работает параметр UserlnterfaceOnly при защите рабочего листа.

Для зашиты рабочего листа можно использовать следующий оператор.

ActiveSheet.Protect UserlnterfaceOnly:=True

Это приведет к защите листа, но макрос все же сможет вносить изменения в содержимое листа. Важно понимать, что этот параметр не сохраняется вместе с рабочей книгой. Когда рабочая книга открывается снова, необходимо повторно выполнить этот оператор, чтобы опять установить защиту U s e r l n t e r f a c e O n l y .

Как узнать, находится ли в рабочей книге макровирус?

В редакторе VBE активизируйте проект, который соответствует рабочей книге. Просмотрите все модули кода и обратите внимание на код VBA, который вам не знаком. Обычно код вируса плохо форматирован и содержит большое количество переменных со странными названиями. Еще одной возможностью является использование коммерческих программ для сканирования вирусов.

У меня возникли проблемы с оператором конкатенации (&) BVBA. Как только я пытаюсь конкатенировать две строки, то получаю сообщение об ошибке.

Скорее всего, VBA интерпретирует амперсант, как символ обьявления типа. Удостоверьтесь, что перед и после оператора конкатенации добавлены пробеды.

Не получается заставить работать символ продолжения строки в VBA (подчеркивание).

Для продолжения строки используются два символа: пробел и после него символ подчеркивания.

В Excel 95 я настроил модуль VBA на "режим максимальной невидимости", чтобы пользователи не могли просмотреть его содержимое. Когда рабочая книга открывается в Excel 97, модуль можно просматривать в VBE. Так и должно быть?

Я не знаю, должно ли так быть, но именно так все и происходит. Excel 91 и более поздние версии программы не поддерживают свойство xlVeryHidden .

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

713

После удаления большого количества кода VBA я обратил внимание на то, что размер файла XLS не уменьшился соответствующим образом. Почему?

Excel не всегда правильно очищает данные. Это иногда приводит к некоторым скрытым проблемам с переменными, которые больше не используются. Одним из способов решения этой проблемы является экспортирование модуля в файл, удаление модуля и его повторное импортирование.

Я распространил приложение XLS среди большого количества пользователей. В некоторых компьютерах процедуры обработки ошибок не работают. Почему?

Процедуры обработки ошибок не будут работать, если у пользователей установлен параметр Break on All Errors (Остановка при любой ошибке). Этот параметр доступен в диалоговом окне Options (на вкладке General (Общие)) редактора VBE. К сожалению, данный параметр невозможно изменить с помощью кола VBA. Для того чтобы избежать возникновения подобной проблемы, распространяйте приложение в виде надстройки XLA.

Процедуры

Какая разница между процедурой VBA и макросом?

Никакой. Термин макрос (macro) "пришел" из ранней эпохи развития электронных таблиц. Эти термины сейчас являются взаимно заменяемыми.

Что такое процедура?

Процедура — это набор операторов VBA, который можно вызвать по имени. Если операторы должны возвратить явный результат (например, значение) процедуре, которая их вызывала, то эта процедура называется функцией и объявляется как F u n c t i o n . В противном случае процедура объявляется как Sub.

Что такое переменный тип данных?

Переменные, тип данных которых явно не определен, получают переменный тип данных. При использовании таких переменных VBA автоматически меняет тип переменной в соответствии с присвоенным значением. Это особенно полезно при получении значений из рабочего листа, так как заранее не известно, что содержится в ячейках. Рекомендуется явно объявлять тип переменной. Для этого используются операторы Dim, P u b l i c и P r i v a t e . Применение переменных типов данных замедляет работу приложения и вызывает неэффективное использование ресурсов памяти.

Какая разница между массивом переменного типа и массивом значений переменного типа?

Ячейка памяти переменного типа может содержать любой тип данных: единственное значение или массив значений (массив переменного типа). Следующий код создает переменную, которая содержит массив.

Dim X As Variant

X = Array(30, 40, 50)

714 Глава 30. Часто задаваемые вопросы о программировании в Excel

В нормальном массиве могут находиться элементы определенного типа, включая нетипизированные элементы (имеющие переменный тип). Приведенный ниже оператор создает массив, который состоит из 3-х элементов переменного типа:

Dim X (0 То 2) As Variant

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

Что такое символ определения типа?

VBA позволяет добавить к имени переменной символ, который будет указывать тип этой переменной. Например, можно объявить переменную MyVar, имеющую тип i n t e g e r . Для этого к имени переменной добавляется символ %:

Dim MyVar%

Ниже приведен список символов определения типа, которые поддерживаются в VBA.

Integer

%

Single

!

Currency

@

Long

&

Double

#

String

$

Я написал функцию VBA, которая выполняется при вызове из другой процедуры. Но если ее использовать в формуле рабочего листа, она не работает. Что я делаю неправильно?

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

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

Я хотел создать процедуру, которая автоматически задает форматирование, зависящее от вводимых данных. Например, если вводится значение, большее 0, цвет фона ячейки становится красным. Возможно ли это?

Конечно, и для этого не обязательно программировать. Воспользуйтесь командой Excel Условное форматирование. Доступ к ней можно по.тушггь с помощью опции Формат^УслОВное форматирование.

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

Рекомендуем воспользоваться событием Change объекта рабочего листа. Как только будут внесены изменения в какую-либо из ячеек, возникнет событие Change. Если модуль кода объекта S h e e t (Лист) содержит процедуру Worksheet_Change, то при возникновении события Change она будет выполняться автоматически.

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

темы

775

Какие другие типы событий можно контролировать?

Огромное количество! Интерактивное справочное руководство содержит полный список доступных событий.

Я создал процедуру обработки события (Sub Workbook.Open), но она не запускается при открытии рабочей книги. Что я делаю неправильно?

Скорее всего, процедура находится не там, где должна быть. Процедуры обработки событий рабочей книги должны располагаться в модуле кода объекта ThisWorkbook (ЭтаКнига). Процедуры обработки событий рабочего листа должны находиться в модуле кода объекта S h e e t (Лист), что отображается в окне редактора VBE Project.

Я могу создать процедуру обработки событий для определенной рабочей книги. Можно ли создать процедуру обработки событий для всех открытых рабочих книг?

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

Я могу создавать формулы в Excel. Используются ли в VBA те же математические и логические операторы?

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

Оператор Выполняет

\Деление с остатком

Eqv

Возвращает значение True, если оба аргумента равны T r u e или оба аргумента равны F a l s e

imp

Логическую импликацию двух выражений

T-s

Сравнение двух объектов

Like

Сравнение строк с поддержкой групповых символов

х о г

Возвращает T r u e лишь в том случае, если один из аргументов равен T r u e

Как вызвать процедуру, которая находится в другой рабочей книге?

Для этого необходимо воспользоваться методом Run объекта Application. Представленный далее оператор вызывает процедуру Macrol, которая расположена в рабочей книге Personal.xls:

Run "Personal.xls!Macrol"

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

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

716

Глава 30. Часто задаваемые вопросы о программировании в Excel

Кроме того, если создать ссылку на рабочую книгу, которая содержкт определенные пользователем функции, то функцию также можно будет использовать без указания названия рабочей книги. Чтобы создать ссылку, необходимо воспользоваться командой Tools^References редактора VBE.

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

Возможно ли это?

Почему бы и нет? Для того чтобы открыть рабочую книгу автоматически, сохраните ее в папке \XLStart. Чтобы автоматически запускать макрос из этой рабочей книги, создайте процедуру Workbook_Open в модуле кода объекта ЭтаКнига.

У меня есть рабочая книга, в которой находится процедура Workbook_Open. Существует ли способ предотвратить автоматический запуск этой процедуры при открытии рабочей книги?

Да. Удерживайте клавишу <Shift> при выборе команды Файл^Открыть. Для того чтобы предотвратить выполнение процедуры Workbook_Bef oreClose, удерживайте клавишу <Shift> при закрытии рабочей книги. Использование клавиши <Shift> не позволяет предотвратить запуск этих процедур при открытии надстройки.

Может ли процедура VBA получить доступ к значению ячейки в неоткрытой рабочей книге?

VBA не в состоянии это сделать, но вы сможете достичь поставленной цели с помощью языка XLM. К счастью, XLM можно вызывать из VBA. Ниже приведен простой пример получения значения ячейки А1 ИЗ листа Sheetl рабочей книги myfile . xls, которая находится в папке с -. \f i l e s .

MsgBox ExecuteExcel4Macro {" ' с : \ f iles \ [myf i l e . xls ] Sheetl' .' RlCl") Обратите внимание на то, что ячейка должна быть представлена в формате R1C1.

Как предотвратить отображение сообщения о необходимости сохранения рабочей книги при закрытии с помощью VBA?

Можно воспользоваться следующим оператором: ActiveWorkbook.Close SaveChanges:=False

Вы также вправе установить значение свойства Saved объекта Workbook равным True. Для этого воспользуйтесь оператором

ActiveWorkbook.Saved = True

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

Более универсальным решением по отмене сообщений в Excel будет использование следующего оператора:

Application.DisplayAlerts = False

Как сделать так, чтобы макрос запускался регулярно в определенное время?

Для этого необходимо воспользоваться методом OnTime объекта Application . Это позволяет указать процедуру, которая будет выполняться в определенное время суток. Когда

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

717

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

Как сделать так, чтобы макрос не отображался в списке макросов?

Объявите процедуру с помощью ключевого слова Private: Private Sub MyMacro()

Также можно добавить необязательный аргумент определенного типа данных: Sub MyMacro (Optional FakeArg as Integer)

Существует ли возможность сохранения диаграммы в файле GIF?

Да. Приведенный ниже код сохраняет первую встроенную диаграмму рабочего листа Лист1 в виде файла формата GIF с называнием M y c h a r t . gif.

Set CurrentChart = Sheets ("Л>1ст1" 1 .ChartObjects (1) .Chart Fname = ThisWorkbook.Path & "\Mycnart.gif" CurrentChart.Export Filename:-Fname, FilterName:="GIF"

Доступны ли переменные одной процедуры VBA другим процедурам VBA? Что, если процедура находится в другом модуле или даже

вдругой рабочей книге?

Вданном случае речь идет об области действия переменной. Существует три типа действия: локальная, в пределах модуля к общедоступная (глобальная). Локальные переменные имеют самую узкую область действия и объявляются внутри процедуры. Локальная переменная используется только в пределах процедуры, в которой она объявлена. Переменные с областью действия уровня модуля объявляются в начале модуля, до объявления первой процедуры. Переменные с областью действия уроиня модуля используются во всех процедурах, которые определены в этом модуле. Общедоступные переменные имеют самую широкую область действия и объявляются с помощью к.кочевого слова P u b l i c .

Функции

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

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

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

К сожалению, нет.

718

Глава 30. Часто задаваемые вопросы о программировании в Excel

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