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

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

  • ابوخليل changed the title to استخراج السنة من التاريخ
قام بنشر

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

 

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

30/11/2009  ،  2012-06-25  ،  21/6/2015م  ،  " 9/1/2014"  ،  30\11\2009  ، 5/1999/26  ،  25/1999/6  ،  5/1994/ 26  ،  وحتى بعضها بالارقام الهندية ،

فعملت الدالة التالية ، والتي ترسل لها التاريخ المطلوب تعديله ، والدالة تصلح التاريخ وترجعه.

 

ومنها تقدر تحصل على السنة 🙂

 

هذه هي الدالة:


Function Date_Rectified(D As String) As Date
On Error Resume Next

    Dim x() As String
    Dim P1 As String, P2 As String, P3 As String
    
    
    D = Trim(D)
    D = Replace(D, "(", "")
    D = Replace(D, ")", "")
    D = Replace(D, "    ", "")
    D = Replace(D, "   ", "")
    D = Replace(D, "  ", "")
    D = Replace(D, " ", "")
    D = Replace(D, "*", "")
    D = Replace(D, "م", "")
    
    D = Replace(D, ChrW(1632), "0") 'الرقم الهندي صفر
    D = Replace(D, ChrW(1633), "1")
    D = Replace(D, ChrW(1634), "2")
    D = Replace(D, ChrW(1635), "3")
    D = Replace(D, ChrW(1636), "4")
    D = Replace(D, ChrW(1637), "5")
    D = Replace(D, ChrW(1638), "6")
    D = Replace(D, ChrW(1639), "7")
    D = Replace(D, ChrW(1640), "8")
    D = Replace(D, ChrW(1641), "9")
    
    D = Replace(D, "!", "-")
    D = Replace(D, "/", "-")
    D = Replace(D, "//", "-")
    D = Replace(D, "\", "-")
    D = Replace(D, ".", "-")
    D = Replace(D, "_", "-")
    D = Replace(D, "|", "-")
    D = Replace(D, ",", "-")
    D = Replace(D, Chr(34), "")
 
    
    If Len(D) = 4 Then
        'starts with year, but its 4 digits only:1999
        'convert to 1-1-1999 OR EMPTY
        
        Date_Rectified = DateSerial(D, 1, 1)
        Exit Function
    End If
    
If D = "5/1994/ 26" Then
Debug.Print D
End If
    
    
    x = Split(D, "-")
    P1 = x(0): P2 = x(1): P3 = x(2)
    
    
    If Len(P1) = 4 And Len(P2) <> 0 Then
        'starts with year, and month exist: 1999-1-2
        
        Date_Rectified = DateSerial(P1, P2, P3)
        
    ElseIf Len(P3) = 4 And Len(P2) <> 0 Then
        'ends with year, and month exist: 2-1-1999
        
        Date_Rectified = DateSerial(P3, P2, P1)
                
                
    ElseIf Len(P2) = 4 And Len(P1) <= 12 Then
        'year in the middle, day and month exist: 5/1999/26
        
        Date_Rectified = DateSerial(P2, P1, P3)
        
    ElseIf Len(P2) = 4 And Len(P1) > 12 Then
        'year in the middle, day and month exist: 25/1999/6

        Date_Rectified = DateSerial(P2, P3, P1)
                
                
    Else
        'otherwise
        Date_Rectified = Null
        
    End If
    
End Function

 

  • Like 1
  • Thanks 3
قام بنشر
1 ساعه مضت, jjafferr said:

ومنها تقدر تحصل على السنة 🙂

هذه هي الدالة:

 

يا سلام عليك  الله يحفظك  .. نحن بحاجة الى مواضيع متخصصة تضاف الى المكتبة يتم فيها تجميع  مثل هذه الروائع بعناوين حسب كل فن

 

 

 

 

 

  • Like 1
قام بنشر
4 دقائق مضت, ابوخليل said:

يا سلام عليك  الله يحفظك  .. نحن بحاجة الى مواضيع متخصصة تضاف الى المكتبة يتم فيها تجميع  مثل هذه الروائع بعناوين حسب كل فن

شكرا جزيلا اخوي ابو خليل

عملت موضوع لهذه الجزئية:

 

قام بنشر
3 ساعات مضت, jjafferr said:

هذه هي الدالة:

ماشاء الله تبارك الله .. لك بصمة  في كل مجال 🙂 

  • Like 1
قام بنشر (معدل)

ومشاركة مع معلمي الأفاضل ، دعني أضيف قطرة من بحر علمهم 😇 .

يمكننا باستخدام دالة Mid والتي تستخدم لاستخراج جزء معين من النص ، وعلى افتراض أن اسم الحقل النصي هو MyDate ، يمكنك استخدام الاستعلام التالي لاستخراج السنة :

 

SELECT MyDate, Mid(MyDate, InStrRev(MyDate, "/") + 1, 4) AS YearNum
FROM YourTable;

* طبعاً مع تغيير اسم الجدول أيضاً في YourTable ؛ و أيضاً لم أقم بمشاهدة ملف الأستاذ محمد لطفي أيضاً 🤗 إن كان قد استخدم اسلوب الاستعلام .

 

واذا أردنا توسيق الفكرة كما أشار المعلم الفاضل الأستاذ جعفر ، قد نجعل الاستعلام بهذا الشكل ايضاً بحيث مع اختلاف اتجاه كتابة التاريخ ( من اليمين لليسار أو العكس ) أو ايضاً بدلاً من الفاصل "/" يمكن ان يكون "-" على سبيل المثال ,

 

SELECT MyDate,
    IIf(InStr(MyDate, "-") > 0,
        Left(MyDate, 4),
        IIf(Len(MyDate) = 10,
            IIf(Left(MyDate, 4) Like "####", 
                Left(MyDate, 4), 
                Right(MyDate, 4)),
            Null)
    ) AS YearNum
FROM YourTable;

 

تم تعديل بواسطه Foksh
إضافة استعلام آخر وتوسيع نطاق الفكرة

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

زائر
اضف رد علي هذا الموضوع....

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

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

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

Important Information