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