Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
курсовая / Источники / excel_2010_professionalnoe_programmirovanie_na_vba_RuLit_Me_412629.pdf
Скачиваний:
4
Добавлен:
27.09.2025
Размер:
22.97 Mб
Скачать
P e rs o n a l . x ls b
\X L S ta r t .

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

879

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

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

Выберите команду Формулы^ХЭпределенные имена^Диспетчер имен (Formulas1^ Defined Name^Name Manager). Прокрутите вниз список в окне диспетчера имен и про­ смотрите столбец Диапазон (Refers То). Удалите имена, которые ссылаются на другую рабочую книгу или содержат некорректные ссылки (например, #ССЫЛ!). Именно по этой причине чаще всего возникают “фантомные ссылки”.

Почему Excel сбоит при каждом запуске?

При запуске Excel открывается файл * . x lb , который включает настройки меню и панели инструментов. Если этот файл поврежден, это приведет к сбою при запуске Excel. В силу ряда причин размер этого файла может быть чрезвычайно большим. Ре­ зультатом является очередной сбой при запуске Excel. Обычно размер файла * . x lb со­ ставляет 100 Кбайт или менее.

Если при каждом запуске Excel происходит сбой программы, попробуйте удалить файл * .x lb . Для этого закройте Excel и найдите на жестком диске файл * .x lb . (Имя файла и его местоположение варьируются.) Создайте резервную копию этого файла, удалите исходный файл и попробуйте перезапустить Excel. Обычно Excel запускается в штатном режиме, создавая новый файл * . x lb .

Удаление файла * .x lb также влечет за собой удаление всех настроек меню и пане­ лей инструментов, которые находятся на вкладке Надстройки (Add-Ins).

Где можно найти примеры кода VBA?

В Интернете можно найти буквально тысячи примеров кода VBA. Для начала можете посетить мой веб-сайт, находящийся по следующему адресу:

h ttp ://sp read sh eetp ag e . com

Можно попробовать поискать нужные сведения на сайте Google: h ttp ://g o o g le . com

Редактор Visual Basic

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

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

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

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

880

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

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

Файл P e r s o n a l . x ls b

не будет существовать до тех пор, пока в него не записан хо­

тя бы один макрос.

 

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

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

Можно ли записать макрос, предназначенный для изменения пароля проекта?

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

Добавляемый новый модуль всегда начинается со строки O p tio n E x p l i c i t . Что она означает?

Если строка O p tio n E x p lic it находится в начале модуля, это означает, что необ­ ходимо объявлять все переменные, которые будут использоваться в пределах данного модуля (достаточно неплохая идея). Если требуется, чтобы эта строка не добавлялась в но­ вые модули, запустите VBE и выберите команду Tools^Options (Сервис1^Параметры). Перейдите на вкладку Editor (Редактор) и отмените установку флажка Require Variable Declaration (Явное описание переменных). После этого можно объявить переменные или переложить задачу определения типа данных на плечи интерпретатора VBА.

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

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

Можно ли удалить модуль VBA с помощью кода VBA?

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

W ith A ctive W o rkb o o k . V B P ro je ct

.VBComponent s . Remove .VBComponent s ( " M odule1") End W ith

Этот код может не работать в вашей версии Excel. См. следующий вопрос.

Я написал макрос, который добавляет код VBA в проект VB. При запуске в среде Excel появляется сообщение об ошибке. Что здесь неправильно?

В Excel 2002 появилась новая настройка: Доверять доступ к объектной модели проектов VBA. По умолчанию эта настройка отключена. Для ее изменения выберите команду Файл^Параметры Ехсе^Центр управления безопасностью (File^Excel Options^Trust Center). Щелкните на кнопке Параметры центра управления безопас­ ностью (Trust Center Settings) для отображения диалогового окна Центр управления

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

881

безопасностью (Trust Center). Щелкните на вкладке Параметры макросов (Macro Settings) и установите флажок Доверять доступ к объектной модели проектов VBA

(Trust Access to the VBA Project Object Model).

Как изменить параметры безопасности макросов для пользователя? Как отключить появление сообщения “эта рабочая книга содержит макросы”, когда открывается приложение?

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

Какработает опция X Ja erln terfa ceO n ly при защите рабочего листа?

При организации защиты рабочего листа с помощью кода VBA можно использовать следующий оператор:

A c tiv e S h e e t. P ro te c t U s e rln te rfa c e O n ly : =True

После выполнения этого оператора лист будет защищен, хотя и может изменяться с помощью макроса. Важно понимать, что эта установка не сохраняется вместе с рабо­ чей книгой. При повторном открытии рабочей книги следует опять выполнить оператор для повторной установки U s e r ln te r f aceO nly.

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

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

При использовании оператора & появляется сообщение об ошибке

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

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

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

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

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

Процедуры

Чем отличается процедура VBA от макроса?

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

29 Зак. 3107

882

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

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

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

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

Переменные, тип данных которых явно не определен, получают переменный тип дан­ ных ( V a ria n t) . При использовании таких переменных VBA автоматически изменяет тип переменной в соответствии с присвоенным значением. Это особенно полезно при получении значений из рабочего листа, так как заранее неизвестно, что содержится в ячейках. Рекомендуется явно объявлять тип переменной. Для этого используются опе­ раторы Dim, P u b lic и P r iv a t e . Применение переменных типов данных замедляет ра­ боту приложения и вызывает неэффективное использование ресурсов памяти.

Чем отличается массив переменного типа от массива значений переменного типа?

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

Dim

X As V a ria n t

X =

A r r a y (30, 40, 50)

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

Dim X (0 То 2) As V a ria n t

Несмотря на то что массив элементов переменного типа и массив, представленный переменной типа V a r ia n t , концептуально отличаются, способ доступа к элементам массива остается таким же.

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

В VBA можно добавить к имени переменной символ, который будет указывать тип этой переменной. Например, можно объявить переменную M yVar, имеющую тип целого числа (integer). Для этого к имени переменной добавляется символ %:

Dim MyVar%

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

I n t e g e r — %;

Long — &;

S in g le — !;

D o u b le — #;

C u rre n c y —

S t r i n g — $.

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

C h a n g e

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

883

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

Конечно, и для этого не обязательно программировать. Воспользуйтесь командой Excel Условное форматирование (Conditional Formatting), доступ к которой открыва­ ется в раскрывающемся списке кнопки Условное форматирование (Conditional For­ matting), находящейся в группе Стили (Styles) вкладки Главная (Ноте).

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

Рекомендуем воспользоваться событием C h a n g e объекта рабочего листа. Как только будут внесены изменения в какую-либо из ячеек, возникнет событие C h a n g e . Если мо­ дуль кода объекта S h e e t (Лист) содержит процедуру W o r k s h e e t _ C h a n g e , то при воз­ никновении события она будет выполняться автоматически.

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

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

Я создал процедуру обработки события (Sub W orkbookOpen), но она не запускает­ ся при открытии рабочей книги. В чем ошибка?

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

Еще одна причина появления подобной проблемы заключается в том, что в Excel от­ ключен запуск макросов. Проверьте соответствующие настройки в окне Центр управ­ ления безопасностью (Trust Center). Для доступа к этому окну используется диалого­ вое окно Параметры Excel (Excel Options).

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

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

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

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

Оператор Выполняемые функции

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

Eqv

Возвращает значение True, если аргументы формулы одновременно равны

 

True либо False

Imp

Поразрядная логическая импликация на основе двух аргументов (применяется.,

 

относительно редко)

Is

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

Like

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

Xor

Возвращает True только в том случае, когда один из аргументов равен True

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

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

Для этого необходимо воспользоваться методом Run объекта A p p lic a t io n . Пред­ ставленный далее оператор вызывает процедуру M a c ro l, которая расположена в рабо­ чей книге P e r s o n a l. x ls b .

Run "P e rs o n a l.x ls b !M a cro l"

Кроме того, можно создать ссылку на другую рабочую книгу. Для этого воспользуй­ тесь командой Tools'^References (Сервис^Ссылки) редактора VBA. После добавления ссылки можно вызывать процедуры из книги, на которую установлена ссылка, без указа­ ния имени этой книги.

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

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

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

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

Почему бы и нет? Для того чтобы открыть рабочую книгу автоматически, сохраните ее в папке \X L S ta r t . Чтобы автоматически запускать макрос из этой рабочей книги, создай­ те процедуру W orkbook_O pen в модуле кода объекта T h is W o rk b o o k (ЭтаКнига).

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

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

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

VBA не в состоянии это сделать, но вы сможете достичь поставленной цели с помо­ щью языка XLM. К счастью, XLM можно вызывать из VBA. Ниже приведен простой пример получения значения ячейки А1 из листа Лист1 рабочей книги myf i l e . x l s x , которая находится в папке с : \ f i l e s .

MsgBox E xe cuteE xcel4 M a cro ( " ' с : \ f i l e s \ [ m y f i l e . x ls x ] JIH C T I ' !R1C1")

Обратите внимание на то, что ячейка идентифицируется в формате R1C1.

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

885

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

Можно воспользоваться следующим оператором:

A ctive W o rkb o o k . Close SaveChanges: =False

Вы также вправе установить значение свойства S aved объекта W o rkbo ok равным T ru e . Для этого воспользуйтесь таким оператором:

A ctive W o rkb o o k . Saved = True

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

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

A p p lic a tio n .D is p la y A le r ts = F alse

Обычно после закрытия файла свойству D is p la y A le r ts присваивается значение T rue .

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

Для этого необходимо воспользоваться методом OnTim e объекта A p p lic a t io n . Это позволяет указать процедуру, которая будет выполняться в определенное время су­ ток. Когда процедура завершает свою работу, необходимо еще раз воспользоваться ме­ тодом OnTim e, чтобы запланировать следующий вызов.

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

Для предотвращения отображения макроса в диалоговом окне Макрос (Macro) (отображается в результате выполнения команды Вид^ Макросы^Макросы (View1^ Macros1^Macro)) объявите процедуру с помощью ключевого слова P r iv a te .

P riv a te Sub M yMacro()

Также можно добавить необязательный аргумент определенного типа данных.

Sub MyMacro (O p tio n a l FakeArg as Long)

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

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

Set C u rre n tC h a rt = S h e e ts ( "Л и ст1 ") . C h a rtO b je c ts ( 1 ) . C ha rt Fname = ThisW orkbook. P ath & " \M y c h a r t. g if"

C u rre n tC h a rt. E xp o rt F ile n a m e := Fname, F ilte rN a m e : ="G IF"

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

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