JavaScript is not enabled!...Please enable javascript in your browser

جافا سكريبت غير ممكن! ... الرجاء تفعيل الجافا سكريبت في متصفحك.

-->
Startseite

📊 كيفية انشاء تقرير بين تاريخين تلقائياً في دقيقة واحدة باستخدام Excel VBA


 كيفية إنشاء تقرير ديناميكي بين تاريخين باستخدام VBA في Excel

 

في عالم الأعمال والمحاسبة، تعتبر التقارير الوسيلة الأساسية لمتابعة الأداء واتخاذ القرارات. من أكثر أنواع التقارير شيوعًا وأهمية هي تلك التي تُظهر البيانات المحصورة بين فترتين زمنيتين؛ مثل تقرير الفواتير لشهر معين، أو حركة مبيعات بين يوم وآخر.

 

بدلاً من إنشاء هذه التقارير يدويًا في كل مرة، وهو ما قد يستغرق وقتًا وجهدًا، يمكننا اللجوء إلى لغة البرمجة المدمجة في إكسل وهي VBA (Visual Basic for Applications) لأتمتة هذه المهمة بالكامل. في هذا المقال، سنقوم بشرح كود برمجي بسيط وفعّال يقوم بإنشاء تقرير احترافي بناءً على تاريخين محددين.

 الفكرة العامة للمشروع

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

1.  يأخذ تاريخ البداية وتاريخ النهاية من خلايا محددة في ورقة التقرير.

2.  يبحث في ورقة مصدر البيانات (وهي في مثالنا ورقة باسم `invoice`) عن جميع السجلات التي يقع تاريخها بين هذين التاريخين.

3.  يقوم بنسخ هذه السجلات ولصقها في ورقة التقرير (`rep_invoice`)، مع ترتيبها أسفل بعضها البعض.

4.  يقوم بمسح أي بيانات قديمة من التقرير ليُظهر النتائج الجديدة فقط.

 

 شرح الكود بالتفصيل

 

لنبدأ بكتابة الكود داخل نافذة محرر VBA (التي نفتحها بالضغط على `Alt + F11`). سنقوم بإنشاء Sub إجراء جديد نسميه `rep_between_tow_dates()`.

 Sub rep_between_tow_dates()

 

    ' تعريف المتغيرات

    Dim wsSource As Worksheet, wsReport As Worksheet

    Dim lastRow As Long, i As Long, reportRow As Long

    Dim startDate As Date, endDate As Date

 

    ' إيقاف تحديث الشاشة لتسريع الأداء ومنع وميض الشاشة

    Application.ScreenUpdating = False

 

    ' 1 - تحديد أوراق العمل المصدر والهدف

    Set wsSource = ThisWorkbook.Sheets("invoice")      ' ورقة البيانات الأساسية

    Set wsReport = ThisWorkbook.Sheets("rep_invoice")  ' ورقة عرض التقرير

 

    ' 2 - تنظيف التقرير القديم

    ' مسح أي بيانات موجودة مسبقًا في نطاق التقرير (من الصف 7 إلى G100000)

    wsReport.Range("A7:G100000").ClearContents

 

    ' 3 - قراءة التواريخ من ورقة التقرير

    With Sheets("rep_invoice")

        .Select

        startDate = .Range("C4").Value   ' قراءة تاريخ البداية من الخلية C4

        endDate = .Range("E4").Value     ' قراءة تاريخ النهاية من الخلية E4

    End With

 

    ' 4 - تحديد الصف الأخير الذي يحتوي على بيانات في ورقة المصدر

    ' نبحث في العمود B (الذي يحتوي على التواريخ) عن آخر خلية فيها بيانات

    lastRow = wsSource.Cells(wsSource.Rows.Count, "B").End(xlUp).Row

 

    ' 5 - تحديد الصف الذي سنبدأ بالكتابة منه في التقرير

    reportRow = 7 ' نبدأ من الصف 7، حيث أن الصفوف السابقة قد تحتوي على عناوين التقرير

 

    ' 6 - الحلقة الرئيسية: المرور على جميع صفوف ورقة المصدر

    For i = 3 To lastRow ' نبدأ من الصف 3 غالباً لترك مساحة للعناوين في ورقة المصدر

 

        ' 7 - شرط التصفية: التحقق مما إذا كان التاريخ يقع بين الفترتين المحددتين

        If wsSource.Cells(i, "B").Value >= startDate And _

           wsSource.Cells(i, "B").Value <= endDate Then

 

            ' 8 - نسخ البيانات: إذا تحقق الشرط، نقوم بنقل البيانات صفاً بصفاً

            wsReport.Cells(reportRow, 1).Value = wsSource.Cells(i, "A").Value

            ' نقوم بتنسيق التاريخ في العمود الثاني ليظهر بالصيغة السنة/الشهر/اليوم

            wsReport.Cells(reportRow, 2).Value = Format(wsSource.Cells(i, "B").Value, "yyyy/mm/dd")

            wsReport.Cells(reportRow, 3).Value = wsSource.Cells(i, "C").Value

            wsReport.Cells(reportRow, 4).Value = wsSource.Cells(i, "D").Value

            wsReport.Cells(reportRow, 5).Value = wsSource.Cells(i, "E").Value

            wsReport.Cells(reportRow, 6).Value = wsSource.Cells(i, "F").Value

            wsReport.Cells(reportRow, 7).Value = wsSource.Cells(i, "G").Value

 

            ' الانتقال إلى الصف التالي في التقرير لاستقبال البيانات الجديدة

            reportRow = reportRow + 1

        End If

    Next i

 

    ' 9 - إنهاء الإجراء وإعلام المستخدم

    MsgBox "تم إنشاء التقرير بنجاح!", vbInformation

    Application.ScreenUpdating = True

 

End Sub

 

 نقاط القوة في هذا الكود

 

1.  الديناميكية: الكود لا يتعامل مع نطاقات ثابتة. فهو يبحث عن آخر صف في البيانات (`lastRow`) ويتعامل مع أي عدد من السجلات.

2.  المرونة: يمكنك بسهولة تغيير أسماء الأوراق (`invoice`, `rep_invoice`) أو الخلايا التي تحتوي على التواريخ (`C4`, `E4`) لتناسب تصميم ملفك.

3.  الكفاءة: استخدام `Application.ScreenUpdating = False` يجعل الكود يعمل بشكل أسرع، خاصة إذا كانت هناك آلاف السجلات.

4.  الوضوح: الكود مقسم إلى أجزاء واضحة، مما يجعله سهل القراءة والتعديل لمن لديه معرفة بسيطة بالبرمجة.

 

 كيفية استخدام الكود في ملفك الخاص

 

1.  تجهيز ورقتي العمل:

    - تأكد من وجود ورقة باسم invoice` تحتوي على البيانات. يجب أن يكون العمود `B` في هذه الورقة هو العمود الخاص بالتواريخ.

    - تأكد من وجود ورقة باسم rep_invoice` والتي ستحتوي على التقرير. ضع في الخلية `C4` تاريخ البداية، وفي الخلية `E4` تاريخ النهاية. يجب أن يحتوى الصف السابع في هذه الورقة على عناوين الأعمدة (مثل: الرقم، التاريخ، العميل، المبلغ...إلخ).

2.  إدراج الكود:

    - افتح محرر VBA بالضغط على `Alt + F11`.

    - من القائمة `Insert`، اختر `Module`.

    - الصق الكود في النافذة الفارغة على اليمين.

3.  تشغيل الكود:

    - يمكنك تشغيل الكود بالضغط على `F5` ومؤشر الكتابة داخل الكود، أو يمكنك رسم زر (Form Control Button) على ورقة التقرير وتحديد الماكرو `rep_between_tow_dates` ليعمل بنقرة زر واحدة.

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

لتحميل ملف العمل 

 قد يعجبك ايضا            




NameE-MailNachricht