Уокенбах Формулы в Excel
.pdfИспользование окна проекта
Когда вы работаете в редакторе Visual Basic, каждая рабочая книга и надстройки, открытые в данный момент, считаются проектом. Проектом можно считать совокупность объектов, упорядоченных в виде структуры. Есть возможность раскрывать проект, щелкая на знаке "плюс" слева от имени проекта в окне проекта. Или же можно скрывать содержимое объекта, щелкая на знаке "минус" слева от имени проекта. На рис. 22.2 отображено окно проекта, содержащего список трех проектов (одна над-
стройка и две рабочие книги).
Если вы попытаетесь ввести изменения в проект, защищенный паролем, вам будет предложено ввести пароль.
;Щ Лист1(Лист1)
Каждый проект увеличивается в размере для отображения, по крайней мере одного объекта, называемого Microsoft Excel Object. Этот объект увеличивается в размере, включая элементы каждого рабочего листа и диаграммы на рабочей книге (каждый лист считается объектом), а также другой объект, называемый ЭтаКнига (который представляет объект рабочей книги). Если в проекте есть VBA-модули, листинг проекта также отображает
объект Modules, состоящий из модулей, представленных в нем. Проект также включает в себя объект, называемый Forms (который содержит объекты User Form), и объект, называемый Class Modules (состоящий из объектов модулей классов). Данная книга обращает внимание исключительно на стандартные VBA-модули и не рассматривает объекты, включенные в объекты Microsoft Excel, объекты пользовательских форм или объекты модулей классов.
Если вы пользуетесь Excel 2002, проект может состоять из другого объекта, называемого References. Этот объект состоит из перечня ссылок, которые используются проектом. Ссылки можно удалить или добавить с помощью команды Tools^References. В отличие от других объектов, представленных в окне проекта, объекты ссылок не имеют модулей кода, связанныхс ними.
Переименование проекта
По умолчанию все проекты называются VBAProject. В окне проекта имя рабочей книги появляется после имени проекта. Например, проект может быть представлен как: VBAProject (budget.xls)
Можно изменить имя проекта более наглядным и описательным. Для этого:
1.Выберите проект в окне проектов.
2.Убедитесь, что отображено окно свойств (нажмите <F4>, если оно скрыто).
3.Измените имя с VBAProject на другое.
После внесения изменений, в окне проекта будет отображено новое имя.
Добавление нового модуля VBA
В новой рабочей книге Excel нет никаких VBA-модулей. Для добавления таких модулей в проект, необходимо выбрать имя проекта в окне проекта и выбрать Inserts Module.
490 |
Часть VI. Разработка пользовательских функций |
^funcres (FUNCRESJCLA)
&VBAProject (total interestjd«)
2 , Microsoft ExcelObjects
m Лист! (Sheetl)
:%5этаКмига
S Modules
4$ VBAProfect (Книга2)
E Ш Microsoft ExcelObjects
; f p Лист1 (Лист 1)
IвЛист2(Лист2)
§ЛистЗ(ЛистЗ)ЭтаКнига
ВШ Modules
. 22.3. Для изменения имени VBA-модуля используйте окносвойств
При создании функций нужно следить, чтобы они находились в стандартном VBAмодуле, а не в окне кода для объекта листа или рабочей книги. Если окно кода функции не будет находиться в VBA-модуле, она не будет работать!
Переименование модуля
VBA-модули имеют имена, назначенные по умолчанию, такие как Modulel, Module2 и т. д. Для того чтобы переименовать VBA-модуль, необходимо выбрать его в окне проекта, а затем изменить имя, используя окно свойств (VBA-модуль имеет только одно свойство — Name). Если окно свойств не отображено на экране, нажмите <F4>. На рис. 22.3 представлен VBA-модуль, переименованный в MyModule.
Удаление VBA-модуля
Если вы хотите удалить VBA-модуль из проекта, выделите в окне проекта его имя и выберите в команду File1^Remove xxx, (где ххх — имя модуля). Вам будет задан вопрос, хотите ли вы экспортировать модуль перед удалением. При экспортировании создается резервный файл с содержимым текущего модуля. Модули можно импортировать и экспортировать в любой проект.
Глава 22. Введение вVBA |
491 |
Использование окнакода
За исключением объектов ссылки, каждый объект в проекте имеет связанное с ним окно кода. Обычно к этим объектам относят:
•саму рабочую книгу (объект называется Эта Книга в окнепроекта);
•рабочий лист или рабочую диаграмму (например, Лист1 или Диаграмма 1 в окне проекта);
•VBA-модуль;
•UserForm;
•модуль класса (особый тип модуля, который позволяет создавать новые классы модулей);
•ссылку (только в Excel 2000).
Вданной книге внимание обращается исключительно на VBA-модули, в которых хранятся пользовательские функции рабочих листов.
Сворачивание иразворачивание окон
В любое время в редакторе Visual Basic может быть открыто много окон кода. На рис. 22.4 представлен пример.
Окна кода очень похожи на окна рабочих листов Excel. Их можно сворачивать, разворачивать, скрывать, переорганизовывать и т. д. Многие считают, что легче развернуть окно кода, в котором ведется работа. Однако у вас может возникнуть потребность отобразить одновременно два и больше открытых окон с кодом. Например, для сравнения кодов двух модулей или копировании кода одного модуля в другой.
Сворачивание окна кода изменяет его область. Можно щелкнуть на кнопке Закрыть, находящуюся в верхней части строки заголовка для того, чтобы полностью закрыть окно.Для повторного его открытия необходимо дважды щелкнуть на соответствующем объекте в окнепроекта.
Нельзя закрыть рабочую книгу непосредственно из редактора Visual Basic. Следует перейти в окно Excel и закрыть его обычным способом.
492 |
Часть VI. Разработка пользовательскихфунк |
pup200addin(
Microsoft Excel Objects
-• •••£$ Forms
ЯAboutForm
cModules
«£ Modulel
|
VBAProJect(Bookl) |
|
|
- |
-'& MKrosoft Excel Objects |
|
|
|
|
Sheetl (Sheetl) |
|
|
|
%J ThisWorkbook |
|
К |
Г* |
Modules |
|
|
|
««MyModule |
|
{ £ VBAProiect (commission functta |
|
||
- |
' & |
Microsoft Excel Objects |
tioa COHHIS3ION2(Sales, Years) As Single |
|
|
Sheetl (Sheetl) |
|
|
|
ThteWorkbook |
|
И ? 1 Modules
Tler2 As Double - 0.105
Tier3 As Double - 0.12
Tier4 As Double - 0.14
азе Is >- 40000
C0MMISSION2 - Sales * Tier4 Case Is >- 20000
COHMISSION2 - Sales * Tier3 Case Is >- 10000
COKMISSION2 - Sales * Tler2 Case Is < 10000
C0MHISSION2 - Sales * Tierl End Select
COMHI3SION2 - COHHIS3ION2 + (COMHISSI0N2 • Years / End Function
Рис. 22.4. Загроможденное окно введения кода
Сохранение кода
Обычно модуль может содержать три типа кода:
•Процедура. Процедура представляет собой набор инструкций, выполняющих определенные действия. Например, процедура, объединяющая несколько частей рабочей книги в один краткий отчет.
•Функция. Функция представляет собой набор инструкций, которые возвращают одну переменную или массив. Функции можно использовать в формулах.
•Объявление. Объявление — это предоставление информация о переменных, которые используются в VBA-коде. Например, можно объявлять тип переменных, которые будут использоваться в будущем.
Вмодуле VB А может храниться любое количество процедур и объявлений.
Данная книга обращает внимание исключительно на функции, поскольку они являются единственным типом кода, который можно использовать для построения формул.
Ввод кода
В данном разделе описаны различные способы введения VBA-кода в окне кодов. Для функций окно кода всегда относится к VBA-модулю. Добавить код в VBA-модуль можно тремя способами:
Глава22. Введение вVBA |
493 |
•набрав его вручную с клавиатуры;
•используя средство записи макросов (можно записать макрос и впоследствии конвертировать его в VBA-код);
•скопировать код издругого модуля и вставить его в тот модуль, с которым вы работаете.
Введение кода вручную
Иногда самый простой путь решения проблемы является самым лучшим. Можно получить код VBA, введя его вручную с клавиатуры. Ввод теста и его редактирование в VBAмодуле осуществляется обычным способом. Можно выделить текст и скопировать его или вырезать и вставить в другом месте.
Пользуйтесь клавишей <ТаЬ> для того, чтобы делать отступы в строках, которые логически связаны одна с другой, — например, в блоках условных операторов If Endlf. Наличие абзаца является необязательным, но оно упрощает чтение кода.
Длина простого оператора в VBA зависит только от пользователя. Однако для повышения удобочитаемости можно преобразовать один длинный оператор в несколько коротких. Для этого заканчивайте строку пробелом и символом подчеркивания, затем нажмите клавишу ввода и продолжайте вводить код оператора в текущей строке. Таким образом, код будет представлен в виде оператора, расположенного в трех строках:
If IsNumeric(MyCell) Then_ Result = "Number" Else_ Result = "Non-Number"
Обратите внимание, что отступ добавлен в две последние строки оператора. Делать это необязательно, но помогает понять показать, что эти три строки представляют единыйоператор.
После ввода операторов редактор Visual Basic для улучшения представления кода выполняет следующие действия:
•Вставляет пробелы между операторами. Например, при вводе Ans=l+2 (без пробе-
лов), VB А преобразует это в следующий вид:
A n s = 1 + 2
• Приводит в порядок регистр букв ключевых слов, свойств и методов. Если ввести такой текст:
user=application.username редактор Visual Basic преобразует его в: user = Application.UserName
•Поскольку вид имен переменных не имеет значения, редактор Visual Basic упорядочивает все переменные, имена которых начинаются с одной и той же буквы таким образом, что регистр букв введенных вами переменных не имеет никакого значения. Например, если вы сначала определите переменную как myvalu e (все строчные) и потом введете переменную MyValue (в смешанном регистре), VBA поменяет все последующие экземпляры этой переменной на MyValue. Исключением этого может быть случай, когда вы определяете переменную с помощью оператора Dim или функционально подобным ему. Тогда переменная представляется в том виде, в каком и была объявлена.
•Проверяет операторы на наличие синтаксических ошибок. Если редактор Visual Basic найдет такого рода ошибки, он изменяет цвет строки и выводит предупреждающее сообще-
494 |
Часть VI. Разработка пользовательских функ |
ние. Можно настроить различные параметры поведения редактора Visual Basic в диалоговом окне Options (это можно сделать, выбрав команду меню Tools^Options).
Как |
и Excel, редактор Visual Basic имеет многоуровневые команды отмены дейст- |
вий |
и повторного выполнения команд. Поэтому, если возникла ситуация, прико- |
торой случайно удален важныйоператор, можно, щелкнув несколько раз на кнопке Undo (или нажав сочетание клавиш <Ctrl+Z>), возвратить потерю. Послевыполнения команды Undo, можно выбрать команду Edit^ReDo Delete (или щелкнуть на кнопке Redo) для выполнения недавно отмененных изменений.
Использованиесредствазаписи макросов
Другим способом добавления кода в VBA-модуль является запись его в виде макроса Excel. Как бы вы ни пытались, записать процедуру функции (тип процедуры, используемой в формулах рабочего листа) не представляется возможным. Все записанные макросы являются внутренними процедурами. Использование средств записи макроса поможет определить различные свойства, которые можно использовать при построении функций. Например, для записи выполняемых действий включите утилиту записи макроса во время изменения имени пользователя. Для этого выполните следующие операции:
1.Выберите Сервис^Макрос^Начать запись.
2.В диалоговом окне записи макроса оставьте без изменений стандартные настройки и щелкните на кнопке ОК начала для записи. Excel отобразит небольшую панель Остановить запись.
3.Выберите Сервис^Параметры.
4.В диалоговом окне параметров перейдите на вкладку Общие.
5.Внесите изменения (любые) в поле имени пользователя.
6.Щелкните на кнопке ОК для закрытия диалогового окнаопций.
7.Щелкните на кнопке Остановить запись на соответствующей панели.
8.Нажмите <Alt+Fl 1> для запуска редактора Visual Basic.
9.В окне проекта выберите проект, соответствующий рабочей книге.
10.Дважды щелкните на VBA-модуле, содержащем записанный код. Обычно, это будет модуль с наибольшим номером (например, Module3).
Далее вы увидите, что VB А-процедура будет иметь подобный вид: Sub MacrolO
xMacrol Macro
vMacro recorded 6/1-2001 by Bob Smith
With Application
UserName = "Robert Smith"
StandartFont = "Arial"
StandartFontSize = "10"
DefaultFilePath = "d:\xlfiles"
EnavleSound = False
RollZoom = False
End With
End Sub
Глава22.Введениев VBA |
495 |
Следует отметить, что здесь представлена внутренняя процедура, а непроцедура функции. Другими словами, нельзя использовать эту процедуру при работе с формулами. Однако, если проанализировать вид кода, то можно увидеть ссылку наобъект имени пользователя. Эту информацию можно использовать при создании функции. Например, следующая функция использует объект имени пользователя. Во время выполнения в формуле эта функция возвращает имя пользователя.
Function User()
USER = Application.UserName End Function
Для определения типов различных объектов можно проконсультироваться со справочной системой Excel, хотя использование средств записи макроса дает возможность решить проблему эффективнее, если наверняка не известно, что нужно искать. После того как предмет поиска наконец определен, можно обратиться к справочной системе за подсказкой.
Копирование VBA-кода
В этой главе вами уже рассмотрен процесс непосредственного ввода кода, а также запись действий для создания VBA-кода. Последний способ получения кода в VBA-модуле — его копирование из другого модуля. Например, если есть записанная функция для одного проекта,ее потом впоследствии можно использовать втекущем проекте. Вместо того чтобы вводить заново код, следует открыть рабочую книгу, сделать активным модуль и, используя обычные операции управления содержимым буфера обмена, скопировать код втекущий VBA-модуль.
Также можно копировать VBA-код издругих источников. Например, можно найти листинг наWeb-странице или в группе новостей. В таком случае нужно выделить в броузере текст, скопировать его вбуфер и затем вставить в модуль.
Сохранениепроекта
Как и в любой другой прикладной программе, в редакторе Visual Basic нужно периодически сохранять созданные данные. Для этого необходимо выбрать меню команду File^Save, нажать <Ctrl+S> или щелкнуть на кнопке сохранения, расположенную на стандартной панели.
Сохраняя проект, вы фактически сохраняете рабочую книгу Excel. Аналогично, если высохраняете рабочую книгу Excel, автоматически сохраняются изменения, внесенные врабочие книги проекта Visual Basic.
В редакторе Visual Basic нет команды File^Save As. Для сохранения проекта под другим именем необходимо запустить Excel и использовать команду Excel —Файл^Сохранить как.
Резюме
Вданной главе изложено введение в VBA, который представляет собой язык создания функций рабочих листов. В ней описаны различные компоненты редактора Visual Basic и рассмотрены методы создания кода вVBA-модуле.
Вследующей главе будут рассмотрены процедуры функций VB А.
496 |
Часть VI. Разработка пользовательскихфунк |
Глава23
Основы процедур функций
Вэтойглаве...
•Простой пример VBA-функции
•Работа процедуры функции
•Использование диалогового окна вставки функции
•Тестирование и отладка функций
•Резюме
Впредыдущих главах данной книги рассматривались функции рабочих листов и способы построения сложных формул с их помощью. Эти функции, так же как и другие, доступные в надстройке "Пакет анализа", обеспечивают большую гибкость при создании формул. Однако можно столкнуться с ситуациями, когда тяжело обойтись без пользовательских функции. В этой главе описаны случаи, в которых лучше применять пользовательские функции, созданные с помощью VBA. В ней также приведены методы тестирования и отладки пользовательских функций.
Для чего нужны пользовательские функции?
Наверняка, вы знакомы с функциями рабочих листов Excel — даже новичкам известно, как пользоваться большинством функций, такими как СУММ, СРЗНАЧ и ЕСЛИ. В Excel внедрено более 300 предопределенных функций, более того, после установки надстройки "Пакет анализа" становятся доступными дополнительные функции.
Можно использовать средства редактора Visual Basic для создания дополнительных функций, которые также известны как пользовательские функции. При существовании многих функций, доступных в Excel и VBA, можно задать вопрос, зачем же создавать новые функции. Ответ следующий: для упрощения работы и для предоставления формулам большей гибкости.
Например, можно создать функцию, значительно сокращающую стандартные формулы. Сокращенные формулы читабельнее и с ними намного проще работать. Однако важно понять, что пользовательские функции в формулах работают гораздо медленнее, чем встроенные. А в производительных системах скоростное различие часто протекает незамеченным.
Процесс создания пользовательской функции несложен. На самом деле многие наслаждаются созданием таких функций. Данная книга поможет вам в создании ваших собственных функций. В этой и в последующих главах вы увидите много разнообразных примеров функций, которые можно применить в своих целях.
Простой пример VBA-функции
Без лишней суеты я приведу вам простой пример функции VBA. Эта функция, названная USER, не предполагает использование каких-либо аргументов. Используя пользовательскую функцию, формула отображает имя пользователя с помощью символов верхнего регистра. Для создания этой функции необходимо:
Глава23. Основыпроцедур функций |
497 |
1.Начать работу с новой книгой (насамом деле этонеобязательно, но сейчас проще придерживаться этого этапа)
2.Нажать <Alt+Fl 1> для запуска редактора Visual Basic
3.Щелкнуть кнопкой мыши наимени рабочей книги в окне проекта. Если окно проекта скрыто, нажать <Ctrl+R>для его отображения
4.Выбрать Insert^Module для добавления VBA-модуля впроект
5.Ввести следующий код вокне кода:
Function USER()
г |
Возвращает имя пользователя |
|
USER = Application.UserName |
|
USER = UCase(USER) |
End |
Function |
|
Я приводил это предупреждение в предыдущей главе, ноего стоит повторить: при |
|
создании пользовательской функции нужно убедиться, что она находится в обыч- |
|
ном VBA-модуле, а не в модуле кода листа или книги. |
Опробуйте пользовательскую функцию. Перейдите в Excel (нажав <Alt+Fll>) и введите следующую формулу в любую ячейку рабочей книги.
=USER()
Задачи пользовательских функций
При совершенствовании пользовательских функций вам следует осознавать их назначение. Функция, используемая в формуле рабочего листа, должна быть пассивной. Другими словами, она не должна менять данные в рабочем листе.
Можно попробовать написать пользовательскую функцию, изменяющую формат ячейки. Например, может оказаться полезным иметь функцию, которая изменяет цвет текста в ячейке взависимости от значения ячейки. Как бы выне пытались, но такую функцию невозможно записать — все пробуют это сделать, но ни у кого не получается. Чтобы выне делали, функция всегда будет возвращать ошибку из-за попыток внести изменения врабочий лист. Нужно помнить, что функция может возвращать только переменную. Она не выполняет действия с объектами.
При правильном вводе VBA-кода, функция будет выполнена и имя пользователя отобразится (символами верхнего регистра) вячейке.
Если формула возвращает значение ошибки, убедитесь, что VBA-код пользовательской функции находится в VBA-модуле (модуль листа или книги не является объектом). Также необходимо проверить, находится лимодуль в проекте той книги, в которую вы пытаетесь ввести формулу.
Когда Excel вычисляет значения рабочего листа, он рассчитает ипользовательскую функцию. Каждый оператор в функции анализируется ивыполняется, а результат возвращается на рабочий лист. Функцию можно использовать неограниченное количество раз и применять ее любого значения ячеек.
Обратите внимание, что пользовательская функция работает так же, как илюбая другая внедренная функция. Ее можно вставлять в формулу с помощью команды меню Вставка^Функция или используя кнопку вставки функции в строке формул. В диалоговом окне вставки функции пользовательские функции представляются как функции, созданные пользователем. Как и другие функции, их можно использовать вболее сложных формулах. Например:
="Hello"&USER()
498 |
Часть VI. Разработка пользовательских функций |
Следующую функцию можно использовать для подсчета количества символов в имени:
=UJICTP(USER() )
Если вам не нравится то, что имя записано символами верхнего регистра, исправьте процедуру следующим образом:
Function USER()
1 |
Возвращает имя пользователя |
|
USER = Application.UserName |
End |
Function |
После внесения изменений вфункцию, возобновите работу Excel и нажмите <F9> для пересчета. Вкаждой ячейке, в которой используется функция пользователя, будет отображен отличный результат.
Работапроцедуры функции
Процедура функции имеет структуру. Ниже рассмотрены некоторые технические особенности применения пользовательской функции. Они представляют собой общие инструкции по объявлению функций, присваиванию им имен, использованию функций вформулах и заданию аргументов.
Объявления функции
Для объявления функции используется общепринятый синтаксис:
[Public | Private][Static] Function name{[arglist])
[As type] [statements]
[name = expression]
[Exit Function]
[statements]
[name = expression]
End Function
•Public (общий) показывает, что данная функция является доступной для других процедур в других модулях рабочей книги (необязательно).
•Private показывает, что данная функция доступна только для других процедур в одном и том же модуле (необязательно). При использовании ключевого слова Private функция не будет отображаться в диалоговом окне вставки функции.
•Static показывает, что значения переменных, объявленные вфункции, являются зарезервированными для вызовов (необязательно).
•Function является ключевым словом, отображающим начало функции(обязательно).
•Name может быть любым допустимым для переменной именем. Когда функциязаканчивает работу, ее результатом является значение, присваиваемое имени функции(обязательно).
ФArglist представляет собой список нескольких переменных, представляющих аргументы функции. Аргументы заключаются вкруглые скобки. Нужно использовать точку с запятой для разделения этих аргументов (наличие аргументов не обязательно).
ФТуре показывает тип данных, возвращаемых функцией (необязательно).
ФStatemen ts являются полноценными VBА-операторами (необязательно).
Глава23. Основыпроцедурфункций |
499 |
