Excel VBA yearfrac с минимальными и максимальными значениями

Я пытаюсь найти количество недель между двумя датами в Excel VBA (с некоторой минимальной / максимальной функциональностью между ними), получаю ошибку несоответствия типов (ошибка времени выполнения '13') для следующей строки:

WeeksWorked = Application.WorksheetFunction.RoundDown _ 
             (52 * Application.WorksheetFunction.YearFrac _ 
             (Application.WorksheetFunction.Max(DOH, DateValue("Jan 1, 2012")), _ 
              DateValue("Dec 31, 2012")), 0)

У любого есть какое-либо направление относительно того, что я делаю неправильно, это будет очень цениться!

3 ответа

Решение

Как предлагается в комментариях, вы можете просто сделать:

debug.print DateDiff("ww", DateValue("Jan 1, 2012"), DateValue("Dec 31, 2012"))

Если по какой-то причине вы хотите бросить свой собственный, вы можете обрезать частное:

| день1 - день2 | 
---------------
       7

Пример кода:

Sub test_numWeeks_fn()
    Call numWeeks(DateValue("Jan 1, 2012"), DateValue("Dec 31, 2012"))
End Sub

Function numWeeks(d1 As Date, d2 As Date)
    Dim numDays As Long
    numDays = Abs(d1 - d2)
    numWeeks = Int(numDays / 7)
    Debug.Print numWeeks
End Function

Результат:

52

Не уверен, почему вам нужно использовать это в VBA, вот что вы можете попробовать.

В Excel:

Предполагая, что Дата начала в А1, Дата окончания в А2, затем A3,

=(NETWORKINGDAYS(A1,A2))/5

Теперь это в перспективе рабочих дней, таким образом, давая 5-дневную неделю. Если вам нужно 7 дней в неделю с обычными днями,

=WEEKNUM(A3)-WEEKNUM(A2)

Функция WEEKNUM() в надстройке Analysis Toolpack рассчитывает правильный номер недели для данной даты, если вы находитесь в США. Пользовательская функция ниже рассчитает правильный номер недели в зависимости от настроек национального языка на вашем компьютере.

Если вам все еще нужно использовать VBA, попробуйте это: (как указал Тим DateDiff очень удобно.) Или вы даже можете использовать Evaluate to trigger WEEKNUM,

Option Explicit

Function numWeeks(startDate As Date, endDate As Date)
    numWeeks = DateDiff("ww", startDate, endDate)
End Function

Использование Evaluate на WEEKNUM:

Function numWeeks(startDate As Range, endDate As Range)
Dim s As Integer, t As Integer
    s = Application.Evaluate("=WEEKNUM(" & startDate.Address & ",1)")
    t = Application.Evaluate("=WEEKNUM(" & endDate.Address & ",1)")
    numWeeks = t - s
End Function

Попробуйте код ниже:

Sub example()

Dim dob As Date
dob = #7/31/1986#

Dim todaydt As Date
todaydt = Date

Dim numWeek As Long
numWeek = DateDiff("ww", dob, todaydt) ' Difference in weeks

End Sub
Другие вопросы по тегам