اذهب الي المحتوي
أوفيسنا

كيف يتم حساب الفرق بين تواريخ


الردود الموصى بها

الاخوة الاعزاء

السلام عليكم ورحمة الله وبركاته

كل عام وانتم بالف صحة وعافية .

سؤالي لدي جدول يتكون من (العمود1 ) تاريخ الوصول ، (العمود2 ) تاريخ التصريف مثلاً كيف يمكنني حساب (العمود 3 ) الفرق بين التاريخين وإذا كان الفرق أكثر من 30 أو 31 يوم يعطيني اشارة معينة .

مثال :

تاريخ الوصول 3/10/2005

تاريخ التصريف 4/11/2005

الفرق بين التاريخين ( كيف يتم حساب الفرق علماً بأن الشهور تختلف 30أو31يوم)

جزاكم الله كل خير على تعاونكم معي وأثابكم الله على فعلكم .

رابط هذا التعليق
شارك

وعليكم السلام،

يتم إحتساب الفرق بين التواريخ عن طريق إستخدام الدالة DATEDIF ..

شاهد المرفق وأخبرني إذا كان هذا ما تريد.

_________________.rar

رابط هذا التعليق
شارك

السلام عليكم

بعد إذن الأخ علي السحيب ، مرفق نفس المثال وبه طريقتين لحساب المدة بشكل دقيق .

مع ملاحظة أني لم أقم باختبارهما بشكل قوي حيث اقتصر الإختبار على السجلات الموجودة بالمثال فقط .

تحياتي .

DateDiff.rar

تم تعديل بواسطه أبو هادي
رابط هذا التعليق
شارك

السلام عليكم،

الأخ العزيز أبو هادي .. لقد قمت بإستخدام الدالة DATEDIF فقط .. وقد حصلت على نفس النتيجة التي حصلت أنت عليها بإستخدامك للدالة المذكورة بالإضافة إلى الدوال MOD و DAY ..

لذا أود منك إيضاح سبب إستخدامك لدوال إضافية .. ما دام بوسعنا تقليص عدد الدوال للحصول على نفس النتيجة المرجوة.

شكراً لك.

DateDiff.rar

رابط هذا التعليق
شارك

السلام عليكم

ممتاز جدا أخي علي السحيب فالحل الآن هو الأفضل على الإطلاق للحصول على المدد فلقد تعلمت منك شيئا جديدا اليوم بما يخص دالة DATEDIF للأكسل كما أعتقد أنك تعلمتها حديثا أيضا :(

لذا أود منك إيضاح سبب إستخدامك لدوال إضافية .. ما دام بوسعنا تقليص عدد الدوال للحصول على نفس النتيجة المرجوة.

اجتهاد حسب المعلومات المتوفرة لدي ، فكما تعلم أنا مختص بالأكسس أكثر منه في الأكسل ومع ذلك حاولت أن أقرأ عن الدالة في عن طريق العون/Help في الأكسل ولم أجدها موجودة ضمن الدوال ، عليه اعتمدت على معلوماتي لدالة DateDiff للأكسس والتي لا تحتوي على التنسيقات التي استخدمتها أنت في المثال الأخير .

وهنا هي أنواع التنسيقات المتاحة لنفس الدالة بالأكسس :

Setting Description

yyyy Year

q Quarter

m Month

y Day of year

d Day

w Weekday

ww Week

h Hour

n Minute

s Second

تحياتي .

رابط هذا التعليق
شارك

السلام عليكم،

تبقى أنت أستاذنا الذي نتعلم منه أخي أبو هادي ..

بالنسبة للدالة DATEDIF .. فلقد تعرفت عليها قبل ثلاث سنوات تقريباً بينما كنت أتجول في أحد المواقع الأجنبية .. ولا يوجد أي معلومات عن هذه الدالة في جميع إصدارات الإكسل .. ما عدا أوفيس 2000 .. فهو الوحيد الذي تفرد بشرح وافي عن هذه الدالة .. ولقد قمت بترجمة الموضوع الذي يتحدث عن هذه الدالة .. وقد أرفقته على الرابط التالي .. أرجو أن يحوز على رضاك أخي أبو هادي.

http://www.officena.net/ib/index.php?showtopic=8616

تم تعديل بواسطه علي السحيب
رابط هذا التعليق
شارك

السلام عليكم،

الأخ العزيز أبو هادي .. لقد أطلعت على الكود الذي أنشأته والذي يعمل على حساب الفرق بين التواريخ الهجرية (مرفق الملف).

لكن الكود يعمل مع الرموز (YYYY , M ,D) فقط .. ولا يقبل بقية الرموز الخاصة بالدالة DATEDIF .. وهي (YM , YD , MD).

وحسب علمي أن أن الدالة المقابلة لـ DATEDIF في تطبيقات الفيجوال بيسك هي DateDiff .. وهي لا تقبل إلا الثلاث رموز الأولى فقط.

لذا أو منك وحسب خبرتك الكبيرة في هذا المجال أن تنشأ لنا كود يقبل بقية الرموز .. لكي أتمكن من تصميم برنامج لحساب العمر يقبل التواريخ الهجرية على غرار البرنامج الموجود على الرابط التالي والذي لا يقبل إلا التواريخ الميلادية فقط.

http://www.officena.net/ib/index.php?showtopic=9674

وألف شكر لك أخي أبو هادي.

UmAlQura.rar

تم تعديل بواسطه علي السحيب
رابط هذا التعليق
شارك

السلام عليكم

أخي علي السحيب .. سأدرس الموضوع وأوافيك بما توصلت إليه إن شاء الله .

كما أود أن أعرف هل ما طلبته للهجري القياسي كالمستخدم في برامج مايكروسوفت أو تقصد تقويم أم القرى الهجري الفلكي ؟.

تحياتي .

رابط هذا التعليق
شارك

السلام عليكم

المثال بعد عمل دالة للبيسك بإسم vbDATEDIF شبيهة بدالة DATEDIF للأكسل .

Public Function vbDATEDIF(ByVal Interval As String, _
                          ByVal DATE1 As Date, _
                          ByVal DATE2 As Date, _
                       Optional FirstDayOfWeek As VbDayOfWeek, _
                       Optional FirstWeekOfYear As VbFirstWeekOfYear, _
                       Optional Cal As Byte) As Long
  
  Dim CurrCal As Byte
  Dim yy As Long
  Dim mm As Integer
  Dim dd As Integer
  
  On Error Resume Next
  
  If DATE2 < DATE1 Then Exit Function
  
  CurrCal = Calendar
  Calendar = IIf(IsMissing(Cal), Calendar, IIf(Cal > 1, Calendar, Cal))
  
   Select Case Interval
     Case "y", "ym", "md", "yd"
       yy = Year(DATE2) - Year(DATE1)
       mm = Month(DATE2) - Month(DATE1)
       dd = Day(DATE2) - Day(DATE1)
       If dd < 0 Then
         dd = dd + Day(DATE2 - Day(DATE2))
         mm = mm - 1
       End If
       If mm < 0 Then
         mm = mm + 12
         yy = yy - 1
       End If
   End Select
  
  Select Case Interval
    Case "y":  vbDATEDIF = yy
    Case "ym": vbDATEDIF = mm
    Case "md": vbDATEDIF = dd
    Case "yd": vbDATEDIF = DateDiff("d", DATE1, DATE2) - _
                           DateDiff("d", DATE1, DateSerial(Year(DATE2), Month(DATE2) - mm, Day(DATE2) - dd))
    Case Else
      vbDATEDIF = DateDiff(Interval, DATE1, DATE2, FirstDayOfWeek, FirstWeekOfYear)
  End Select
  
  Calendar = CurrCal
End Function

تحياتي .

vbDATEDIF_20051117.rar

رابط هذا التعليق
شارك

جميل جداً ما قمت به أخي أبو هادي .. لكن باقي على الحلو تكه :(

لكن ما قصدته هو أن يتم إدخال التواريخ الهجرية مباشرة داخل الخلية .. يعني هكذا 15/12/1410 ..

أتمنى أن تصل إلى كود يفي بهذا الغرض أخي العزيز أبو هادي. :fff:

تم تعديل بواسطه علي السحيب
رابط هذا التعليق
شارك

السلام عليكم

أسف أخي علي السحيب على التأخير .

الكود بعد التعديل ، وهو الآن يقبل التواريخ بنوع نص أو تاريخ .

Public Function vbDATEDIF(ByVal Interval As String, _
                          ByVal DATE1 As Variant, _
                          ByVal DATE2 As Variant, _
                       Optional FirstDayOfWeek As VbDayOfWeek, _
                       Optional FirstWeekOfYear As VbFirstWeekOfYear, _
                       Optional Cal As Byte) As Long
  
  Dim CurrCal As Byte
  Dim yy As Long
  Dim mm As Integer
  Dim dd As Integer
  
  On Error Resume Next
  
  CurrCal = Calendar
  Calendar = IIf(IsMissing(Cal), Calendar, IIf(Cal > 1, Calendar, Cal))
  
  DATE1 = CDate(DATE1)
  DATE2 = CDate(DATE2)
  
  If DATE2 < DATE1 Then GoTo ExitFunction
  
  Select Case Interval
    Case "y", "ym", "md", "yd"
      yy = Year(DATE2) - Year(DATE1)
      mm = Month(DATE2) - Month(DATE1)
      dd = Day(DATE2) - Day(DATE1)
      If dd < 0 Then
        dd = dd + Day(DATE2 - Day(DATE2))
        mm = mm - 1
      End If
      If mm < 0 Then
        mm = mm + 12
        yy = yy - 1
      End If
  End Select
  
  Select Case Interval
    Case "y":  vbDATEDIF = yy
    Case "ym": vbDATEDIF = mm
    Case "md": vbDATEDIF = dd
    Case "yd": vbDATEDIF = DateDiff("d", DATE1, DATE2) - _
                           DateDiff("d", DATE1, DateSerial(Year(DATE2), Month(DATE2) - mm, Day(DATE2) - dd))
    Case Else
      vbDATEDIF = DateDiff(Interval, DATE1, DATE2, FirstDayOfWeek, FirstWeekOfYear)
  End Select
  
ExitFunction:
  Calendar = CurrCal
End Function

تحياتي .

تم تعديل بواسطه أبو هادي
رابط هذا التعليق
شارك

السلام عليكم ,,

هل ينفع الكود السابق في تطبيقة للحصول علي ما يوافق التاريخ الهجري ,

فمثلا ادخل في الخلية التاريخ الهجري فتعطيني خلية اخري ما يوافقة بالتاريخ الميلادي ,

ايضا هل تنفع في حالة تعبيئة الخلايا بواسطة " التعبئة التلقائية " وذلك للتواريخ الهجرية ؟

وشكرا لكم ,,,

رابط هذا التعليق
شارك

السلام عليكم

مرفق مثال يحتوي على دالتين للتحويل بين الهجري والميلادي .

آمل تجربتها وإعلامنا بالنتيجة .

دالة التحويل من الهجري إلى الميلادي :

Function Hijri2Greg(ByVal Hijri As Variant, _
           Optional ByVal DateFormat As Variant) As Variant
  Dim CurrCal As Byte
  
  CurrCal = Calendar
  Calendar = vbCalHijri
  
  If VarType(Hijri) <> vbString Then Hijri = Format(Hijri, "dd/mm/yyyy")
  
  If IsMissing(DateFormat) Then
    Hijri2Greg = CDate(Hijri)
  Else
    Hijri = CDate(Hijri)
    Calendar = vbCalGreg
    Hijri2Greg = Format(Hijri, DateFormat)
  End If

  Calendar = CurrCal
End Function
دالة التحويل من الميلادي إلى الهجري :
Function Greg2Hijri(ByVal Greg As Variant, _
           Optional ByVal DateFormat As Variant) As Variant
  Dim CurrCal As Byte
  
  CurrCal = Calendar
  Calendar = vbCalGreg
  
  If VarType(Greg) <> vbString Then Greg = Format(Greg, "dd/mm/yyyy")
  
  If IsMissing(DateFormat) Then
    Greg2Hijri = CDate(Greg)
  Else
    Greg = CDate(Greg)
    Calendar = vbCalHijri
    Greg2Hijri = Format(Greg, DateFormat)
  End If

  Calendar = CurrCal
End Function

تحياتي .

DateConverter_20051122.rar

رابط هذا التعليق
شارك

السلام عليكم

جميل جداً ما قمت به أخي أبو هادي .. لكن باقي على الحلو تكه  :( 

لكن ما قصدته هو أن يتم إدخال التواريخ الهجرية مباشرة داخل الخلية .. يعني هكذا 15/12/1410 ..

أتمنى أن تصل إلى كود يفي بهذا الغرض أخي العزيز أبو هادي.  :fff:

الأخ علي السحيب .. لقد رددت عليك ولم تقم بالتعقيب .. عسى المانع خير ؟!.

تحياتي .

رابط هذا التعليق
شارك

السلام عليكم،

كيف حالك أخي أبو هادي ..

أنا آسف جداً على تأخري في الرد والشكر على المجهود الكبير والمضني الذي قمت به .. وقد دخلت للتعقيب على إبداعك .. وفوجئت بسؤلك عني.

وسبب تأخري في الرد هو أنني كنت أعمل على إختبار الكود بشكل شامل ومن جميع النواحي .. وما وجدته هو قمة في الإبداع وروعة في الأداء ومجهود أكثر من ممتاز .. وكلمة شكر لا تكفي للرد على هذا العمل المتمير منك أخي أبو هادي.

رابط هذا التعليق
شارك

زائر
هذا الموضوع مغلق.
  • تصفح هذا الموضوع مؤخراً   0 اعضاء متواجدين الان

    • لايوجد اعضاء مسجلون يتصفحون هذه الصفحه
×
×
  • اضف...

Important Information