Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лабораторные по word и excel.doc
Скачиваний:
25
Добавлен:
22.12.2018
Размер:
1.66 Mб
Скачать

Выполняемые и невыполняемые инструкции.

Основное различие между выполняемой инструкцией Visual Basic и коммен­тарием (невыполняемой инструкцией) состоит в тем, что комментарий всегда начинается с апострофа или ключевого слова Rem. Следовательно, если при создании макроса или пользовательской функции вы ввели инструкцию и затем решили, что она не должна выполняться при работе процедуры, то достаточно вставить перед этой инструкцией апостроф, преобразовав ее в комментарий. При выполнении макроса Excel пропустит невыполняемую инструкцию, как если бы ее не было вовсе. Так, например, если вы создаете макрос, который форматирует лист и затем его печатает, то на время отладки макроса можно превратить инструкцию печати в комментарий.

Разработка гибкой функции.

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

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

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

Теорема Пифагора может быть выражена следующим уравнением:

a2+b2= с2, где а и b являются катетами, а с — гипотенуза.

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

Следующая функция использует эти три варианта уравнения для вычисления длины неизвестной стороны:

Function Треугольник(Optional short1, Optional short2, Optional longside)

If Not (IsMissing(short1)) And Not (IsMissing(short2)) Then

Треугольник = Sqr(short1 ^ 2 + short2 ^ 2)

Else

If Not (IsMissing(short1)) And Not (IsMissing(longside)) Then

Треугольник = Sqr(longside ^ 2 – short1 ^ 2)

Else

If Not (IsMissing(short2)) And Not (IsMissing(longside)) Then

Треугольник = Sqr(longside ^ 2 - short2 ^ 2)

Else

Треугольник = Null

End If

End If

End If

End Function

Первая инструкция содержит имя пользовательской функции и необязательные аргументы shorti, short2 и longside. Обратите внимание, что в этой функции мы не можем использовать слово long в качестве имени аргумента, потому что long является зарезервированным словом Visual Basic. Следующий фрагмент текста функции содержит ряд инструкций If, которые используют встроенную в Visual Basic функцию IsMissing, чтобы выяснить, какая именно пара аргументов была задана. Эта проверка нужна для определения той стороны, длину которой должна вычислить функция.

Например, инструкция

If Not (IsMissing(shortl))

And Not (IsMissing(short2)) Then

Треугольник = Sqr(short1 ^ 2 + short2 ^ 2)

проверяет наличие аргументов shorti и short2. Функция IsMissing возвращает True (Истина), если аргумент не был задан. Если аргументы shorti и short2 заданы, Excel вычисляет квадратный корень из суммы квадратов длин двух катетов и возвращает длину гипотенузы.

Если задано меньше двух аргументов, то ни одна из инструкций If не возвращает значение True, и в этом случае выполняется инструкция

Треугольник = Null

Эта инструкция возвращает определенное в Visual Basic значение Null, которое в рабочем листе Excel преобразуется в ошибочное значение #Н/Д (#N/A).

Теперь посмотрим, что происходит при использовании этой функции в рабочем листе. Формула

=Треугольник (; 4; 5 )

возвратит значение 3, длину отсутствующего катета. Соответственно, формула =Треугольник(3; ;5)

возвратит значение 4 — длину другого отсутствующего катета. И наконец, формула

=Треугольник(3 ;4;)

возвратит значение 5 — длину гипотенузы. Если длины двух катетов (3 и 4) хранятся в ячейках А4 и В4, а в ячейку С4 введена формула

=Треугольник( А4; В4;) то Excel выведет в этой ячейке значение 5.

Если заданы значения для всех трех аргументов, тогда первая инструкция If возвращает True, и пользовательская функция действует так, как если бы значение для гипотенузы не было задано. Но что произойдет при вводе для всех трех аргументов ссылок на ячейки. Например, предположим, что вы ввели в ячейку D4 следующую формулу:

=Треугольник(А4; В4; С4)

предполагая, что длины двух сторон треугольника будут введены в соответст­вующие ячейки, а не прямо в функцию. Если ячейки А4 и С4 содержат длины одного из катетов и гипотенузы, а ячейка В4 пустая, то хотелось бы ожидать, что функция Треугольник возвратит длину второго катета. Однако ссылка на пустую ячейку В4 возвращает 0, а не #Н/Д. Поскольку первые два аргумента имеют числовые значения, то функция пытается рассчитать длину гипотенузы прямоугольного треугольника, в котором один из катетов имеет нулевую длину, и как обычно возвращает квадратный корень из суммы квадратов катетов. Результатом функции является длина катета, который был задан в листе, а вовсе не длина отсутствующей стороны.

Одним из способов разрешения этой потенциальной проблемы является измене­ние инструкций If так, чтобы они проверяли присутствие нулевых значений, а также ошибочных значений #Н/Д. Прямоугольный треугольник не может иметь сторону с нулевой длиной, и в том случае, когда аргумент оказывается нулевым, это означает, что он просто не был задан.

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