2011-12-20 3 views
3

Итак, я пытаюсь преобразовать этот расчет ячейки Excel в C#, но я не могу понять, что он делает. Я прочитал определение EDATE и все еще не имеет особого смысла.Функции Excel для кода C#

IF(EDATE(B25,-12)>A25,((EDATE(B25,-12)-A25)/(EDATE(B25,-12)-EDATE(EDATE(B25,-12),-12)))+1,(B25-A25)/(B25-EDATE(B25,-12))) 

B25 = End Date 
A25 = Start Date 

Он по существу пытается подсчитать долю года. Должно быть очень легко сделать, но я не совсем уверен, что делает это EDATE.

+0

http://office.microsoft.com/en-us/excel-help/edate-HP005209073.aspx эта ссылка будет объяснить, что EDATE находится в Excel – MethodMan

+0

... из которого ясно, что 'EDATE' является' DateTime.AddMonths() '. – GSerg

ответ

6

Согласно EDATE, вы в основном имеете дело с 12 months before the End Date (B25).

Учитывая, что это, кажется, сказать:

Если дата начала более чем за 12 месяцев до даты окончания, то:

(количество времени, что дата начала до за год до даты окончания разделенного на один год) + 1

Else:

Время, в течение которого дата начала до даты окончания делится на один год.

Я действительно не знаю, как Excel обрабатывает даты арифметику или то, что точка этой функции, но это мое псевдо на первый взгляд.

Действительно, это просто проверка состояния, которое я упомянул, а затем компенсировать всю арифметику на год, если условие истинно.


Редактировать

Хорошо, некоторые быстро исследования показывают, что Excel делает дату арифметику чисто как дни, так что потом 12/1/1900 - 1/1/1900 = 335 дней. Помещение времени на любую дату делает его частью дня.

Учитывая, что эта формула Excel, похоже, пытается вычислить разницу в дробном году между двумя датами.

Это грубый кусок кода, который должен обеспечить его:

TimeSpan span = endDate.Subtract(startDate); 
double years = span.Days/365.25; 
+0

Это замечательно, спасибо за вашу помощь. Но что, если у некоторых лет есть 366 дней, а у других 365. 365,25 будут пытаться даже это выяснить, однако, что, если разница между 5/26/2011 и 6/2/2012? – slandau

+0

Будет что-то вроде этой работы? 'toDate.Subtract (новый DateTime (toDate.Year - 1, toDate.Month, toDate.Day)). Дни до значения знаменателя, но используйте' Subtract' для получения числителя. – slandau

+0

@slandau: это ближе к оригиналу и лучше, если ваша цель - найти тот же ответ, что и Excel. Я не уверен, что это ответ на вопрос. Что, если год 'toDate' не охватывает 29 февраля, но разница между' startDate' и 'toDate' действительно охватывает високосный год? Внезапно ты снова уходишь. Итак, ответ на ваш вопрос: какое требование? Надеюсь, что это помогло. – Marc

Смежные вопросы