VBA: كيفية الجمع إذا كان بين تاريخين

دليل أكاديمي شامل يشرح كيفية استخدام لغة VBA في إكسيل لحساب المجموع الشرطي بين تاريخين بدقة وكفاءة برمجية عالية.

Mohammed looti أكاديمي وباحث متخصص في علم النفس
تاريخ النشر
تمت المراجعة العلمية · د. مروة عبد العظيم · 20 أكتوبر، 2026
مراجعة وتدقيق علمي معتمد تاريخ التدقيق: 20 أكتوبر، 2026
د. مروة عبد العظيم دكتوراه في علم النفس
عضو هيئة التدريس • جامعة كربلاء
معايير التدقيق والاعتماد السريري

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

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

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

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

1. مقدمة عامة حول الجمع الشرطي الزمني في برمجية VBA

1.1 مفهوم التحليل الرقمي المستند إلى النطاقات الزمنية

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

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

1.2 مكانة لغة VBA في أتمتة العمليات الحسابية داخل إكسيل

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

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

1.3 أهمية الجمع الشرطي بين تاريخين في اتخاذ القرارات

يعد الجمع الشرطي الزمني بين نقطتي بداية ونهاية عنصراً محورياً في مراقبة مؤشرات الأداء الحيوية (KPIs)، ولا سيما عند احتساب الإيرادات الربع سنوية، أو تقييم تكاليف التشغيل الشهرية، أو رصد حركة دوران المخزون خلال المواسم التسويقية. تعتمد الإدارات التنفيذية على هذه الحسابات المشروطة لتحديد الاتجاهات العامة وتوزيع الموارد المالية والبشرية بدقة متناهية بناءً على الأنماط التاريخية المثبتة.

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

2. البنية النحوية والدلالية لدالة SumIfs البرمجية

2.1 تشريح الدالة WorksheetFunction.SumIfs في بيئة VBA

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

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

2.2 تحديد نطاق القيم المراد جمعها بدقة

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

تشترط الدالة تطابقاً هندسياً مطلقاً في الأبعاد بين نطاق الجمع ونطاقات الشروط المقترنة به؛ فإذا كان نطاق الجمع يمتد من الخلية C2 إلى C100، فإن أي نطاق شرطي يُمرر للدالة يجب أن يبدأ بالضرورة من الصف 2 وينتهي في الصف 100، دون أي انحراف في عدد الصفوف أو الأعمدة. إن الإخلال بهذا التناظر الهيكلي لا يمرره محرك إكسيل كخطأ برمجي صامت دائماً، بل قد يسبب انهياراً في تنفيذ الماكرو أو إرجاع نتائج حسابية غير متوقعة، فضلاً عن ضرورة التأكد من الطبيعة الرقمية البحتة للبيانات المندرجة في هذا النطاق وخلوها من القيم الخطئية مثل #VALUE! أو #DIV/0!.

2.3 آليات إسناد المعايير الشرطية المقارنة للأزمنة

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

بعد إتمام صياغة الحد الأدنى، يُعاد تمرير نطاق التواريخ نفسه كمعيار ثانٍ للدالة، ويُقرن هذه المرة بالشرط الثاني الذي يمثل الحد الأعلى للفترة الزمنية، بحيث يُلزم المحرك البرمجي بأن يكون التاريخ أصغر من أو يساوي تاريخ النهاية المعتمد. يضمن هذا الإسناد المزدوج حصر منطقة الجمع في التقاطع المنطقي (Logical AND) بين الشرطين، مما يؤدي تلقائياً إلى استبعاد كافة السجلات التي تقع قبل بداية الفترة أو تتجاوز نهايتها، محققاً بذلك الغاية الحسابية المطلوبة بدقة رياضية متناهية.

3. التأسيس المنهجي لمقارنة التواريخ في بيئة العمل

3.1 معالجة تنسيقات التواريخ المختلفة وتوحيدها

تعد التنسيقات الإقليمية للتواريخ من أعقد العقبات التي تواجه مطوري برمجيات إكسيل، نظراً للاختلاف الجوهري بين التنسيق الدولي المتبع في الولايات المتحدة الأمريكية (شهر/يوم/سنة) والتنسيق الأوروبي والشرق أوسطي المعتمد على (يوم/شهر/سنة). عندما يتم تشغيل شفرة VBA على أجهزة تعمل ببيئات لغوية متعددة، قد يفسر المحرك البرمجي تاريخاً مثل 05/06/2024 على أنه الخامس من يونيو أو السادس من مايو، مما يقود إلى مقارنات منطقية خاطئة تماماً ويفسد نتائج التجميع.

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

3.2 استخدام المعاملات المنطقية البرمجية

تعتمد المقارنات الرياضية داخل دالة SumIfs على المعاملات المنطقية القياسية التي توجه محرك الحساب لفرز القيم. لتمثيل نقطة البداية الزمنية، يُستخدم الرمز المنطقي >= للدلالة على الشمول المتكافئ، أي أن المعاملات التي تمت في نفس يوم تاريخ البداية تدخل ضمن الحساب الإجمالي. وفي المقابل، يُوظف الرمز <= لتمثيل نقطة النهاية الزمنية لضمان إدراج الحركات التي حدثت في اليوم الختامي للفترة المحددة حتى نهايته التامة.

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

3.3 تقنية الربط التسلسلي بين المعاملات والقيم المرجعية

يتطلب إسناد الشروط الزمنية الربط المحكم بين الرمز المنطقي النصي والقيمة المرجعية للتاريخ، ويتم ذلك برمجياً من خلال معامل الدمج النصي المتمثل في علامة العطف &. تعمل هذه الأداة على دمج المعامل الرياضي المحصور بين علامات التنصيص مع القيمة الزمنية المرجعية الناتجة عن خلية أو متغير، لتكوين سلسلة نصية شرطية متكاملة يفهمها محرك الجمع مثل ">=45443"، حيث يمثل الرقم التسلسل الرياضي للتاريخ.

يمكن في هذا السياق استخدام التدوين المباشر للنطاقات أو الاعتماد على الأقواس المعقوفة كاختصار لتمثيل نطاق الخلايا في بيئة العمل، إلا أن المنهجية الاحترافية تحذر من ترك مسافات فارغة غير منضبطة داخل السلسلة الشرطية. إن وجود فراغ خاطئ بين المعامل المنطقي والرقم مثل ">= " & Range("A1").Value قد لا يمنع التنفيذ في بعض الإصدارات، لكنه يشكل خطراً برمجياً صامتاً في إصدارات أخرى قد يؤدي إلى فشل مطابقة المعيار دون إطلاق تنبيه خطأ واضح، مما يوجب الالتزام بالربط التسلسلي المباشر والصارم للأكواد.

4. التحليل التفصيلي للكود البرمجي النموذجي للجمع بين تاريخين

4.1 تفكيك السطر البرمجي الأساسي وتتبع مسارات التنفيذ

لدراسة الشفرة البرمجية النموذجية بعمق، نستعرض السطر البرمجي المرجعي الذي ينفذ عملية الجمع المشروط بدقة:

TargetCell.Value = Application.WorksheetFunction.SumIfs(SumRange, DateRange, ">=" & CLng(StartDate), DateRange, "<=" & CLng(EndDate))

يبدأ مسار التنفيذ بتقييم المتغيرات المرجعية للتواريخ؛ حيث تقوم الدالة بتحويل StartDate وEndDate إلى أرقام صحيحة طويلة باستخدام التحويل التسلسلي، ثم يربط المحرك كل رقم بالرمز المنطقي المقترن به لتشكيل نص المعيار. بعد ذلك، يتولى الكائن WorksheetFunction استدعاء خوارزمية الجمع الأصلية، حيث يتم فحص كل سطر في DateRange بالتتابع للتأكد من استيفائه للشرطين معاً، وفي حال تحقق الصواب المنطقي، تُؤخذ القيمة المقابلة من SumRange وتُضاف إلى التراكم الحسابي النهائي.

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

4.2 توظيف مرجعيات الخلايا المباشرة والرمزية

تتعدد أساليب الإشارة إلى الخلايا التي تحتوي على تواريخ البداية والنهاية ونطاقات البيانات؛ إذ يمكن استخدام التدوين المبسط عبر الأقواس المعقوفة مثل [F1] أو [G1]، وهو أسلوب يتميز بالإيجاز الشديد، إلا أنه يعاني من الجمود الهيكلي وصعوبة التكيف مع التطبيقات البرمجية المعقدة لأنه لا يقبل إدراج متغيرات داخلية ويُعامل كمرجع نصي ثابت يتم تقييمه أثناء وقت التشغيل.

في المقابل، يمثل استخدام الكائن الكامل Range("F1") أو Cells(1, 6) الخيار المعياري المفضل لدى مطوري الحلول المؤسسية. يمنح هذا الأسلوب استقراراً إجرائياً متقدماً، حيث يمكن التحكم في ورقة العمل المصدر بصورة ديناميكية، وتمرير مؤشرات الصفوف والأعمدة كمتغيرات عددية تتغير مع تغير دورات المعالجة، مما يحمي الشفرة من الانهيار عند نقل الخلايا أو تعديل بنية الجداول الحسابية المعتمدة في النظام المؤسسي.

4.3 تخصيص الخلية الهدف لاستقبال المخرجات الرقمية

يمثل توجيه النتيجة المحسوبة إلى خلية مستهدفة بعينها الخطوة الختامية في الإجراء الإجرائي، ويتم ذلك عادة بإسناد الناتج مباشرة إلى خاصية القيمة Value للخلية، مثل Range("H1").Value = TotalResult. يضمن هذا الإجراء تثبيت الناتج الحسابي كرقم مجرد ونهائي في قاعدة البيانات، مما يمنع إثقال ورقة العمل بمعادلات المصفوفات الحية أو صيغ الجمع التلقائي المستمرة التي تستهلك المعالج وتؤخر فتح المصنفات الضخمة.

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

5. إدارة المتغيرات وأنواع البيانات الخاصة بالتواريخ في VBA

5.1 تعريف متغيرات التاريخ مقابل السلاسل النصية

تفرض الهندسة البرمجية المحكمة في VBA الإعلان الصريح عن كافة المتغيرات باستخدام الكلمة المفتاحية Dim مع إلزام المحرر بتفعيل خيار Option Explicit في صدارة الوحدة البرمجية. عند التعامل مع المتغيرات الزمنية، يتوجب تعريفها صراحة كنوع Date أو كنوع عددي Long يمثل الرقم التسلسلي لليوم، مع الامتناع التام عن تركها كمتغيرات عامة من نوع Variant التي تؤدي إلى تبديد موارد الذاكرة وإبطاء سرعة التنفيذ الحسابي.

ينطوي التعامل مع التواريخ كسلاسل نصية (String) على مخاطر جسيمة في منطق المقارنة؛ فالنصوص تُقارن هجائياً وليس زمنياً، مما يجعل نصاً مثل “12/01/2024” يظهر في المقارنة النصية كقيمة أصغر من “15/01/2023” استناداً إلى ترتيب الحرف الأول، على الرغم من أن الثاني يسبق الأول بنحو عام كامل. لذلك، فإن اختيار نوع البيانات الأنسب يحمي الخوارزمية من الأخطاء التفسيرية القاتلة ويحسن إدارة الذاكرة العشوائية من خلال تخصيص الحجم البايتي المخصص لكل متغير بدقة متناهية.

5.2 تجنب الأخطاء الشائعة المرتبطة بالنظام الزمني الدولي

تنشأ معظم الإخفاقات البرمجية عند تطبيق معايير الجمع بين تاريخين من الخلل في تفسير ترتيب عناصر التاريخ بين النظامين الأمريكي والبريطاني داخل محرك VBA. يميل محرك فيجوال بيسك بطبيعته الداخلية إلى محاكاة المعايير الإقليمية الأمريكية (MM/DD/YYYY) افتراضياً عند تحويل النصوص إلى تواريخ، بغض النظر عن لغة واجهة المستخدم أو إعدادات لوحة التحكم في نظام ويندوز.

إذا أُدخل التاريخ “02/05/2024” وكان المقصد هو الثاني من مايو، فإن محرك VBA قد يتعامل معه برمجياً على أنه الخامس من فبراير إذا تمت قراءته كنص عادي عبر الدالة DateValue في بيئة غير مضبوطة. ولتأمين سلامة المقارنة التامة، يتعين على المطور تجريد التاريخ من قالبه التنسيقي وتحويله إلى رقم تسلسلي باستخدام الدالة CLng()، حيث يمثل الرقم الصحيح المقابل للتاريخ القيمة الثابتة التي لا تتبدل باختلاف الإعدادات الدولية، مما يضمن دقة الفرز المنطقي وثبات النتائج على كافة الحواسيب.

5.3 استخدام الدوال التحويلية لضبط المدخلات البرمجية

توفر مكتبة VBA مجموعة من الدوال التحويلية المتقدمة التي تضمن تنقية المدخلات وضبطها قبل تمريرها لمعادلات الجمع. تبرز دالة CDate() كأداة قوية لتحويل التعبيرات الصالحة إلى النوع الزمني المعتمد، إلا أن المنهجية الأكثر صرامة وأماناً تتمثل في توظيف دالة DateSerial(Year, Month, Day)، حيث تستقبل أرقام السنة والشهر واليوم بصورة منفصلة وتعيد بناء التاريخ رياضياً بمعزل تام عن أي التباسات نصية محتملة.

قبل الشروع في تنفيذ أي عملية حسابية، ينبغي تطبيق صمام أمان برمجي للتحقق من أهلية القيم المرجعية باستخدام دالة الفحص IsDate(). تتيح هذه الدالة اختبار محتوى الخلية أو المتغير مسبقاً؛ فإذا تبين أن القيمة المدخلة عبارة عن نص عشوائي أو قيمة رقمية مشوهة، يتم توجيه مسار البرنامج لإيقاف التنفيذ وإصدار إشعار توجيهي للمستخدم، مما يمنع حدوث انهيارات برمجية مفاجئة أثناء تشغيل التطبيق في بيئة الإنتاج الميدانية.

6. تقنيات التعامل مع النطاقات الديناميكية والمرنة

6.1 تحديد النطاقات متغيرة الحجم برمجياً

نادراً ما تكون قواعد البيانات المحاسبية وسجلات المبيعات ذات أحجام ثابتة؛ إذ تتزايد السجلات يومياً مع كل حركة إدخال جديدة، مما يجعل الاعتماد على نطاقات ثابتة مثل A2:A100 ممارسة برمجية قاصرة وغير عملية. يتطلب الحل الاحترافي تحديد النطاقات بطريقة ديناميكية مرنة تتكيف تلقائياً مع تمدد البيانات دون تدخل يدوي مستمر لتعديل حدود الأسطر البرمجية.

تتحقق هذه المرونة البرمجية من خلال استخدام خاصية End(xlUp) بالاقتران مع كائن الخلية في أقصى قاع ورقة العمل، مثل Cells(Rows.Count, "A").End(xlUp).Row. تحاكي هذه الشفرة النقر على زري Ctrl و السهم العلوي للوصول إلى آخر صف غير فارغ بدقة فائقة. يتيح هذا النهج حصر عمليات الفحص والجمع ضمن حدود البيانات الحقيقية فقط، متجنباً مسح ملايين الخلايا الفارغة، مما يسهم في تقليص زمن المعالجة وتسريع استجابة النظام المحاسبي بصورة ملحوظة عند إضافة سجلات جديدة.

6.2 استخدام كائنات النطاق المتغيرة في الدالة

بمجرد تحديد رقم الصف الأخير في قاعدة البيانات، يتم تعيين كائنات النطاق المتغيرة باستخدام الكلمة المفتاحية Set لتمثيل أعمدة التواريخ والمبالغ الفعلية بدقة. يمكن على سبيل المثال إنشاء كائن باسم rngDates ليشمل النطاق من Range("A2:A" & LastRow)، وكائن آخر باسم rngValues ليشمل النطاق الموازي Range("B2:B" & LastRow).

تُمرر هذه الكائنات المعرفة مباشرة كوسائط ضمن دالة WorksheetFunction.SumIfs، مما يضفي على الشفرة وضوحاً بنيوياً وأناقة تصميمية بالغة. يرفع هذا الأسلوب من مرونة البرنامج وقابليته للصيانة وإعادة الاستخدام؛ إذ يمكن نقل نفس المنطق البرمجي لتطبيقه على أوراق عمل متباينة أو جداول متفرقة بمجرد تعديل تسمية الأعمدة، دون الحاجة إلى إعادة صياغة الروابط الرياضية أو إعادة كتابة مسارات الخلايا المرجعية.

6.3 تحسين كفاءة الحساب عند التعامل مع قواعد البيانات الكبيرة

تفرض قواعد البيانات الضخمة التي تحتوي على مئات الآلاف من القيود عبئاً حسابياً هائلاً على معالج الحاسوب، خاصة إذا كانت أوراق العمل تتضمن مراجع لأعمدة كاملة مثل A:A أو B:B. على الرغم من أن إكسيل يحاول تحسين استهلاك الذاكرة، إلا أن مسح الأعمدة بكامل امتدادها (الذي يتجاوز مليون صف) داخل الحلقات البرمجية أو الدوال المشروطة يؤدي إلى تباطؤ ملحوظ وتجميد مؤقت لواجهة المستخدم.

أثبتت التحليلات البرمجية المقارنة أن قصر النطاقات على المساحات المشغولة فعلياً يقلص زمن التنفيذ بنسب تتجاوز 80% في الجداول المليونية. كما أظهرت الدراسات المنهجية التي تدرس التباين الهيكلي في مجموعات البيانات الكبيرة أن التحديد الانتقائي للنطاقات يحد من التشتت الحسابي غير الضروري ويضمن استقرار معدلات استهلاك الذاكرة العشوائية (Wikberg et al., 2012). ينعكس هذا التحسين المنهجي مباشرة على زمن إنجاز التقارير الدورية ويمنع استنزاف موارد النظام الحسابية في عمليات غير منتجة.

7. بدائل برمجية متقدمة لحساب المجموع بين تاريخين

7.1 استخدام الدالة Evaluate لمحاكاة الصيغ المعقدة

تمثل دالة التقييم Application.Evaluate تقنية برمجية استثنائية تتيح لمطوري VBA كتابة الصيغ الحسابية كجمل نصية وتمريرها مباشرة إلى محرك الحساب الداخلي لإكسيل لتنفيذها كما لو كانت قد كُتبت يدوياً داخل شريط الصيغ. تُمكن هذه الخاصية المبرمج من الاستفادة من كافة الدوال المصفوفية المعقدة دون الحاجة إلى الالتزام الصارم بالواجهات الهيكلية لكائن WorksheetFunction.

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

7.2 توظيف الحلقات التكرارية مع الجمل الشرطية المنطقية

يعد بناء الحلقات التكرارية التتابعية، مثل حلقة For...Next أو For Each...Next، الأسلوب الكلاسيكي الأكثر شفافية للتحكم الدقيق في مسار البيانات. يقوم هذا المنهج على فحص خلايا عمود التاريخ خلية تلو الأخرى، وتطبيق جملة المقارنة المنطقية If...Then للتحقق مما إذا كانت القيمة تقع في النطاق المحصور بين تاريخ البداية وتاريخ النهاية المعتمدين.

عند تحقق الشرط المنطقي في سطر معين، يتم جمع القيمة المقابلة تراكمياً داخل متغير عددي مخصص مثل RunningTotal = RunningTotal + Cell.Offset(0, 1).Value. بعد اكتمال الدوران عبر كامل السجلات، تُفرغ النتيجة النهائية في الخلية المستهدفة. يفضل اللجوء إلى هذا البديل عند الحاجة إلى إجراء عمليات معالجة إضافية متزامنة مع الجمع، مثل فحص شروط نصية موازية، أو تطبيق عمليات ترجيح إحصائية، أو تسجيل مؤشرات استثنائية تتجاوز القدرات المباشرة لدوال الجمع المشروط القياسية.

7.3 المقارنة التحليلية بين دالة SumIfs والحلقات التكرارية

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

ومع ذلك، توفر الحلقات التكرارية، خاصة عند تحميل البيانات بالكامل إلى مصفوفات الذاكرة الداخلية (Variant Arrays)، استقراراً فائقاً ومقاومة للتغيرات غير المتوقعة في هيكلية ورقة العمل، فضلاً عن إتاحتها للمطور بناء معايير شرطية بالغة التعقيد يصعب اختزالها في شروط الجمع القياسية. يوضح الجدول التالي مقارنة منهجية شاملة بين أبرز طرق الجمع الشرطي بين تاريخين في بيئة VBA:

المعيار المقارن WorksheetFunction.SumIfs Application.Evaluate الحلقات التكرارية في الذاكرة (Arrays)
سرعة التنفيذ الحسابي عالية جداً (مترجمة عبر النواة) متوسطة إلى عالية فائقة السرعة للبيانات المليونية
مرونة الشروط المركبة محدودة بالشروط المنطقية المباشرة مرنة للغاية لصيغ إكسيل المتنوعة مطلقة (تدعم كافة الهياكل البرمجية)
سهولة الصيانة وتصحيح الأخطاء سهلة وواضحة المعالم معقدة وصعبة التتبع تتطلب كفاءة برمجية متوسطة إلى متقدمة
استهلاك الذاكرة العشوائية منخفض ومضبوط ذاتياً منخفض إلى متوسط يتطلب حجز مساحات مؤقتة للمصفوفات
مقاومة الأخطاء الإقليمية تتطلب تحويلاً تسلسلياً صريحاً حساسة جداً لصياغة الفواصل الزمنية عالية جداً عند التحويل البرمجي الصريح

8. معالجة الاستثناءات والأخطاء الشائعة أثناء التنفيذ

8.1 التعامل مع أخطاء عدم تطابق الأنواع برمجياً

يعد خطأ “عدم تطابق الأنواع” البرمجي، المعروف بالرمز (Error 13: Type Mismatch)، من أكثر العثرات شيوعاً عند التعامل مع الدوال الشرطية الزمنية في VBA. يظهر هذا الخطأ عادة عندما يحاول المحرك البرمجي مقارنة متغير تم تعريفه كنوع زمني Date مع خلية تحتوي على نص أبجدي أو رمز خطأ محاسبي، أو عندما يحتوي عمود المبالغ المراد جمعها على مسافات فارغة محاطة بأحرف خفية تعجز الدالة عن معاملتها كقيم عددية قابلة للجمع.

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

8.2 إدارة الخلايا الفارغة والقيم المفقودة في أعمدة التواريخ

تمثل القيم المفقودة والخلايا الفارغة في أعمدة التواريخ مصدر تشويه رئيسي للنتائج الحسابية؛ إذ يتعامل إكسيل أحياناً مع الخلية الفارغة على أنها تمثل اليوم الصفري (الموافق لـ 30 ديسمبر 1899 في النظام التسلسلي القياسي). إذا كانت الشروط الزمنية تتضمن مقارنات غير مقيدة بالحدود الصفرية، فقد تؤدي هذه المعاملة التلقائية إلى إدراج خلايا غير صالحة ضمن نطاق الجمع أو إسقاط سجلات جوهرية كان ينبغي التحقق منها.

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

8.3 تطبيق هياكل الحماية ومعالجة الأخطاء المنظمة

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

يلعب هذا الهيكل الوقائي دوراً حيوياً في إعادة ضبط بيئة عمل إكسيل إلى وضعها الافتراضي؛ إذ يضمن استعادة خصائص تحديث الشاشة والحساب التلقائي التي تم تعطيلها مؤقتاً لرفع السرعة الحسابية. وفي المنهجيات البحثية التطبيقية، يُعد الرصد المنهجي لمثل هذه الانحرافات التشغيلية والبيئية ركيزة أساسية لمنع الأخطاء المؤسسية الصامتة والحفاظ على اتساق السجلات المالية والإدارية المعقدة (Jankowski et al., 2019). يتولى قسم معالجة الأخطاء عرض رسالة توضيحية مفهومة تشرح سبب الخلل بلغة المستخدم الطبيعية وتمنع إغلاق التطبيق بصورة قسرية.

9. بناء دالة مخصصة (UDF) للجمع الشرطي الزمني

9.1 تحويل الإجراء الإجرائي Sub إلى دالة معرفة من قبل المستخدم

يختلف الإجراء الإجرائي العام (Sub) عن الدالة المعرفة من قبل المستخدم (User Defined Function – UDF) في طبيعة الاستخدام والوظيفة؛ فالأول ينفذ سلسلة من الأوامر والتحركات داخل أوراق العمل دون إرجاع قيمة مباشرة إلى الخلية المستدعية، في حين تصمم الدوال البرمجية (Functions) لإرجاع قيمة حسابية محددة إلى نفس الموضع الذي استدعيت منه، مما يجعلها قادرة على العمل التفاعلي المباشر من شريط الصيغ القياسي في إكسيل مثيلاتها من الدوال المدمجة.

يتم بناء الدالة البرمجية المخصصة عبر استبدال الكلمة المفتاحية Sub بالكلمة Function، مع تعيين اسم دال يعبر عن طبيعتها الحسابية، مثل SumBetweenDates. ويجب في ختام الدالة إسناد القيمة المحسوبة إلى نفس اسم الدالة، مع تحديد نوع البيانات المرجعة صراحة، مثل Double أو Currency، لضمان التوافق الحسابي التام مع العمليات الرياضية اللاحقة التي قد تستند إلى مخرجات هذه الدالة في ورقة العمل.

9.2 هندسة المعاملات المرنة للدالة المخصصة

تتطلب هندسة الدالة المخصصة تحديد معاملات دخول مرنة وقوية تتيح للمستخدم النهائي استدعاءها بسهولة وسلاسة من خلال واجهة إكسيل. ينبغي أن تستقبل الدالة أربعة معاملات رئيسية محددة الأنواع بدقة:

  • نطاق المبالغ المراد جمعها: ويُعرف ككائن نطاق SumRange As Range.
  • نطاق التواريخ المرجعية: ويُعرف ككائن نطاق متطابق الأبعاد DateRange As Range.
  • تاريخ بداية الفترة: ويُعرف كمتغير زمني أو تسلسلي StartDate As Variant.
  • تاريخ نهاية الفترة: ويُعرف كمتغير زمني أو تسلسلي EndDate As Variant.

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

9.3 اختبار ونشر الدالة المخصصة ضمن بيئة العمل

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

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

10. أفضل الممارسات المنهجية والتطبيقات العملية المتقدمة

10.1 تحسين الأداء البرمجي وتوفير الموارد الحاسوبية

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

تتمثل الممارسة القياسية الفضلى في تعطيل تحديث الشاشة مؤقتاً في بداية الإجراء باستخدام الأمر Application.ScreenUpdating = False، وإيقاف الحساب التلقائي للصيغ عبر Application.Calculation = xlCalculationManual، مع تعطيل تسجيل الأحداث التفاعلية عبر Application.EnableEvents = False. تساهم هذه الخطوات الاحترازية في توجيه طاقة المعالج المركزية بالكامل لإتمام خوارزمية الجمع المشروط في أسرع وقت، على أن تتم استعادة الإعدادات الأصلية للنظام بصورة حتمية فور اكتمال الحساب وقبل إنهاء الإجراء.

10.2 توثيق الكود البرمجي وتنظيمه وفق المعايير الأكاديمية

يعد التوثيق الداخلي للشفرة البرمجية ركيزة لا غنى عنها لضمان استدامة الأنظمة المحاسبية وقابليتها للصيانة والتطوير الدوري. يتطلب التنظيم المنهجي تضمين تعليقات توضيحية صريحة (باستخدام علامة الفاصلة العليا ') تسبق كل مرحلة إجرائية، لتوضيح الغرض من كل متغير، وبيان أسباب اختيار صيغة معينة للمقارنة المنطقية، وشرح كيفية التعامل مع التنسيقات الزمنية الخاصة.

إلى جانب التوثيق، يجب الالتزام بقواعد التسمية القياسية المعترف بها دولياً، مثل استخدام تدوين الجمل (CamelCase) أو البادئات الهنغارية لتوضيح أنواع المتغيرات (مثل استخدام dtStart لمتغيرات التاريخ وrngData لكائنات النطاقات). يسهم هذا الانضباط الهيكلي في تقسيم المشاريع المعقدة إلى وحدات برمجية مستقلة ومتخصصة يسهل على المطورين الآخرين تدقيقها ومراجعتها دون استغراق وقت طويل في فك طلاسم البناء الإجرائي للشفرة.

10.3 أتمتة استخراج التقارير الدورية بالاعتماد على الفترات الزمنية

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

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

الخلاصة والآفاق التطويرية

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

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

المراجع

  • Jankowski, R. L., Black, A. C., Lazar, C. M., Brummett, B. R., & Rosen, M. I. (2019). Consideration of substance use in compensation and pension examinations of veterans filing PTSD claims. PLoS ONE, 14(1), e0210938. https://doi.org/10.1371/journal.pone.0210938
  • Wikberg, E. C., Sicotte, P., Campos, F. A., & Ting, N. (2012). Between-Group Variation in Female Dispersal, Kin Composition of Groups, and Proximity Patterns in a Black-and-White Colobus Monkey (Colobus vellerosus). PLoS ONE, 7(11), e48740. https://doi.org/10.1371/journal.pone.0048740
★

تقييم هذا المحتوى

5.0 / 5 • 7 تقييمات

اقتباس هذا المقال

looti, M. (2026, أكتوبر 20). VBA: كيفية الجمع إذا كان بين تاريخين. عرب سايكلوجي. https://arabpsychology.com/statistics/vba-how-to-sum-if-between-two-dates/
looti, Mohammed. “VBA: كيفية الجمع إذا كان بين تاريخين.” عرب سايكلوجي, 20 أكتوبر 2026, https://arabpsychology.com/statistics/vba-how-to-sum-if-between-two-dates/.
looti, Mohammed. “VBA: كيفية الجمع إذا كان بين تاريخين.” عرب سايكلوجي. أكتوبر 20, 2026. https://arabpsychology.com/statistics/vba-how-to-sum-if-between-two-dates/.