إجمالي مرات مشاهدة الصفحة

السبت، 8 أكتوبر 2016

الشرح المستفيض لكود البحث المتقدم باستخدام المصفوفات للأستاذ الكبير ياسر العربي Search Using Arrays

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

 كود البحث المتقدم باستخدام المصفوفات VBA Arrays

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

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

يوجد بالمرفق ورقتي عمل أحدهما باسم Data وفيها البيانات الخام من 14 عمود ، والورقة الأخرى باسم Result للنتائج وبها الخلية G2 والتي توضع بها نص الكلمة المراد البحث عنها.



وإليكم الكود مع الشرح بالتفصيل (وضعت مثال بسيط ليستطيع المتتبع للشرح فهم الكود بسهولة)

Sub Araby_Search()
    'تعريف المتغير لورقة العمل التي تحتوي على البيانات الخام
    Dim wsData As Worksheet

    'تعريف المتغير لورقة العمـل المطلـوب إظهـار النتائـج بها
    Dim wsResult As Worksheet

    'تعريف المتغير ليحمل قيم المصفـوفة للبيانات الخـام
    Dim Arr As Variant

    'تعريف المتغير ليحمل قيم المصفوفة للنتائج المطلوبة
    Dim Temp As Variant

    'تعريـف المتغير من النـوع النصي ليحمـل قيمة أو نص البحث
    'أي الكلمة المطلوب البحث عنها يتم تخزينها في هذا المتغير
    Dim strSearch As String
    
    'تعريف المتغير وسيستخدم في الحلقة التكرارية لصفوف المصفوفة
    Dim I As Long
    
    'تعريف المتغير وسيستخدم في الحلقة التكرارية لأعمدة المصفوفة
    Dim J As Long
    
    'تعريف المتغير وسيستخدم في مصفوفة النتائج لزيادة مقدار الصفوف بمقدار واحد
    Dim P As Long
    
    'تعيين قيمة للمتغير ليساوي ورقة العمل التي تحتوي
    '[Data] على البيانات الخام المطلوب معالجتها والمسماة
    Set wsData = Worksheets("Data")

    'تعيين قيمة للمتغير ليساوي ورقة العمل التي تريد إظهار
    '[G2] النتائج بها بمجرد إدخال قيمة أو نص محدد في الخلية
    Set wsResult = Worksheets("Result")
    
    'مسح النطاق الذي توضع فيه النتائج استعداداً لوضع النتائج الجديدة
    wsResult.Range("A8:N10000").ClearContents
    
    '[G2] تعيين قيمة للمتغير ليساوي قيمة الخلية
    'وهي الخلية التي ستوضع فيها نص الكلمة المطلوب البحث عنها
    strSearch = wsResult.Range("G2").Value
    
    'تعيين قيمـة للمتغير ليحمل قيم النطاق بالكامل للبيانات الخام
    ' وذلك [Data] حيث أن مصـدر البيانات الخام ورقة العمل المسماة
    'عند [N] وينتهي في العمود [A5] في النطاق الذي يبدأ من الخلية
    '[&] آخـر صف به بيانات ، ويتم تحديده عن طريـق الجزء بعد علامـة
    Arr = wsData.Range("A5:N" & wsData.Cells(Rows.Count, 1).End(xlUp).Row).Value
    
    'والتي ستحمل قيم النتائج [Temp] إعادة تعيين أبعاد المصفوفة المسماة
    '[Arr] وتكون بنفس أبعاد المصفوفة التي تحمل البيانات الخام والمسماة
    'سنعتبر المصفوفة أشبـه بالصفـوف والأعمدة حيث الرقـم 1 يمثـل الصفـوف
    'بإرجاع أكبر قيمة [UBound]بينما الرقم 2 يمثل الأعمدة ، وتقوم الكلمة
    'أبعاد المصفوفة في هذه الحالة >>
    '-------------------------------
    'البعد الأول سيكون من 1 إلى أكبر قيمة للصفوف
    'البعد الثاني سيكون من 1 إلى أكبر قيمة للأعمدة
    ReDim Temp(1 To UBound(Arr, 1), 1 To UBound(Arr, 2))
    
    'حلقة تكرارية من الصف الأول للمصفوفة إلى آخر صف بها
    For I = 1 To UBound(Arr, 1)
    
        'إذا كان النص المطلوب البحث عنه فارغ يتم الخروج من تنفيذ الكود
        If strSearch = "" Then Exit Sub
        
        'هذا السطر هو أهم سطر بالكود حيث هو الشرط الذي من خلاله
        'والشرط [Temp] ستوضع النتائج في مصفوفة النتائج المسماة
        'هـو تطابق قيمة المصفوفة في صف الحلقة في العمود رقم 14
        'حيث يمثـل الرقم 14 العمود داخـل مصفوفة البيانات الخام
        '[strSearch] يتـم اختبـار التطابـق مع نـص البحث المسمى
        If Arr(I, 14) Like "*" & strSearch & "*" Then
            
            'زيادة مقدار المتغير بمقدار 1
            'فائدة المتغير هنا هو أنه مع كل حلقة تكرارية
            'إذا تحقق الشرط فقط يزيد المتغير بمقدار واحد
            'ليمثل هذا المتغير صفوف مصفوفة النتائج الجديدة
            P = P + 1
            
            'حلقة تكرارية داخلية من العمود الأول للمصفوفة إلى آخر عمود بها
            For J = 1 To UBound(Arr, 2)
                
                'تعبئـة مصفـوفة النتائـج بالبيانات مـن مصفوفة البيانات الخام
                '[Temp]مثـال لتتضح صورة كيفية تعبئة المصفوفة الجديدة المسماة
                'في أول حلقـة سيكون مقداره 1 ويمثل أول صف [P] المتغيـر المسمى
                'أول صف هنا لمصفوفة النتائج
                'في أول حلقة سيكون مقداره 1 ويمثل أول عمود [J] المتغير المسمى
                'في أول حلقة سيكون مقداره 1 ويمثل أول صف [I] المتغير المسمى
                'أول صف هنا لمصفوفة البيانات الخام
                Temp(P, J) = Arr(I, J)
                
            'الانتقال للحلقة التالية للأعمدة
            Next J
        
        'نهاية جملة الشرط وهو تطابق نص البحث مع العمود رقم 14 في المصفوفة
        End If
    
    'الانتقال للحلقة التالية في صفوف مصفوفة البيانات الخام
    Next I
    
    'إذا كانت قيمة المتغير أكبر من صفر فهذا يعني أنه تم إيجاد نتائج للبحث
    'حيث أن زيادة المتغير كما أوضحنا مقرونة بتحقق الشرط وطالما تحقق الشرط
    'فهذا يعني أن مصفوفة النتائج سيكون بها بيانات ومن ثم يتحقق الجزء الثاني
    
    '[A8] وضع نتائج مصفوفة النتائج في أول خلية في ورقة النتائج في الخلية
    '[P] ويتم تمديد النطاق بمقدار عدد الصفوف طبقاً لقيمة المتغير المسمى
    '[Temp] وبمقدار عدد الأعمدة طبقاً لأكبر عدد لأعمدة المصفوفة المسماة
    If P > 0 Then wsResult.Range("A8").Resize(P, UBound(Temp, 2)).Value = Temp
End Sub

إعداد / ياسر خليل أبو البراء

هناك 11 تعليقًا:

  1. ما شاء الله عليك
    تحياتى

    ردحذف
  2. مشكور على مرورك العطر أخي العزيز جلال الجمال

    ردحذف
  3. السلام عليكم
    كيف التواصل
    انا ايمن من مصر
    رقم التليفون والواتس 01116957655

    ردحذف
  4. وعليكم السلام أخي الكريم أيمن
    يمكنك إضافة حساب الفيس بوك الخاص بي yakh777@yahoo.com
    نورت المدونة بمرورك العطر

    ردحذف
    الردود
    1. الله يكرمك علي ذوقك الكريم
      ويجعل عملك لله

      حذف
  5. السلام عليكم
    اخى ياسر شرح وافى لعمل ممتاز
    جزاك الله خيرا

    ردحذف
  6. وعليكم السلام أخي أحمد
    بارك الله فيك ... مشكور على مرورك الندي بالمدونة

    ردحذف
  7. شكرا الف مليار شكرا

    ردحذف
  8. السلام عليكم يا أستاذنا كيف التحميل من هذا الموقع كلما انتظرت الرابط يحمل من جديد ولا يأتى رابط للمف

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

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

    ردحذف