Пожалуйста, попробуйте этот UDF.
Function MonthsOverlap(Rng As Range, _
AccYear As Integer) As String
' 016
Const Ststart As Long = 1 ' index of array 'Study'
Const Stend As Long = 2 ' index of array 'Study'
Dim Fun As Integer ' Months of overlap
Dim YearStart As Date, YearEnd As Date
Dim Study As Variant
YearStart = DateSerial(AccYear, 8, 1) ' modify year and day as required
YearEnd = DateAdd("yyyy", 1, YearStart)
Study = Rng.Value ' Rng columns must be adjacent
With Application.WorksheetFunction
If Study(1, Ststart) <= YearStart Then
Fun = DateDiff("m", .Max(Study(1, Ststart), YearStart), .Min(Study(1, Stend), YearEnd))
ElseIf Study(1, Ststart) <= YearEnd Then
Fun = DateDiff("m", .Max(Study(1, Ststart), YearStart), YearEnd)
End If
Fun = .Max(Fun, 0)
End With
MonthsOverlap = Fun & " month" & IIf(Fun = 1, "", "s")
End Function
Я проверил его на листе, подобном изображенному ниже. Пожалуйста, соблюдайте формулу в панели формул. 
Как видите, функция возвращает неожиданные результаты за 2017 и 2019 годы. Я не думаю, что они ошибаются. В формуле используется только округление месяцев, отличное от вашей системы. Я думаю, что функция может быть изменена, чтобы приспособить ваше правило, как только вы сделаете это известным. Между тем это следует правилу Microsoft, которое, честно говоря, я тоже не знаю. Тем не менее, обратите внимание, что общее время обучения составляет 24 месяца, что является правильным и, следовательно, достаточным, вместе со взглядами на часы, чтобы убедить меня позволить хорошему быть достаточно хорошим на сегодня: -)