Подсчет количества полных лет
Трюк, который мы сейчас рассмотрим, позволяет быстро посчитать количество целых лет между заданной датой и текущей. В частности, с помощью данного трюка можно определить возраст человека (с округлением до целых лет), зная дату его рождения. В этом нам поможет пользовательская функция dhCalculateAge, код которой приведен в листинге 2.59.
Function dhCalculateAge(datDate As Date) As Long
Dim lngAge As Long
' Находим разность между текущей датой и указанной (лет)
lngAge = DateDiff(«yyyy», datDate, Date)
If DateSerial(Year(datDate) + lngAge, Month(datDate), _
Day(datDate)) > Date Then
' В этом году день рождения еще не наступил
lngAge = lngAge – 1
End If
dhCalculateAge = lngAge
End Function
Если, например, в качестве заданной даты взять 18.08.1972, а сегодняшний день – 28.04.2007, то результатом выполнения данной функции будет число 34. При использовании строки формул в данном случае формула будет выглядеть так:
=dhCalculateAge(«18.08.1972»)
Проверка, была ли сохранена рабочая книга
В процессе работы с новой книгой может возникать вопрос: а была ли уже сохранена текущая книга? Для ответа на него существуют штатные методы (самый простой – воспользоваться командой Сохранить на панели быстрого доступа). Однако можно применить и нестандартный прием; для этого нужно создать пользовательскую функцию, код которой приведен в листинге 2.60.
Function dhBookIsSaved() As Boolean
' Если путь файла рабочей книги не задан, то она _
не сохранена (ThisWorkbook.path равняется "")
dhBookIsSaved = ThisWorkbook.path <> ""
End Function
Данная функция не имеет аргументов. Если после ее запуска в активной ячейке появится значение ИСТИНА, то текущая рабочая книга была ранее сохранена, а если ЛОЖЬ – то книга не сохранялась.
Расчет средневзвешенного значения
Для быстрого расчета средневзвешенного значения можно применить пользовательскую функцию, код которой приведен в листинге 2.61.
Function dhAverageWithWeight(rgWeights As Range, rgValues As
Range) _
As Double
If (rgWeights.Count <> rgValues.Count) Then
' Количество весов не соответствует количеству аргументов
dhAverageWithWeight = 0
Exit Function
End If
Dim i As Integer
Dim dblSum As Double ' Сумма значений
Dim dblSumWeight As Double ' Взвешенная сумма значений
' Вычисление...
For i = 1 To rgWeights.Count
' Взвешенной суммы значений
dblSumWeight = dblSumWeight + rgWeights(i) * rgValues(i)
' Суммы значений
dblSum = dblSum + rgWeights(i)
Next
' Возвращение средневзвешенного значения
dhAverageWithWeight = dblSumWeight / dblSum
End Function
После выбора данной функции откроется окно, в котором следует заполнить поля RgWeights иRgVaLues, после чего нажать кнопку ОК. Результат отобразится в ячейке, в которой установлен курсор.
Преобразование номера месяца в его название
С помощью небольшой пользовательской функции можно быстро получить название месяца на основании его номера. Данную возможность целесообразно использовать при работе с большими объемами информации, когда нужно быстро преобразовать числовые обозначения месяцев в обычные названия. Код функции выглядит следующим образом (листинг 2.62).