Как да пресметна броя седмици и дни между две дати ?

Microsoft Excel Тайните на Excel

Здравейте! Защо като се използва функцията weeknum за де се преброят седмиците от 25.03.2015г. до 24.01.2016г. броят им е 42, а реалният брой за 305 дни е 43 седмици и 4 дни?Как е по-точно да бъдат смятани?

Здравейте,


 когато използвате weeknum най - вероятно го ползвате по следния начин

= weeknum ( дата 2 - дата 1 ; 2 ) и очаквате да получите броя на седмиците 

между тези две дати, това НЕ е така от снимка 1 може да се обедите че 

ползвайки така формулата Excel ми пресмята е между 01.01.2015 и 04.01.2015 

са две седмици.



weeknum работи на принцип да показва номера на седмицата за дадения ден от 

годината.Какво ще рече това ако ползвам чист = weeknum (01.01.2015;2) Еxcel 

следва да ми даде номера на седмицата за дадената дата ... в случая тази 

седмица е седмица 1 съответно следва = weeknum (01.01.2015;2) да ми даде 

резултат 1 - снимка 2, което какво означава .... означава това че правейки 

формуалта  = weeknum ( дата 2 - дата 1 ; 2 ) ние получаваме от дата 2 - дата 1 

някакво число и съответно на база на това число Excel  ни показва в коя 

седмица от годината се намира този ден.

Важно е да се отбележи че задавайки ; 2  - >  First day = Monday system 1 ние 

задаваме следната зависимост при пресмятане на седмиците.... ден първи е в 

седмица 1 ..... дните  от 2 до 8 са в седмица 2, дните от 9 до 15 са в седмица 

3.... ако зададем ; 21 -> First Day = Monday system 2 броенето става малко по 

сложно първата седмица е от 1 до 8 ( реално първата седмица започва със 

сряда затова ) и след това са през седем дни т.е. седмица 2 са от 9 до 15.



В случай на използване на Excel с формула = weeknum (дата 2 - дата 1;2)

показва номера на седмицата на база стойносттта и настройките ( 2 или 21 ) и 

няма как да разпознае 



На снимка 3 съм дал пример при стойност 2 какво точно се случва.



Може и сама да тествате това което описах по - горе. Надявам да е ясно и от 

самото 



--------------------------------------------------------------------------------------------------------------



Но сега на въпроса как в крайна сметка мога да покажа между две дати мога да покажа колко седмици и колко дни има между тях.


Не знам до колко е адекватна формулата която нарпавих, но все пак ето я :

=((B29-A29)/7)-MOD((B29-A29)/7;1)&"   седмици  и "&((MOD((B29-A29);7)))&" дни "

На снимка 4 може да се види по - добре.

Ето какво правя.... от дата 2 изваждам дата 1 и деля на 7 така получавам едно 

число коеото не е цяло 305 / 7 = 43.57 за да напправя това число цяло, НО 

същевременно освен и цяло на мен ми трябва да е и делимо на 7, което 

означава че от него трябва да извадя онази стойност от 43,57 докато не 

достигна исканото от мен число... затова използвам функция MOD като за 

стойност за тази функция пак използвам 305 / 7 = 43,57 като за делител 

задавам числото 7 ... функцията MOD ще сметне най - голямото цяло число 

което се дели на 7 на база 305 / 7 и ще запише остатъка ми т.е.

MOD((B29-A29)/7;1)  = 0,57 ( 43 * 7 = 301 ) след което от преди това имам (B29-A29)/7) = 43,57

 което означава че 43,57 - 0,57 следва да ми даде точно 43 седмици, след което 

 пак ще използвам още един MOD 


MOD((B29-A29);7) в който какво правя изваждам дата 2 - дата 1 и задавам 

делител пак 7 , какво означава това че от числото 305 MOD ще ми намери най - 

голямото цяло число което се дели на 7 и следва да ми запише остатъка до 305 

т.е. числото което е цяло и се дели на 7 е 301 остатъка до 305 е 4 - това са ми 

дните.


----------------------------------------------------------------------------------------------------------------------


Аз лично бих се справил с проблема така на база на формулите и функциите 

които знам 

възможно е и да има доста по - лесни варианти аз лично не се сещам, ако 

някой знае нека сподели... 



-------------------------------------------------------------------------------------------------------------------

Благодаря за въпроса интересен е .... Надявам се да съм бил полезен с 

отговора, ако нещо неразбираш като дейтвие на функция или друго нещо пише 

ще дообесня.



Благодаря Ви много за отговора. Разгледах предложената формула и с нея съвсем точно успях  да определя броя на седмиците и дните и между други дати. 

Здравейте, ето още едно решение за изчисляване на броя седмици и дни между две дати с функцията DATEDIF. Тази функция е включена за първи път в MS Office 2000, но досега не е документирана, т.е. не се показва в списъка на вградените функции, но работи и дава много точни резултати, но все пак имайте едно наум :-)


Моля да ме извините за не най-доброто изображение!  

@Димитринка, да още един вариант за справяне с проблема ... даже бих казал по - удачен  т.к. формулите изглеждат доста по семпли :) спрямо моята дълга формула  :) въреки че ако се обединят в една клектка и твоята би била доста дълга :)

Краси, така е, няма как да се приложи само една функция. Създаването на т. нар. "мегафункции" , т.е. комбиниране на повече функции в една формула е много полезна възможност в Excel. А по-краткият вариант е да се създаде UDF
 :-)

Здравейте,

Ето и един вариант за смятане на седмици и дни, който използвах преди доста години. Мисля, че е най-компактен като дължина на формулите. Лесно може и да се конкатенират стойностите в една клетка, в моя файл са по отделно.

Сега, като гледам горния коментар, май е добре да си добавя още един полезен UDF към колекцията то

Поздрави,

Здравейте,

Във връзка с горния коментар, намерих малко време и си направих един UDF за пресмятане на седмици и дни между две дати, и реших да го споделя с вас:

Public Function WD_DateDiff (Start_Date As Variant, End_Date As Variant, _
                    Optional Function_Type_1_or_2 As Integer = 1) As Variant


    Dim FResult As Variant
    Dim Week_Value As Integer
    Dim Week_Value_trunc As Integer
    Dim Day_Value As Integer
   
   
    Select Case Function_Type_1_or_2
   
        Case 1
            GoTo Weeks_only
           
        Case 2
            GoTo Weeks_and_days
           
        Case Else
            GoTo Error_handler
           
    End Select
   
Exit Function
   
'------------------------
Weeks_only:
        FResult = (End_Date - Start_Date) / 7
   
        WD_DateDiff = FResult
    Exit Function
   
'------------------------
Weeks_and_days:
        Week_Value = (End_Date - Start_Date) / 7
        Week_Value_trunc = Int(Week_Value)
        Day_Value = (Week_Value - Week_Value_trunc) * 7
        Day_Value = Int(Day_Value)
        FResult = Week_Value_trunc & " weeks and " & Day_Value & " days"
       
        WD_DateDiff = FResult
    Exit Function
   
'------------------------
Error_handler:
    FResult = "#N/A"
    WD_DateDiff = FResult
   
    Exit Function


End Function

Всъщност, това е комбинация от две функции - при подаване на 1 като опционален аргумент изчислява само седмиците като десетична дроб, а при подаване на 2 като опционален аргумент изчислява едновременно седмици и дни и подава резултата във формат "13 weeks and 1 days".

Надявам се да го намерите за полезно.
Ще се радвам и ако някой от по-опитните колеги дадат своя коментар или предложение за корекция/подобрение.

Поздрави,
Миро

Често използвам различни UDF-и и разбира се забравям какви са аргументите и техния ред на въвеждане. Скоро разбрах за страхотен начин как да се подсетим за синтаксиса:

1. Въвежда се името на функцията и отварящата скоба
2. Натиска се клавишна комбинация Ctrl+Shift+A
Като резултат функцията се запълва с наименованията и подредбата на нейните аргументи.

Например за горната функция ще се получи:
=WD_DateDiff(Start_Date;End_Date;Function_Type_1_or_2)

Надявам се този трик да ви бъде полезен.

Здравейте Мирослав,
Тествах функцията, която предлагате, но тя не изчислява правилно дните, ако задам 2 за допълнителния аргумент (Function_Type_1_or_2 = 2), т.е. резултатът е винаги "X weeks and 0 days" - седмиците Х се изчисляват правилно.
Препоръчвам да направите следните промени:
1. Декларирате променливата 
Dim Week_Value As Integer, а след това в процедурата

използвате
Week_Value_trunc = Int(Week_Value)
 Day_Value = (Week_Value - Week_Value_trunc) * 7
Получава се  (Week_Value - Week_Value_trunc) = 0 и оттук 
 Day_Value = 0.
Затова не се изчисляват оставащите дни.
2. След като променливата 
Dim Week_Value As Integer,
тогава променливата Week_Value_trunc 
е напълно излишна.
3. Аналогично и за променливата 
Day_Value
4. Може да изчислите оставащите дни (променливата Day_Value) с аритметичния оператор MOD на VBA. MOD смята така както екселската функция MOD, но във VBA има предимството, че връща резултат цяло число.
5. Горещо препоръчвам винаги, когато е възможно, да избягвате GOTO.
6. Достатъчно е в Select Case да включите как да се изчислява формулата, когато
липсва допълнителният аргумент или е 1, тогава ще изчислява само седмиците.
Когато допълнителният аргумент е 2, ще изчислява седмиците и дните. За всички останали случаи ще излиза #N/A.
7. По-добре е двата аргумента на функцията Start_Date, End_Date да бъдат декларирани като Date, а не Variant.
Надявам се, че коментарите ще Ви бъдат полезни!
Пишете, ако има нещо неясно.

Здравейте,  намерих още един вариант за изчисление. Тук използвам само функцията ROUNDDOWN. Мисля, че резултата с тази формула е реален.

Също така функцията ROUNDDOWN може да се замени с функцията INT, която връща като резултат само целите числа. По този начин се избягва закръгляването, което понякога крие изненади :-)

Бих добавил че с всяка функция в Excel трябва да се внимава за изненади :)

Предложение от мен: Дано е това, което се търси! Лек ден и успехи!


Вашият отговор

Научи компютърните програми онлайн от топ експертите на България
Регистрацията в АУЛА ви дава:
  • 20 безплатни урока
  • Трикове и тънкости за софтуера
  • Отговори на вашите въпроси
  • Регистрация