Уокенбах Формулы в Excel
.pdfСоздание надстроек
При создании функций, используемых достаточно часто, их можно разместить в файле надстройки. Основное преимущество подобной операции— предоставление возможности использования функциив формулах любой рабочей книги без примененияспецификатора именифайла.
Допустим, у вас есть функция ZAPSPACES и она находится в файле Myfuncs . xls. Вам нужно ввести следующую формулу:
=Муfuncs.xls!ZAPSPACES(Al:C12)
При создании надстройки на основе файла Myfuncs.xls и сохранения ее можно пренебречь ссылкой на файл и ввести формулу следующим образом:
=ZAPSPACES(A1:C12)
Создание надстроек на основе рабочей книги — это достаточно простая задача. Следующие инструкции описывают, как создать надстройку из обычного файла рабочей книги:
1.Создайте функции и убедитесь, что они работают надлежащим образом.
2.Активизируйте редактор Visual Basic и выберите рабочую книгу в окне проекта. Выберите Tools^xxx Properties и перейдите на вкладку Protection. Выставьте флажок опции Lock Project for Viewing и дважды введите пароль. Щелкните на кнопке ОК.
Эту операцию нужно выполнить только в том случае, если вы хотите предохранить ваш макрос от вмешательства в него или в диалоговые окна постороннего пользователя.
3.Возобновите работу Excel. Выберите команду Файл^Свойства, щелкните на вкладке Документ и введите краткое описательное название в поле Название, и более длинное описание в поле Заметки.
Этот этап не обязателен, но он делает надстройку проще в использовании, отображая описательный текст в диалоговом окне подключения надстроек.
4.Выберите в меню команду Файл^Сохранить как.
5.В диалоговом окне сохранения выберите из списка типов файла опцию Надстройка Microsoft Excel (*.xla) (рис. 23.10).
6.Если вы не хотите использовать папку, определяемую по умолчанию, можете указать другую.
7.Щелкните на кнопке Сохранить. Копия рабочей книги будет сохранена (с расширением .xla) как надстройка, а исходная рабочая книга останется открытой.
Папка: j j j Addlns
\Jti Журнал
| ^ документы
, к»- сетевое...
<^ •jtrj > 0 У- ft? f\
Имяфайпа: jtotal interest.xla |
3 | Сохранит», |
Тип файла*. |
ШШШШШшШШт |
Рис. 23.10. Сохранение рабочей книги как надстройки
510 |
Часть VI. Разработка пользовательских функций |
Несколько словобезопасности
Компания Microsoft никогда не рекламировала продукт Excel как создающий приложения с безопасным исходным кодом. Особенности пароля не обеспечивают достаточный уровень защиты Excel от несанкционированного доступа других пользователей к приложениям, которые вы хотели бы сохранить недоступными. Существует несколько программ по взлому таких паролей. Средства защиты в Excel 2002 более надежные, чем в предыдущих версиях, но существует возможность, что их тоже можно взломать. Если вы абсолютно не уверенны в том, можно ли допускать разглашение вашего кода или формул, то Excel — далеко не лучшая программа для разработки.
Рабочая книга, преобразуемая в надстройку, должна, по крайней мере, содержать хотя бы один рабочий лист. Например, если рабочая книга состоит только из диаграмм Excel 5/95, то опция Надстройка Microsoft Excel (*.xla) в диалоговом окне Сохранение документа будет недоступна.
В предыдущих версиях Excel (до Excel 97) для изменения надстроек нужно было открывать оригинальные XLS-файлы, вносить изменения и повторно сохранять надстройку. В Excel 97 и более поздних версиях в этом нет необходимости. До тех пор, пока надстройка не защищена, в нее можно вносить изменения в редакторе Visual Basic и затем сохранять эти изменения. В случае, если надстройка защищена, необходимо вводить пароль для снятия защиты. Поэтому, при работе в Excel 97 и более поздних версиях, в хранении XLS-версии надстройки нет необходимости.
После создания надстройки можно установить ее, используя стандартную процедуру: выберите Сервис=>Надстройки и щелкните в появившемся диалоговом окне на кнопке Обзор. Укажите расположение файла * . xla.
Резюме
Вэтой главе рассмотрены специальные методы, которые могут пригодиться при разработке эффективных функций. Вами рассмотрены типы аргументов, которые можно использовать. В главе описаны способы добавления пользовательской функции в категорию диалогового окна вставки функции. В данной главе также представлены методы отладки функций, инструкции по созданию надстроек, необходимые для внешнего хранения функций.
Вследующей главе речь пойдет об основных способах программирования на языке VBA.
Глава 23. Основыпроцедурфункций |
511 |
Глава 24
Принципы программирования наУВА
Вэтом главе...
•Пример процедуры функции
•Использование комментариев в коде
•Использование переменных, типов данных и констант
•Использование выражений присвоения
•Использование массивов
•Использование встроенных функций VBА
•Управление выполнением кода
•Работа с диапазонами
•Резюме
Вэтой главе описываются основные элементы языка и принципы программирования на VBA. Если до изучения VBA вами уже изучался другой язык программирования, то большая часть излагаемого материала будет вам известна. Но в VBA имеются некоторые нюансы, поэтому даже опытные программисты смогут найти для себя что-то новое.
Пример процедуры функции
Для начала рассмотрим пример процедуры функции. Функция, которая называется REMOVESPACES, принимает текстовый аргумент и возвращает его без пробелов. Например, в приведенном ниже коде функцией REMOVESPACES возвращается значение T h i s i s t e x t .
=REMOVESPACES("Thisistext")
Чтобы написать такую функцию, откройте модуль VBA и в окне кода напишите следующую процедуру:
Function REMOVESPACES(cell) As String
1Удаляет пробелы из ячейки Dim CellLength As Integer Dim Temp As String
Dim i As Integer CellLength = Len(cell) Temp = ""
For i=l To CellLength
Character = Mid(cell,i,1)
If Character <> Chr(32) Then Temp = Temp&Character
Next i
REMOVESPACES = Temp
End Function
Глава24. Принципы программирования на VBA |
513 |
Рассмотрим подробно каждую строку кода:
• Первая строка функции называется строкой объявления. Обратите внимание, что процедура начинается с ключевого слова Function, после которого стоит название функции (REMOVESPACES). В функции используется один аргумент (cell); имя аргумента заключается в круглые скобки. Выражение As S t r i n g определяет тип возвращаемого значения функции. Слово As вводить необязательно.
•Вторая строка является обычным комментарием (необязательная строка) — на это указывает апостроф, стоящий в начале строки. Комментарий описывает, что делает функция.
•В следующих трех строках используется ключевое слово Dim для объявления трех переменных, используемых в процедуре: CellLength, Temp и i. Описывать переменные не обязательно, но (как показано далее) это хороший тон в программировании.
•В следующей строке процедуры переменной CellLength присваивается значение. Для определения длины содержимого аргумента (cell) используется оператор Len.
•В следующей строке создается переменная Temp, которой присваивается пробел.
•В следующих четырех строках описан цикл For-Next. Операции между For и Next
выполняются столько раз, сколько задано значением CellLength. Например, предположим, что аргумент c e l l содержит строку Bob Smith. Операции в цикле повторятся девять раз, по одной итерации для каждого символа в строке.
•В цикле переменная Character содержит текущий символ, который описывается
функцией Mid. Оператор If определяет, является ли символ пробелом (функция Chr
вVBA эквивалентна функции СИМВОЛ в Excel, а аргумент 32 соответствует пробелу). Если символ не является пробелом, то он подставляется в конец строки, сохраняемой
впеременной Temp. Если символ оказался пробелом, то переменная Temp не изменяется и процедура переходит к следующему символу. При желании можно заменить этот оператор следующим:
If Character о " ") Then Temp = Temp&Character
•По завершении цикла в переменной Temp содержатся все символы, которые сначала были указаны в аргументе c e l l , кроме пробелов.
•Строка с переменной Temp присваивается имени функции. Эта строка является значением, возвращаемым функцией.
•Процедура Function завершается оператором End Function.
Впроцедуре REMOVESPACES используются следующий распространенные элементы языка VBA:
•Комментарии (в начале строки стоит апостроф)
•Объявление переменных
•Три оператора присвоения
•Три встроенные функции VBA (Len, Mid и Chr)
•Циклическая структура (For-Next)
•Условная структура If-Then
•Объединение строк (с помощью оператора &)
514 |
Часть VI. Разработка пользовательских функ |
Неплохо для первого раза, да? Примечания в этой главе содержат более подробную информацию об этих и других принципах программирования.
Функция REMOVESPACES, описанная здесь, предназначена только для учебных целей. Того же результата можно добиться при использовании функции ПОДСТАВИТЬ, которая намного рациональнее. Например, следующая формула удаляет все пробелы в тексте в ячейке А1.
=ПОДСТАВИТЬ(А1;" ";"")
Использование комментариев вкоде
Комментарием называется текст описания, вставленный в код. В VBA текст комментария не выполняется. Используйте комментарии для описания своих действий (поскольку предназначение некоторых операций VBA не всегда очевидны).
Комментарий можно начать с новой строки или написать их в одной строке с операциями, но только после них. Признаком комментария служит апостроф. VBA игнорирует любой текст до конца строки, который находится после апострофа. Исключениями являются апострофы внутри кавычек. Например, в следующем операторе нет комментария, хотя в нем содержится апостроф:
Result = "Can't c a l c u l a t e "
В следующем примере написана процедура функции VBA с тремя комментариями: Function MYFUNCO
'Эта функция не делает ничего кроме возвращения
х=0 'х представленного константой Возвращение результата
MYFUNC = х End Function
Созданную функцию можно проверить, включив в нее дополнительные операторы. Не удаляйте впоследствии операторы тестирования, а преобразуйте их в комментарий, поставив в начале строки апостроф. Во время выполнения процедуры VBA проигнорирует подобные инструкции. Чтобы преобразовать комментарии обратно в операторы, удалите апостроф.
На панели инструментов Edit находятся две очень полезные кнопки. Выделите группу операторов и воспользуйтесь кнопкой Comment Block, чтобы преобразовать операторы в комментарии. Кнопка Uncomment Block преобразует группукомментариев обратно воператоры.
Использование переменных, типов данных иконстант
Переменной называется место в памяти компьютера, у которого есть имя. Переменные могут быть различных типов данных— от простых значений логического типа Boolean (TRUE или FALSE) до больших значений с двойной точностью (читайте в следующем разделе). Переменной задается значение с помощью оператора присвоения, которым является знак равенства.
Далее приведено несколько примеров использования операторов присвоения для различных типов переменных. Имена переменных находятся слева от знака равенства. Значение каждой переменной находится справа от знака равенства.
Глава 24. Принципыпрограммирования на VBA |
515 |
X =1
InterestRate = 0.075 LoanPayoffAmount = 243 089 DataEntered = False
x = x + 1
MyNum = YourNum * 1.25 HallOfFamer = "Tony Gwynn" DateStarted = #3/14/2001#
В VBA есть множество зарезервированных слов, их нельзя использовать в качестве имен переменных и процедур. Если попытаться использовать одно из этих слов, появится сообщение об ошибке. Например, хотя зарезервированное слово Next может быть описательным именем переменной, следующий оператор вызовет синтаксическую ошибку:
Next = 132
К сожалению, иногда сообщения о синтаксических ошибках ни о чем не говорят, т.е. непоказательны. Предыдущий оператор вызывает синтаксическую ошибку в Excel 2002 (ранние версии Excel могут выдать другой тип ошибки). Поэтому если оператор присвоения вызывает ошибку, которая не имеет смысла, обратитесь к справочной системе, чтобы проверить, не имеет ли имя переменной специального назначения в VB А.
Определение типов данных
VBA облегчает программистам жизнь, потому что он автоматически регулирует характеристики данных. Тип данных говорит о том, в каком виде данные хранятся в памяти — как целые или действительные числа, строковые переменные и т.д.
Хотя VBА автоматически заботится о типизации данных, все не так просто — при этом понижается скорость выполнения формул и снижается эффективность использования памяти. Чтобы достичь оптимальной производительности выполнения операций, следует разобраться с типами данных. В принципе, лучше всего работать с данными, которые занимают меньше всего байт в памяти. Когда VBА работает с данными, скорость выполнения операций зависит от количества байт, находящихся в распоряжении VBA. Другими словами, чем меньше памяти используется данными, тем быстрее VBA получает и оперирует данными. В табл.24.1 приведены встроенные типы данных VBA.
Тип данных |
Объем |
Диапазон принимаемых значений |
|
занимаемой |
|
|
памяти |
|
B y t e |
1байт |
От 0до 255 |
Boolean |
2байта |
TRUE илиFALSE |
Integer |
2 байта |
От-32768до 32 767 |
bong |
4 байта |
От-2 147 483 648 до 2 147483 648 |
single |
4 байта |
От-3.402823Е38 до -1.401298Е-45 (для отрицательных значений); от |
|
|
1.401298Е-45 до 3.402823Е38 (для положительных значений) |
Double |
8байт |
-1,79769313486231Е308до -4,94065645841247Е-324 (дляотрица- |
|
|
тельных значений); от 4,94065645841247Е-324до |
|
|
1,79769313486231Е308 (для положительных значений) |
Currency |
8 байт |
От-922337203685477,5808 до 922 337 203685477,5808 |
516 |
Часть VI.Разработка пользовательских функций |
|
|
Окончаниетабл.24.1 |
Тип данных |
Объем |
Диапазон принимаемых значений |
|
занимаемой |
|
|
памяти |
|
Decimal |
14 байт |
±79 228 162 514 264 337 493 543 950 335 без запятой; |
|
|
±7,9228162514264337493543950335 с28 символами после запятой |
Date |
8 байт |
С 1 января 0100 года по 31 декабрь 9999 года |
Object |
4 байта |
Любая связь с объектом |
String |
10 байт+ |
От 0до примерно 2 миллиардов |
(переменная |
длина строки |
|
длина) |
|
|
String |
Длина строки |
От 1 до примерно 65 400 |
(фиксированная |
|
|
длина) |
|
|
Variant |
16 байт |
Любое числовое значение вплоть до диапазона значений двойной |
(с числами) |
|
точности |
Variant |
22 байта + |
От 0до примерно 2 миллиардов |
(с символами) |
длина строки |
|
Объявление переменных
Переменную, перед использованием в процедуре, нужно объявить. В объявлении переменной указывается ееимя итип, при этом очевидны два преимущества:
•Процедуры выполняются быстрее, а память используетсярациональнее. Исполь-
зуемый поумолчанию тип данных — v a r i a n t — приводит кмногократным проверкам, занимающим много времени ипамяти. Если в VBA указать специальный тип переменной, то переменную ненужно проверять; под нее выделяется столько памяти, сколько нужно для хранения ее значений.
• Если использовать оператор Option Explici t, молено избежать проблем неправильного написания именпеременных. Предположим, чтоиспользовалась необъявленная переменная CurrentRate. В определенном месте процедуры вводится выражение CurrentRate = ,075.Из-за пропущенного объявления переменной функция может возвратить неправильныйрезультат. Читайте врезку "Привычка объявления переменных".
Переменные объявляются с помощью ключевого слова Dim. Например, в следующей строке описывается переменная Count типа integer .
Dim Count As Integer
Оператором Dim можно объявить сразу несколько переменных. Например,
Dim х As Integer, у As Integer, z AsInteger Dim First As Long, Last AsDouble
В отличие от других языков, VBA не позволяет указать тип данныхдля группыпеременных, разделяя их запятыми. Например, следующее выражение— хотя и правильное — не описывает все переменные как integer:
Dim i, j, k AsInteger
В этом выражении только переменная к описана как integer. Чтобыдля всехпеременных указать тип integer, следует объявить их следующим образом:
Dim i As Integer, j As Integer, k As Integer
Глава 24.Принципыпрограммирования наVBA |
517 |
Если тип переменной не указывается, то VBA использует стандартный тип данных — v a r i a n t . Данные, описанные как v a r i a n t , ведут себя весьма изменчиво: они меняют тип в зависимости от выполняемых действий. В следующей процедуре показано, как переменная принимает различные типы данных:
Function VARIANT_DEMO ()
MyVar = "12 3" MyVar = MyVar / 2
MyVar = "Answer: " & MyVar VARIANT_DEMO = MyVar
End Function
Привычка объявления переменных
Чтобы приучить себя объявлять все используемые переменные, первым оператором вмодуле VBA используйте следующий:
Option E x p l i c i t
Этот оператор останавливает выполнение процедуры, как только VBA встречает необъявленную переменную. VBA выводит сообщение об ошибке (Compileerror: Variable not defined) и предлагает объявить переменную, прежде чем выполнение процедуры продолжится.
Чтобы удостовериться, что оператор option E x p l i c i t вводится в каждом новом модуле VBA,
выставьте опцию Require Variable Declaration на вкладке Editor диалогового окна Options.
В примере функции VARIANT_DEMO переменная MyVar описывается как трехсимвольная строка, выглядящая как число. Затем эта "строка" делится на два, и MyVar приобретает числовой тип данных. Потом MyVar добавляется к строке, что преобразует ее снова в строку. Функция возвращает строку: Answer: 61,5.
Использование констант
Значение переменной может — и часто так и происходит — изменяться в процессе выполнения процедуры (поэтому она и называется переменная). Иногда необходимо сослаться на имя переменной или строки, которая никогда не меняется;другими словами, сослаться на константу.
Константа описывается оператором Const. Вот несколько примеров объявленияконстант:
Const NumQuarters as Integer = 4
Const Rate = .0125, Period = 12
Const CompanyName as String = "Acme Snapholytes"
Во второй строке две переменные объявляются одним оператором, но он не указывает их тип. Следовательно, обе константы имеют тип v a r i a n t . Поскольку константа никогда не меняет свое значение, для нее нужно обязательно указывать тип. Область действияконстанты зависит от того, в каком месте модуля она описана:
•Чтобы константа использовалась только в одной процедуре, ее нужно объявить после операторов Sub и Function; при этом константа становится локальной.
•Чтобы константа была доступна для всех процедур в модуле, объявите ее перед первой процедурой модуля.
•Чтобы сделать константу доступной для всех модулей в рабочей книге, используйте ключевой слово Public и объявите константу перед первой процедурой модуля. Следующее выражение создает константу, используемую во всех модулях VBА в рабочей книге:
Public AppName As String = "Budget Tools"
518 |
Часть VI. Разработка пользовательскихфункций |
Если в процедуре VBA значение константы попытаться изменить появится сообщение об ошибке, что, в общем-то, и должно происходить. Константа есть константа, а не переменная.
Хорошей привычкой является использование констант в коде для фиксированных значений или строк. Например, если процедура ссылается на определенное значение (скажем, на процентную ставку) несколько раз, то это значение лучше всего описать как константу и в выражениях вместо значения использовать ее имя. Так код легче читать и вносить в него изменения — при необходимости нужно изменить только один оператор, а не несколько.
Использование строк
Как и Excel, VBA может оперировать как с числами, так и с текстом (строками). В VBA поддерживается два типа строк:
•Строки фиксированной длины. Объявляются с указанием количества символов. Максимальная длина составляет 65 535 символов.
•Строки переменной длины. Теоретически могут содержать до 2 миллиардов символов.
Каждый символ строки занимает 1 байт памяти. Если длина строки известна заранее (т.е. строка с фиксированной длиной), то ее можно указать при объявлении с помощью оператора Dim; или VBA определит ее длину динамически (строка с переменной длиной). В некоторых случаях память используется более рационально при работе со строками фиксированной длины.
В следующем примере переменная MyString объявлена как s t r i n g с фиксированной длиной 50 символов. Переменная YourString тоже объявлена типом s t r i n g , но ее длина не указывается.
Dim MyString As String * 50 Dim YourString As String
Работа сдатами
Строковую переменную можно использовать для описания дат, но с помощью этой переменной нельзя вычислить ту или иную дату. Для работы с датами воспользуйтесь типом Date.
Под переменную, объявленную типом Date, отводится 8 байт памяти, и в ней содержатся данные в диапазоне от 1 января 0100 года по 31 декабря 9999 года. Это промежуток примерно в 10000 лет — более чем достаточно даже для самого долгосрочного финансового прогноза! Тип данных Date также используется для данных времени. Даты и время в VBA заключаются между двумя знаками решетки(#).
Диапазон дат, поддерживаемых в VBA, намного больше, чем собственный диапазон дат в Excel, который начинается с 1 января 1900. Поэтому будьте внимательны и не используйте дату, которая не входит в диапазон дат, приемлемых в Excel.
Далее приведены несколько примеров объявления переменных и констант типом Date:
Dim Today As Date
Dim StartTime As Date
Const FirstDay As Date = #l/l/2002# Const Noon = #12:00:00#
Глава 24. Принципыпрограммирования наVBA |
519 |
