Как видно из рис. 11.4, эта функция отображает диалоговое окно с полем текста, куда пользователь может впечатать некоторую, как предполагается, важную информацию. Чтобы передать эту информацию программе, присвойте возвращенное функцией Input Box значение строковой переменной: strB = InputBox("Какие места предпочитаете?", "TWA", "У прохода")
Рис. 11.4. Простое окно ввода
Хотя с помощью окна ввода можно получить больше информации, чем с помощью окна сообщения, с окном ввода программисту работать легче - тут нет кнопок и пиктограмм, которые можно выбирать. Аргументы сообщение и заголовок точно такие же, как и в случае функции MsgBox. Вы можете облегчить задачу пользователю, задав значение аргумента ответ. Тем самым вы предложите ему ответ, принимаемый по умолчанию, - если предложенный вами ответ подойдет, пользователь сможет просто нажать клавишу <Enter>.
В случае переменной типа Boolean изменить ее значение на противоположное проще всего с помощью операции логического отрицания Not. При этом результат применения операции нужно просто присвоить той же самой переменной.
Например, оператор boolBlinking = Not (boolBlinking) делает значение переменной boolBlinking равным True, если значением было False, и, наоборот, равным False, если значением было True.
Забавы с математикой и деньгами
В VBA предлагается целый ряд функций для работы с числовыми значениями. Эти функции предназначены для решения ряда задач от совсем простых (например, возвращение абсолютного значения или знака числа) до достаточно сложных вычислений алгебраических и тригонометрических величин. А добрая дюжина финансовых функций VBA поможет удержать на плаву любой утопающий бизнес.
Я не собираюсь останавливаться здесь на всех этих функциях, а рассмотрю лишь, как исключение, несколько избранных из них. Да и эти последние я обсуждаю только потому, что их непросто обнаружить в системе справки VBA и поэтому вы могли бы иначе просто не узнать о них. Внимательно ознакомьтесь с приведенным ниже списком, чтобы знать, что в VBA есть, а чего - нет.
В табл. 11.7 приведены функции VBA, которые можно назвать математическими. Перед тем как использовать их, не забудьте снова просмотреть раздел "Конвертирование данных" выше в этой же главе.
Таблица 11.7. Математические функции VBA
Функция Возвращаемое значение
Abs ( число) Абсолютное значение числа
Atn ( число) Арктангенс числа
Cos ( число) Косинус числа
Ехр ( число) Число е в степени, равной заданному числу
Fix ( число) Целая часть числа (см. описание функции int)
int ( число) Целая часть числа. Функции intи Fix по-разному действуют только на отрицательные числа: intвозвращает ближайшее меньшее целое, a Fix просто отбрасывает дробную часть числа
Log ( число) Натуральный логарифм числа, значение двойной точности
Rnd ( число) Случайное число, значение одинарной точности
Sgn ( число) 1, если число положительно, 0, если равно нулю, и - 1, если отрицательно
Sin ( число) Синус числа
sqr ( число) Квадратный корень числа
Tan ( число) Тангенс числа
Если вы не находите в VBA ту математическую функцию, которая вам нужна, не отчаивайтесь- можно сконструировать выражение или создать процедуру типа Function, которая решит нужную задачу.
Если вы знаете математику настолько, что можете сами разобраться с тригонометрическими функциями типа обратной к функции косеканса, мне, наверное, не нужно объяснять вам, как использовать тригонометрические функции. Однако вам будет не лишним знать, что в справке VBA есть нечто типа шпаргалки по таким функциям, в которой вы найдете и выражения для их вычисления. Чтобы добраться до этой шпаргалки, поищите раздел derived math functions (производные математические функции) в содержании справки. Этот раздел справки напомнит вам, например, что логарифм числах по основанию N вычисляется как Log (X) /Log (N).
Если вы предполагаете, что какая-то производная математическая функция понадобится в дальнейшем, сделайте ее частью своего математического арсенала, записав в виде процедуры типа Function, и сохраните в модуле с названием вроде МоиМатематическиеФункции. Тогда вы сможете при случае воспользоваться ею, как только в этом возникнет необходимость.
Округлять десятичные числа приходится часто, особенно при работе с денежными значениями. Как ни странно, VBA не предлагает прямого решения таких задач, но обсуждаемые ниже приемы помогут вам решить любые проблемы с округлением.
В VBA 6 есть функция Round (в VBA 5 такой функции нет), но дает она не слишком надежные результаты. Например, в результате выполнения оператора х = Round( 2.505, 2) значением переменной х будет 2.5, а не 2.51, как должно быть. Поэтому не используйте Round, если, конечно, вы не намереваетесь получить заведомо неправильные ответы.
Есть другой простой способ округления чисел в VBA, при котором используется функция Format: просто используйте эту функцию, задав подходящее значение аргумента формат, как показано в следующем примере (как использовать аргумент формат, см. выше в разделе "Создание собственных форматов");
sngОкругленное = Format(sngНеокругленное, "#,##0.00")
В VBA 6 для получения подобного результата можно использовать функцию FormatNumber:
sngOKpyгленное = FormatNumber(sngНеокругленное, 2)
В обоих этих примерах значение sngНеокругленное округляется до двух знаков после запятой. Чтобы при округлении с помощью функции Format получить иное число знаков после запятой, измените число нулей после десятичной точки в аргументе формат. Например, значение "#,##0.0" для аргумента в результате даст округление до одного знака после запятой. При округлении с помощью функции FormatNumber просто измените число, задающее значение второго аргумента, на нужное.
Не забывайте, что переменная, в которую вы помешаете округленное значение, должна иметь тип String, Single, Double, Decimal, Currency или Variant, но никак не тип Integer или Long, поскольку тогда вы просто потеряете дробную часть числа.
Предположим теперь, что нужно округлить некоторое значение не в дробной части, а до целых определенного порядка (например, до сотен). В этом случае выражение немного усложняется, но нельзя сказать, чтобы слишком. Вот пример округления до сотен: sngOKpyrленное = Format(sngНеокругленное / 100, "#,##0.") * 100
Обратите внимание на то, что в данном случае строка для аргумента формат не имеет нулей справа от десятичной точки. Кроме того, неокругленное значение внутри функции Format делится на подходящую степень 10, а возвращаемый функцией результат умножается на ту же степень 10. Степень 10 должна быть равной порядку, до которого предполагается округление. В данном примере порядок равен 2, т.е. выполняется округление до сотен.
Если жизненная рутина угнетает ваш бурлящий дух, оживите свои программы определенной непредсказуемостью. Генерируемые случайным образом числа бывают нужны при создании программ, которые моделируют реальные процессы, при создании учебных программ и игр.
В VBA есть две встроенные команды для генерирования случайных чисел.
* Оператор Randomize. Используйте его, чтобы запустить генератор случайных чисел VBA. Не требуя аргументов, оператор Randomize запускает генератор, подавая ему на вход текущее системное время. Таким образом, гарантируется при каждом новом запуске новая последовательность случайных чисел.
* функция Rnd, Эта функция и поставляет случайные числа для использования в программе. Функция Rnd не имеет аргументов- вам нужно просто присвоить имя функции переменной или использовать Rnd в выражении. Возвращается значение с плавающей запятой (типа Single).
Числа с плавающей запятой часто используются в статистических и научных отчетах. Однако в некоторых ситуациях нужны случайные целые значения, если, например, необходима процедура, выбирающая случайным образом номер выигрышного билета. Чтобы преобразовать возвращаемое функцией Rnd значение в целое из определенного диапазона, используйте следующую формулу: случайное_целое = Int(минимум +(Rnd() * максимум))
В этой формуле максимумы минимум задают соответственно верхнюю и нижнюю границы дли значений получаемых случайных чисел - если границы заданы правильно, эта формула всегда будет давать число из соответствующего диапазона.
Финансовые функции
VBA предлагает ряд функций для подсчета рублей-копеечек в выплатах по ссуде или возвращениях инвестиций. Я не имею здесь возможности обсуждать все эти функции, но собираюсь все же рассмотреть функцию Pmt для расчета выплат по ссуде.
Используйте функцию Pmt для расчета сумм, которые предстоит выплачивать вам (или которые должны выплачивать вам) по закладной с фиксированными процентами или какому либо другому займу. Вот формальный синтаксис функции Pmt:
Pmt(ставка, кпер, сумма[, цель[, тип]])
Первый аргумент, ставка, задает ставку процента выплат по займу за определенный период времени. Задаваемая вами ставка процента должна соответствовать периодичности выплат. Если нужно выплачивать ежемесячно по 8%-ной закладной, то не забудьте, что 8% является годовой нормой. В таком случае ставка должна задаваться выражением типа .08/12 (8% разделенные на 12 месяцев).