تمثل لغة البرمجة الفيجوال بيسك للتطبيقات (Visual Basic for Applications – VBA) إحدى أهم الركائز البرمجية التي استندت إليها أتمتة الأعمال المكتبية وإدارة قواعد البيانات ومعالجة جداول البيانات المعقدة على مدار العقود الثلاثة الماضية. وفي صميم أي نظام حوسبي يعالج البيانات، تبرز الحاجة الماسة إلى بناء هياكل برمجية قادرة على توجيه مسار التنفيذ واتخاذ القرارات بناءً على متغيرات آنية متعددة. إن التفرع الشرطي ليس مجرد وسيلة لاختيار اتجاه في مسار البرنامج، بل هو انعكاس رياضي للمنطق الصوري الذي وضعه فلاسفة وعلماء الرياضيات الأوائل، وتم تطويعه في لغات الحوسبة لإعادة إنتاج التفكير التحليلي البشري في صورة تعليمات تنفيذية حاسمة ودقيقة.
في بيئة مايكروسوفت إكسيل، تتجاوز الجمل الشرطية مجرد فحص قيمة مفردة في خلية ما؛ إذ يتطلب الواقع العملي في التحليل المالي والإحصائي والهندسي اختبار منظومات متعددة من المتغيرات في آنٍ واحد. وهنا تبرز الأهمية القصوى للمعامل المنطقي OR (الفصل المنطقي) المقترن بالجملة الشرطية IF. إن هذا الاقتران يمنح المطورين القدرة على التحقق من استيفاء شرط واحد على الأقل من بين مجموعة واسعة من الشروط المتباينة والمتشابكة، دون الحاجة إلى تشويه البنية البرمجية بتعقيدات التداخل الشرطي المتكرر، مما ينعكس إيجاباً على سرعة المعالجة ومقروئية الكود وكفاءته الهندسية.
يهدف هذا الدليل الأكاديمي الشامل إلى تفكيك وتحليل آليات استخدام الجملة الشرطية IF OR في بيئة VBA تحليلاً معمقاً؛ بدءاً من التأصيل النظري لجبر بولين والترجمة الداخلية للقيم الثنائية في الذاكرة الحوسبية، مروراً بالصياغة النحوية الدقيقة والتحليل الرياضي لجداول الحقيقة، ووصولاً إلى استعراض أفضل الممارسات المتقدمة في معالجة الأداء، وتفادي فخاخ غياب “التقييم قصير الدائرة” (Short-Circuit Evaluation)، وبناء تطبيقات برمجية متينة ومحصنة ضد الأخطاء البرمجية والتشغيلية في قطاعات الأعمال الحساسة.
1. مقدمة تأصيلية حول الجمل الشرطية والمنطق البوليني في برمجة VBA
1.1 مفهوم اتخاذ القرار والتحكم في مسار التدفق البرمجي
يقوم مفهوم التحكم في مسار التدفق البرمجي (Control Flow) في علوم الحاسوب على فكرة محورية مفادها أن البرامج لا تسير دائماً في مسار خطي تتابعي يتنقل ببساطة من تعليمة إلى التعليمة التي تليها، بل تخضع لنقاط انعطاف حاسمة تحدد وفقاً لحالة البيانات اللحظية أي كتلة من الكود يجب تنفيذها وأيها يتعين تجاهله. تُعد البنى التفرعية (Branching Structures) هي الأداة الرياضية والمنطقية الأساسية التي تمكّن الحواسيب من إدارة العمليات الحسابية المتطورة ومحاكاة عمليات اتخاذ القرار المعقدة التي يمارسها العقل البشري، حيث تعمل الجملة الشرطية كبوابة منطقية تفحص المدخلات لتحدد الوجهة التالية للتدفق.
تاريخياً، ارتبط تطور لغة Visual Basic for Applications بتطور المنطق الصوري الكلاسيكي الذي تم تدشينه مع لغات البرمجة العالية المستوى في النصف الثاني من القرن العشرين، حيث هدفت مايكروسوفت إلى تقديم لغة سهلة القراءة تشبه اللغة الإنجليزية الطبيعية ولكنها تستند بالكامل إلى صرامة المنطق الثنائي. يعتمد المنطق البوليني (Boolean Logic)، المنسوب إلى عالم الرياضيات البريطاني جورج بول، على افتراض أساسي مفاده أن أي قضية خبرية تحمل إحدى قيمتين لا ثالث لهما: الصواب المطلق (True) أو الخطأ المطلق (False). وفي سياق جداول البيانات، يسمح هذا المنطق الثنائي بتحويل مصفوفات الأرقام والنصوص الضخمة إلى قرارات تنفيذية؛ مثل تصنيف الموظفين، أو تحديد استحقاق المكافآت، أو اكتشاف التناقضات المالية في القيود المحاسبية.
1.2 الأسس النظرية للروابط المنطقية في الحوسبة
تعتبر الروابط المنطقية (Logical Connectives) الأدوات الرياضية المسؤولة عن الجمع بين قضيتين بسيطتين أو أكثر لتكوين قضية شرطية مركبة. ويأتي في مقدمة هذه الروابط مفهوم “الفصل المنطقي” (Logical Disjunction)، الذي يتم التعبير عنه حوسبياً بالمعامل OR. رياضياً، يُعرَّف الفصل المنطقي بأنه عملية تعطى نتيجتها قيمة الصواب إذا كانت إحدى القضايا المكونة لها على الأقل صائبة، ولا تعطي قيمة الخطأ إلا في حالة واحدة مطلقة، وهي أن تكون جميع القضايا المنضوية تحتها خاطئة بالكامل.
من الناحية الدلالية واللغوية، يجب التمييز بدقة بين نوعين من الانفصال: الانفصال الشامل (Inclusive OR) والانفصال الحصري (Exclusive OR – XOR). يعبر المعامل OR التقليدي في VBA عن الانفصال الشامل، مما يعني أنه يتقبل تحقق أحد الشروط أو تحققها جميعاً في آنٍ واحد، في حين أن الانفصال الحصري يقبل تحقق شرط واحد فقط ويعد تحقق كلا الشرطين إخفاقاً للمنطق. عند ترجمة هذه المفاهيم في بيئة تشغيل إكسيل، يقوم المحلل النحوي لمحرك VBA بتحويل هذه التعبيرات إلى عمليات مقارنة ثنائية في سجلات المعالج، مما يسمح بتجاوز القيود المفاهيمية للاختبارات الشرطية الفردية التي تقتصر على فحص بعد بياني واحد، والانتقال إلى نمذجة سيناريوهات متعددة الأبعاد تستوعب تعقيدات بيانات العالم الواقعي.
1.3 أهمية المعامل OR في بيئة تطبيقات مايكروسوفت أوفيس
تنبع أهمية المعامل OR في بيئة تطبيقات مايكروسوفت أوفيس، ولا سيما إكسيل، من الحاجة الدائمة إلى تقييم احتمالات متعددة تؤدي إلى النتيجة الوظيفية ذاتها. فبدلاً من صياغة جمل شرطية متسلسلة أو متداخلة تفحص كل احتمال في مسار منفصل، يتيح المعامل OR دمج كافة المعايير الممكنة ضمن أمر برمجي موحد وموجز. هذا الاختزال الهيكلي يؤدي دوراً محورياً في تنظيف الشفرة البرمجية، حيث يتفادى المطور الانزلاق إلى ما يعرف في هندسة البرمجيات بـ “كود المعكرونة” (Spaghetti Code) الناجم عن تشابك وتعدد طبقات التعليمة If...Then...Else المتداخلة.
علاوة على ذلك، فإن استخدام المعامل OR يسهم بشكل مباشر في تحسين مقروئية التعليمات البرمجية وقابليتها للصيانة والتدقيق الأكاديمي، إذ يسهل على أي مراجع خارجي فهم القواعد المنطقية التي تحكم نموذج الأعمال بمجرد قراءة سطر برمجي واحد. ومن منظور كفاءة المعالجة، على الرغم من بعض القيود التشغيلية التي ستتم مناقشتها لاحقاً، فإن توحيد الاستعلامات المنطقية يقلل من تشتت مفسر الأكواد بين الكتل الشرطية، ويوفر مساراً برمجياً واضح المعالم يسهل ربطه مع معالجات الأحداث ونماذج واجهات المستخدم وقواعد البيانات الخارجية.
2. البنية النحوية الأساسية لعبارة IF OR في بيئة VBA
2.1 التكوين العام والتسلسل الصوري للكود البرمجي
تخضع الجملة الشرطية المركبة باستخدام المعامل OR في بيئة Visual Basic Editor (VBE) إلى قواعد نحوية صارمة تنظم العلاقة بين الكلمات المحجوزة والتعبيرات المنطقية. تبدأ الجملة دائماً بالكلمة المحجوزة If متبوعة بالتعبير الشرطي الأول، ثم المعامل المنطقي OR، يليه التعبير الشرطي الثاني (أو تعبيرات أخرى متتالية)، وتُختتم العبارة التمهيدية بالكلمة المحجوزة Then. يتم وضع المعامل المنطقي فاصلاً بين طرفين يمثل كل منهما عبارة منطقية كاملة الأركان قادرة على توليد قيمة بولينية مستقلة.
من الناحية الهيكلية، يمكن كتابة الجملة الشرطية وفق أسلوبين: أسلوب السطر الواحد (Single-Line Syntax)، حيث يوضع الكود المراد تنفيذه مباشرة بعد Then في نفس السطر، وهو نمط يناسب الأوامر البسيطة والموجزة، ولكن يعيبه انخفاض المقروئية واستحالة إدراج تعقيدات تفرعية متعددة. أما الأسلوب القياسي الموصى به في البيئات الأكاديمية والمؤسسية فهو أسلوب الأسطر المتعددة (Block Syntax)، والذي ينتهي بالكلمة المحجوزة End If، مع استخدام المسافات البادئة (Indentation) بمقدار أربع مسافات (أو ضغطة Tab واحدة) لتمييز كتلة الأوامر المنفذة التابعة لكل فرع شرطي، مما يمنح الشفرة وضوحاً بصرياً يبرز التراتبية المنطقية للأوامر.
2.2 أنماط البيانات المتوافقة مع المقارنة المنطقية
تتمتع لغة VBA بمرونة فائقة في إجراء المقارنات المنطقية عبر مجموعة متنوعة من أنماط البيانات (Data Types)، إلا أن هذه المرونة تتطلب حذراً بالغاً من المبرمج لضمان التوافق المنطقي والنوعي. ففي مجال السلاسل النصية (String Expressions)، يتم استخدام معاملات المقارنة مثل علامة التساوي (=) أو عدم التساوي (<>)، مع ضرورة مراعاة القيود المتعلقة بالفراغات وحساسية حالة الأحرف الأبجدية التي تحكمها بيئة المحرر.
أما في معالجة القيم العددية (Numeric Data)، بمختلف تصنيفاتها كالأعداد الصحيحة (Integer, Long) أو الأعداد العشرية ونقاط الكسر العائم (Single, Double, Currency)، فإن المعامل OR يتيح دمج مقارنات المدى الحسابي باستخدام علامات أكبر من (>) وأصغر من (<) ومكافئاتها المركبة. وإلى جانب ذلك، يمكن للمقارنات المنطقية أن تتعامل مباشرة مع المتغيرات البولينية الصريحة (Boolean Variables) دون الحاجة لمقارنتها بـ True أو False، كما تستوعب شروط تطابق المتغيرات الزمنية والتواريخ (Date Types)، والتي يعاملها محرك VBA داخلياً كأرقام كسرية مزدوجة الدقة تمثل الأيام المنقضية منذ نقطة زمنية مرجعية محددة.

2.3 تحليل الشيفرة القياسية للنموذج الأساسي
لتفكيك البنية القياسية لإجراء شرطي يعتمد على IF OR، نفترض وجود سيناريو برمجى كلاسيكي يتم فيه اختبار مدخلين في ورقة عمل نشطة: اسم الفريق في الخلية A2 وعدد النقاط المحرزة في الخلية B2. يتطلب السيناريو وسم السجل بأنه “مؤهل” إذا كان اسم الفريق يطابق “Warriors” أو إذا كانت النقاط المحرزة تتجاوز حاجز المئة نقطة (100). يتجلى هذا النموذج البرمجي الصوري في الكود التالي:
Sub IfOrTest()
If Range("A2").Value = "Warriors" Or Range("B2").Value > 100 Then
Range("C2").Value = "مؤهل"
Else
Range("C2").Value = "غير مؤهل"
End If
End Sub
عند تحليل هذا الإجراء، نجد أن التعبير المنطقي الأول Range("A2").Value = "Warriors" يعيد قيمة نصية تتم مقارنتها مع الثابت الحرفي. وفي الوقت نفسه، يمثل التعبير الثاني Range("B2").Value > 100 مقارنة عددية كمية. يفصل بين هذين التعبيرين المعامل Or. ينتقل مسار التنفيذ إلى الفرع الإيجابي الذي يسجل “مؤهل” في الخلية C2 في حال تحقق أي من الشرطين بمفرده، أو في حال تحققهما سوياً، بينما لا يتم التحول إلى كتلة Else إلا عند إخفاق كلا الشرطين في آن واحد، أي عندما يكون الفريق ليس “Warriors” والنقاط أقل من أو تساوي 100.
3. ميكانيكية عمل المعامل المنطقي OR وجداول الصواب والخطأ
3.1 جدول الحقيقة الرياضي (Truth Table) للمعامل OR
يعد جدول الحقيقة (Truth Table) الأداة الرياضية المعتمدة لتحليل وتقييم السلوك القطعي للمعاملات المنطقية تحت شتى الاحتمالات الممكنة لمدخلاتها. عند دراسة المعامل OR الثنائي (الذي يربط بين قضيتين $P$ و $Q$)، تتشكل أمام المبرمج أربعة سناريوهات احتمالية تحدد المخرجات المنطقية النهائية للعملية الشرطية برمتها، وهي مبنية كالتالي:
- الحالة الأولى (P = True, Q = True): عندما يتحقق الشرط الأول والشرط الثاني معاً، تكون النتيجة الإجمالية للتعبير المركب
True، مما يؤدي فوراً إلى تفعيل فرع الكود الرئيسي التابع لـThen. - الحالة الثانية (P = True, Q = False): عندما يتحقق الشرط الأول بمفرده ويخفق الشرط الثاني في استيفاء معاييره، تكون النتيجة النهائية
Trueأيضاً، لأن طبيعة الانفصال المنطقي تكتفي بصحة طرف واحد لإجازة العبارة ككل. - الحالة الثالثة (P = False, Q = True): عندما يكون الشرط الأول خاطئاً ولكن الشرط الثاني يتحقق بصورة صحيحة، تظل النتيجة النهائية
True، مما يعكس مرونة المعامل في استيعاب البدائل الوظيفية. - الحالة الرابعة (P = False, Q = False): وهي الحالة الاستثنائية الوحيدة التي تفضي إلى خروج التعبير المنطقي بنتيجة
False، حيث يفشل كلا الطرفين في تحقيق المعيار المطلوب، مما يجبر البرنامج على القفز إلى فرعElseأو تجاوز الجملة الشرطية بالكامل في حال عدم وجود فرع بديل.
3.2 كيفية تقييم المترجم (Compiler) للشروط المركبة
تختلف بيئة VBA عن العديد من لغات البرمجة الحديثة (مثل C# أو Python أو JavaScript) في نقطة جوهرية تتعلق بكيفية تقييم التعبيرات الشرطية المركبة داخل المترجم اللحظي ومحرك التشغيل. في اللغات الحديثة، يتم تطبيق مفهوم يعرف بـ “التقييم قصير الدائرة” (Short-Circuit Evaluation)، والذي يقتضي أنه إذا كان الطرف الأول من المعامل OR صحيحاً (True)، يتوقف المعالج فوراً عن فحص الأطراف اللاحقة، لأن النتيجة النهائية قد حُسمت بالفعل بكونها صحيحة أياً كانت قيمة الشروط الباقية.
على النقيض تماماً، تفتقر لغة VBA التقليدية إلى هذه الخاصية؛ إذ تتبع استراتيجية “التقييم الشامل المباشر” (Eager Evaluation). هذا يعني أن محرك VBA سيقوم بحساب وتقييم كل تعبير منطقي موجود على طرفي المعامل OR دون استثناء، حتى لو ثبتت صحة التعبير الأول بشكل قاطع. تترتب على هذا السلوك تداعيات بالغة الأهمية على كفاءة استهلاك الموارد الحوسبية؛ فإذا كان أحد الشروط يتضمن استدعاء دالة مخصصة معقدة، أو يتطلب إجراء استعلام بطيء في قاعدة بيانات، أو قراءة مكثفة لبيانات من القرص الصلب، فإن هذه العملية ستُنفذ حتماً وتستنزف زمن المعالجة حتى لو لم تكن هناك أي حاجة فعلية لتقييمها بعد ثبوت صحة الشرط المقترن معها.
3.3 تمثيل النتائج منطقياً في ذاكرة الحاسوب
في البنية التحتية لذاكرة VBA، لا يتم تخزين القيم البولينية كمجرد مفاهيم فلسفية مجردة، بل يتم حجز مساحة تخزينية محددة لها في الذاكرة العشوائية تبلغ عادةً 2 بايت (16 بت)، وهي تعامل داخلياً كأرقام صحيحة موقعة (Signed Integers). الاصطلاح الداخلي الصارم لمايكروسوفت ينص على أن القيمة البولينية False تمثل بالرقم الثنائي 0 (حيث تكون جميع البتات الستة عشر أصفاراً)، في حين أن القيمة البولينية True تمثل بالرقم الثنائي -1 (حيث تكون جميع البتات الستة عشر وحدات في نظام المكمل الثنائي Two’s Complement).
بناءً على هذه الهيكلية المنخفضة المستوى، يعمل المعامل OR في VBA فعلياً كمعامل على مستوى البت (Bitwise Operator). عندما يوضع المعامل OR بين تعبيرين منطقيين، يقوم المترجم بإجراء مقارنة نقطية (Bitwise Disjunction) بين التمثيلين الثنائيين للقيمتين. وإذا تصادف تفاعل قيم منطقية مع قيم رقمية صريحة في نفس التعبير المقارن، يجري المترجم تحويلاً تلقائياً للأنواع (Implicit Type Casting)، وهو ما قد يقود أحياناً إلى نتائج حسابية غير متوقعة إذا لم يكن المطور مدركاً تماماً للأساس الرياضي الذي يحكم سلوك البتات خلف كواليس واجهة المستخدم.
4. دراسة حالة تطبيقية: اختبار الشروط النصية والعددية المتزامنة
4.1 إعداد بيئة العمل وهيكلة البيانات المدخلة
لتطبيق المفاهيم النظرية في بيئة عمل حقيقية، نأخذ نموذجاً واقعياً لتحليل أداء الفرق الرياضية في بطولة إقليمية؛ حيث يتم إنشاء ورقة عمل جديدة في مايكروسوفت إكسيل، وتنسيق الأعمدة المخصصة لاستقبال البيانات. يتم تخصيص العمود A لأسماء الفرق، بينما يخصص العمود B لتسجيل النقاط المحرزة، ويخصص العمود C كحقل ديناميكي يسجل حالة الأهلية للتأهل بناءً على منطق القرار البرمجي، مع تركيز الفحص الأولي على السجل الممثل في النطاق A2:C2.
قبل الشروع في كتابة الأكواد، من الضروري تهيئة بيئة التطوير من خلال تفعيل علامة تبويب “المطور” (Developer Tab) في شريط أدوات إكسيل، وفتح محرر الفيجوال بيسك (Alt + F11). ينبغي التأكد من ضبط إعدادات حساسية حالة الأحرف في أعلى الوحدة النمطية، حيث يلعب التوجيه Option Compare Text أو Option Compare Binary دوراً حاسماً في كيفية مطابقة النصوص؛ إذ يضمن التوجيه Text تجاهل الفروق بين الحروف الكبيرة والصغيرة، وهو أمر بالغ الحيوية عند التعامل مع أسماء الفرق أو البيانات المدخلة يدوياً بواسطة مستخدمين متعددين لتجنب إخفاق المطابقة الظاهرية.

4.2 كتابة وتنفيذ إجراء اختبار الشروط (IfOrTest)
تبدأ الخطوة التنفيذية بإدراج وحدة نمطية قياسية (Standard Module) داخل مصنف العمل، وصياغة الإجراء البرمجي التوثيقي المسمى IfOrTest. يعتمد هذا الإجراء على التفاعل المباشر مع واجهة الخلايا في ورقة العمل لتنفيذ الحكم الشرطي وتوثيق النتيجة اللحظية داخل الخلية C2. تتطلب هذه العملية صياغة منطقية تحصن البرنامج ضد المدخلات الفارغة وتضمن الدقة الوظيفية للتنفيذ وفق البنية البرمجية المتكاملة التالية:
Option Explicit
Option Compare Text
Public Sub IfOrTest()
' التحقق من صحة واكتمال المدخلات الأساسية لتجنب أخطاء المعالجة
If IsEmpty(Range("A2").Value) And IsEmpty(Range("B2").Value) Then
MsgBox "يرجى إدخال بيانات صالحة في الحقول المطلوبة.", vbExclamation, "خطأ في الإدخال"
Exit Sub
End If
' تقييم الشرط المركب باستخدام معامل الفصل المنطقي
If Range("A2").Value = "Warriors" Or Range("B2").Value > 100 Then
Range("C2").Value = "مؤهل للمرحلة التالية"
Range("C2").Interior.Color = RGB(198, 239, 206) ' إضاءة خلفية خضراء
Else
Range("C2").Value = "مستبعد"
Range("C2").Interior.Color = RGB(255, 199, 206) ' إضاءة خلفية حمراء
End If
End Sub
يتم تنفيذ هذا الإجراء إما بالضغط المباشر على المفتاح الوظيفي F5 داخل محرر التعليمات البرمجية، أو عبر ربط الماكرو بزر تحكم رسومي (Form Control Button) يتم إدراجه مباشرة على واجهة ورقة العمل لتمكين المستخدم النهائي من تشغيل عملية التحقق بنقرة واحدة ومراقبة استجابة الخلية المستهدفة بصرياً وبرمجياً.
4.3 تحليل السيناريوهات المحتملة لمخرجات الخلية المستهدفة
عند الشروع في مرحلة الاختبار التجريبي للإجراء، يتم فحص السلوك الوظيفي للكود تحت أربعة نماذج من البيانات المدخلة لتأكيد دقة المسار المنطقي:
السيناريو الأول: إذا تم إدخال الاسم “Warriors” في الخلية A2 وسُجل الرقم 85 في الخلية B2، فإن الطرف الأول من الشرط يعطي True والطرف الثاني يعطي False؛ وبما أن الرابط هو OR، يقبل البرنامج التعبير ككل ويسجل في الخلية C2 عبارة “مؤهل للمرحلة التالية” مع تلوين الخلية بالأخضر، مما يثبت نجاح الشرط النصي المنفرد في حسم النتيجة.
السيناريو الثاني: إذا احتوت الخلية A2 على الاسم “Lakers” واحتوت الخلية B2 على الرقم 115، فإن الشرط النصي يخفق (False) بينما ينجح الشرط العددي (True). هنا أيضاً تسجل الخلية C2 حالة التأهل، وهو ما يعكس استجابة المعامل للبديل الرقمي وتجاوزه للعائق النصي.
السيناريو الثالث: إدخال “Warriors” مع رصيد نقاط يبلغ 130 نقطة؛ حيث يتحقق كلا الشرطين النصي والعددي معاً بصورة متزامنة. تعطي المقارنة الثنائية True Or True مما يوجه التنفيذ إلى فرع التأهل تلقائياً مؤكداً الطبيعة الشاملة للرابط المنطقي.
السيناريو الرابع: إدخال “Bulls” مع تسجيل 92 نقطة فقط. في هذا الموقف، يخفق الشرط النصي تماماً وتفشل القيمة العددية في تخطي العتبة الحرجة (100). وكنتيجة مباشرة لإخفاق طرفي المعادلة، يقفز مفسر الكود متجاوزاً فرع الإيجاب إلى كتلة Else، ليتم إدراج كلمة “مستبعد” باللون الأحمر في الخلية C2، مما يؤكد أن الاستبعاد يتطلب بالضرورة السقوط المشترك لكافة الضوابط المحددة.
5. استخدام الأقواس والترتيب المنطقي لتفادي الأخطاء التقييمية
5.1 أسبقية المعاملات الحسابية والمنطقية (Operator Precedence)
تمتلك لغات البرمجة، بما فيها VBA، سلماً صارماً يحدد أسبقية المعاملات (Operator Precedence)، وهو الترتيب الذي تتبعه بيئة التشغيل لفض النزاعات الحسابية والمنطقية عندما تجتمع معاملات متعددة في سطر برمجي واحد. ينص هذا السلم القياسي على تنفيذ العمليات الحسابية أولاً (مثل الأسس، ثم الضرب والقسمة، ثم الجمع والطرح)، تليها معاملات الربط النصي، ثم تأتي معاملات المقارنة العلائقية (مثل =, >, <, <>)، وأخيراً يتم حل المعاملات المنطقية.
وحتى داخل المعاملات المنطقية نفسها، توجد تراتبية تفصيلية حاسمة؛ حيث يتم أولاً تقييم نفي القضايا عبر المعامل NOT، يليه العطف المنطقي عبر المعامل AND، وفي المرتبة الدنيا يقع الفصل المنطقي عبر المعامل OR، يتبعه المعامل الحصري XOR والمكافئات المنطقية Eqv و Imp. يترتب على هذا الترتيب أن أي تعبير يحتوي على AND و OR دون استخدام الأقواس سيقوم المترجم فيه بحساب كتلة AND أولاً وفصلها تماماً قبل النظر في ارتباطها بالمعامل OR، وهو ما قد يقلب النتيجة الرياضية رأساً على عقب ويخلق ثغرات منطقية كارثية في النماذج المحاسبية والتحليلية يصعب اكتشافها بالفحص البصري العابر.
5.2 أهمية الأقواس في عزل الشروط المركبة وتوضيح المقاصد
تعتبر الأقواس الرياضية الأداة الوحيدة القادرة على كسر وتعديل الترتيب الافتراضي لأسبقية المعاملات في لغة VBA؛ فالقاعدة البرمجية العامة تقضي بأن ما بداخل الأقواس يتم حسابه وتقييمه أولاً بأعلى درجات الأولوية، بغض النظر عن طبيعة المعاملات المستخدمة داخله أو خارجه. لذا، فإن استخدام الأقواس لا ينبغي أن يُنظر إليه كإجراء تجميلي اختياري، بل كضرورة هندسية لحماية المنطق الداخلي للتطبيق من التفسيرات التلقائية الخاطئة للمترجم.
إلى جانب ضبط الأسبقية الحسابية، تلعب الأقواس دوراً محورياً في تحسين التوثيق الذاتي للشفرة المصدرية؛ حيث تساعد المراجعين الأكاديميين ومطوري النظم الآخرين على إدراك المقاصد المعمارية للأكواد المعقدة على الفور. فعند عزل كل شرط مقارنة نصي أو عددي داخل زوج مستقل من الأقواس، تتضح الحدود الفاصلة بين المعطيات والمتغيرات، وينتفي أي لبس مفاهيمي حول ما إذا كان المعامل OR ينطبق على جزئية محددة من السطر البرمجي أم يمتد ليشمل كافة التعبيرات التي تليه.
5.3 تطبيقات متقدمة للأقواس في التعبيرات الشرطية المتعددة
تتجلى القوة الحقيقية للأقواس عند بناء استعلامات منطقية هجينة تضم معاملات متعددة متباينة في آن واحد. لنتأمل السيناريو المالي الذي يتطلب تقديم خصم تجاري للعميل إذا كان ينتمي إلى فئة “عملاء النخبة” أو إذا تجاوز إجمالي مشترياته 10,000 دولار، شريطة أن يكون حسابه البنكي نشطاً وخالياً من النزاعات القضائية في جميع الأحوال دون استثناء.
إذا كُتب الشرط بالصيغة المجردة التالية بدون استخدام دقيق للأقواس:
If CustomerType = "Elite" Or PurchaseTotal > 10000 And AccountStatus = "Active" Then
فإن مترجم VBA، بناءً على تفوق المعامل AND في الأسبقية على OR، سيقوم بربط الشق الثاني مع الشق الثالث أولاً، مما يجعل التعبير يعني وظيفياً: “امنح الخصم إذا كان الحساب نشطاً والمشتريات فوق 10,000، أو امنح الخصم لأي عميل نخبة أياً كانت حالة حسابه حتى لو كان حسابه مجمداً أو ملغى!”. هذا الخلل الكارثي يتم تفاديه وإصلاحه جذرياً بإعادة الهيكلة المنطقية عبر حصر كتلة الاحتمالات التفضيلية للمعامل OR داخل أقواس مستقلة كالتالي:
If (CustomerType = "Elite" Or PurchaseTotal > 10000) And (AccountStatus = "Active") Then
بهذا التعديل البسيط، يُجبر المترجم على التحقق أولاً من انطباق أحد شرطي الأهلية للخصم، ثم إخضاع النتيجة بكاملها للشرط الحاسم غير القابل للتفاوض وهو نشاط الحساب، مما يضمن دقة الامتثال لسياسات الأعمال المؤسسية.
6. التفاعل مع خلايا ونطاقات إكسيل عبر كائنات Range و Cells
6.1 الفروق الدلالية والتشغيلية بين كائني Range و Cells
توفر بيئة كائنات إكسيل (Excel Object Model) وسيلتين أساسيتين للإشارة إلى الخلايا وفحص قيمها داخل الجمل الشرطية: الكائن Range والكائن Cells. يعتمد الكائن Range على أسلوب الإسناد النصي التقليدي المشابه لمعادلات ورقة العمل المألوفة، مثل Range("A1") أو Range("B2:C10")، مما يجعله الخيار الأمثل عند التعامل مع خلايا ثابتة ذات مواقع جغرافية محددة سلفاً داخل الكود، لكونه يمنح المطور وضوحاً فورياً حول هوية الخلية المستهدفة بمجرد النظر للشفرة البرمجية.
على الجانب الآخر، يعتمد الكائن Cells على الإحداثيات الرقمية الثنائية عبر تزويده برقم الصف أولاً ثم رقم العمود، مثل Cells(2, 1) للإشارة إلى الخلية A2. تنبع القوة التشغيلية الهائلة لكائن Cells من توافقه المطلق مع الحلقات التكرارية (Loops)، حيث يمكن استبدال الأرقام بمتغيرات عددية تتغير قيمتها ديناميكياً أثناء الدوران (مثل Cells(i, j)). كما يتفوق Cells بشكل طفيف في سرعة الوصول الداخلي مقارنة بـ Range، نظراً لأن المترجم لا يحتاج لتحليل السلسلة النصية للأعمدة وتحويلها إلى مراجع رقمية في سجلات الذاكرة، مما يجعله الأداة المثلى عند تطبيق شروط IF OR داخل المسوح الميدانية الشاملة للبيانات الضخمة.

6.2 التعامل مع محتوى الخلية وتجنب الأخطاء القيمية
يقع العديد من المطورين في فخاخ برمجية خطيرة عند قراءة محتويات الخلايا داخل الشروط المنطقية نتيجة الخلط بين الخصائص الثلاث الأساسية للكائن: .Value و .Value2 و .Text. تعتبر الخاصية .Value2 الخيار الأسرع والأكثر كفاءة برمجياً؛ لأنها تقرأ القيمة الخام للخلية دون تكبد عبء معالجة تنسيقات التاريخ والعملات المالية المعقدة التي تنفذها الخاصية .Value، في حين تقتصر الخاصية .Text على استرجاع النص الظاهري المعروض على الشاشة بما فيه من رموز التنسيق والفراغات، وهي خاصية بطيئة للغاية وتتأثر بعرض العمود وظهور رموز الخطأ مثل ### عند ضيق المساحة.
تزداد خطورة التعامل مع محتوى الخلايا عند مصادفة خلايا تحتوي على أخطاء حسابية ناتجة عن ورقة العمل مثل #N/A أو #VALUE! أو #DIV/0!. إذا حاول الكود تقييم شرط مركب مثل:
If Cells(i, 1).Value = "Warriors" Or Cells(i, 2).Value > 100 Then
وكانت إحدى الخليتين تتضمن خطأ حسابياً، سيتوقف البرنامج فجأة وينهار مسار التشغيل ملقياً الخطأ الشهير Error 13: Type Mismatch، وذلك لأن محرك VBA يعجز عن مقارنة قيمة خطأ برمجية مع نصوص أو أرقام عادية. ولتأمين الكود ضد هذا الانهيار، يجب فحص الخلايا أولاً باستخدام دوال استباقية مثل IsError و IsEmpty و IsNumeric، وضمان سلامة البيانات قبل الزج بها في أتون المعاملات المنطقية المركبة.
6.3 تحويل الفحص من خلية واحدة إلى مصفوفات ونطاقات ممتدة
عندما تتسع قاعدة البيانات لتشمل عشرات الآلاف من الصفوف، فإن فحص كل خلية على حدة من خلال استدعاء Range أو Cells داخل حلقة تكرارية شرطية يعد من أسوأ الممارسات الهندسية التي تصيب أداء الماكرو بالشلل التام. يرجع هذا التدهور في الأداء إلى ما يسمى في هندسة النظم بـ “تبديل السياق” (Context Switching)؛ حيث يضطر المعالج في كل دورة إلى الخروج من بيئة تشغيل VBA واستدعاء كائنات تطبيق Excel COM Interface لقراءة الخلية، ثم العودة مجدداً إلى محرك اللغة.
الحل التقني الأمثل في هذا السياق يتمثل في قراءة النطاق المستهدف بأكمله دفعة واحدة وتفريغه داخل مصفوفة ذاكرة داخلية (VBA Variant Array). يتم تنفيذ كافة مقارنات IF OR على عناصر المصفوفة المخزنة في ذاكرة الوصول العشوائي (RAM) بسرعة فائقة تفوق سرعة القراءة المباشرة من الخلايا بمئات المرات. وبعد الانتهاء من تصنيف البيانات وتحديد النتائج الشرطية داخل مصفوفة مخرجات موازية، يتم إرجاع النتائج بالكامل إلى ورقة العمل بأمر برمجي موحد، مما يختزل زمن المعالجة من عدة دقائق إلى أجزاء من الثانية الواحدة.
7. المقارنة المعمقة بين المعاملين المنطقيين OR و AND في اتخاذ القرار
7.1 التمايز المفاهيمي بين الجمع المنطقي والفصل المنطقي
يمثل التمييز بين المعاملين المنطقيين AND (الجمع المنطقي أو العطف) و OR (الفصل المنطقي) الفارق الجوهري بين استراتيجيات الفلترة الشاملة الصارمة والمرنة في خوارزميات اتخاذ القرار. يقوم المعامل AND على مبدأ الشمولية الإلزامية والتقييد الصارم؛ حيث يشترط ثبوت صحة جميع الشروط المترابطة دون استثناء ليعطي نتيجة إيجابية، وأي إخفاق في شرط وحيد يؤدي تلقائياً إلى سقوط العبارة الشرطية بالكامل. في المقابل، يتبنى المعامل OR مبدأ التوسعة الاحتمالية والمرونة الوظيفية؛ حيث يفتح الباب أمام أي بديل متاح لإنجاح التعبير البرمجي، مما يجعله الأداة المثالية لتصميم أنظمة التسامح مع الأخطاء واستراتيجيات الفحص المتعدد المسارات.
في علم المنطق الرياضي، ترتبط العلاقة بين المعاملين بقوانين دي مورغان (De Morgan’s Laws)، والتي توضح كيفية نفي الشروط المركبة والتحويل العكسي بين الجمع والفصل المنطقي. ينص القانون على أن نفي العبارة المفصولة Not (A Or B) يكافئ منطقياً العبارة المعطوفة المنفية (Not A) And (Not B)، كما أن نفي العبارة المعطوفة Not (A And B) يكافئ (Not A) Or (Not B). يساعد فهم هذه القوانين مبرمجي VBA على إعادة صياغة الشروط المنطقية المعقدة وتبسيط الاستعلامات المعكوسة وتخفيف الأعباء الحسابية عند معالجة حالات الاستثناء في قواعد البيانات الضخمة.
7.2 دمج المعاملين AND و OR في شفرة شرطية واحدة
تفرض الاحتياجات العملية في الأنظمة الإدارية والمحاسبية دمج المعاملين AND و OR ضمن جملة شرطية واحدة لصياغة قواعد أعمال هجينة ومعقدة. لنفترض نموذجاً إدارياً لمكافآت العاملين في شركة متعددة الفروع: يشترط النظام لمنح المكافأة السنوية أن يكون الموظف حاصلاً على تقييم أداء استثنائي “ممتاز” أو أن يكون قد حقق مبيعات تتجاوز 500,000 ريال، ولكن هذا الامتياز مشروط بصورة قطعية بأن يكون الموظف تابعاً لفرع الرياض أو فرع جدة، مع استبعاد باقي الفروع مؤقتاً.
لتمثيل هذا القرار المنطقي بدقة متناهية، يجب دمج المعاملات مع حماية الكتل المستقلة بالأقواس لمنع التداخل العشوائي للمعاملات، كما يوضح النموذج البرمجي التالي:
If (PerformanceRating = "Excellent" Or SalesVolume > 500000) And _
(BranchLocation = "Riyadh" Or BranchLocation = "Jeddah") Then
BonusStatus = "مستحق للمكافأة السنوية"
Else
BonusStatus = "غير مستحق"
End If
في هذا البناء، تنقسم الجملة إلى مجموعتين رئيسيتين ترتبطان بمعامل AND مركزي. تتولى المجموعة الأولى فحص شروط الاستحقاق الذاتي عبر OR، بينما تتولى المجموعة الثانية فحص النطاق الجغرافي المسموح به عبر OR أخرى. وبفضل استخدام الأقواس والربط بـ AND، لن يُصرف الحافز إلا لمن يجمع بين استيفاء أحد معايير الجدارة واستيفاء أحد معايير الموقع الجغرافي المعتمدة، مما يعكس أعلى درجات التحكم المنطقي في تدفق الأعمال.
7.3 معايير الاختيار الهندسي للمعامل الأنسب في نمذجة الأعمال
يتطلب اختيار المعامل المنطقي الأنسب (AND مقابل OR) دراسة مستفيضة للآثار الاقتصادية والتشغيلية المترتبة على القرار البرمجي في نماذج الأعمال (Business Logic). في الأنظمة المالية الحساسة، مثل أنظمة الموافقة على القروض الائتمانية أو بوابات الدفع الإلكتروني، يتم ترجيح كفة المعامل AND بهدف تقليص المخاطر وحظر العمليات المشبوهة، حيث يفضل النظام رفض معاملة مشروعة على تمرير معاملة احتيالية واحدة (تقليل ما يعرف بالنتائج الإيجابية الكاذبة – False Positives).
وعلى العكس من ذلك، في أنظمة التسويق، أو استكشاف الأخطاء وتصحيحها، أو محركات البحث الداخلي في المستودعات، يفضل الاعتماد على المعامل OR لتوسيع قاعدة النتائج المسترجعة وضمان عدم إغفال أي فرصة بيعية محتملة أو مؤشر إنذار مبكر؛ حيث يكون التسامح مع وجود نتائج غير دقيقة (إيجابيات كاذبة) أفضل بكثير من استبعاد بيانات هامة (السلبيات الكاذبة – False Negatives). ويجب توثيق هذه الفلسفة المعمارية في التعليقات البرمجية للكود لضمان اتساق الصيانة المستقبلية مع الأهداف الاستراتيجية للمؤسسة.
8. بناء الشروط المتعددة المعقدة باستخدام ElseIf و Select Case مع OR
8.1 توسيع منطق IF OR باستخدام تفريعات ElseIf المتعددة
عندما تتسع رقعة الاحتمالات لتشمل خيارات تصنيف متعددة تتجاوز النتيجة الثنائية البسيطة (True/False)، تصبح بنية If...Then...ElseIf الأداة البرمجية الأساسية لهيكلة التدفق المنطقي المتدرج. تتيح هذه البنية فحص سلسلة متتابعة من الشروط المعقدة التي يمكن لكل سطر فيها أن يدمج شروطاً فرعية متعددة باستخدام المعامل OR. يتم فحص هذه الشروط بصورة هرمية من الأعلى إلى الأسفل؛ وبمجرد أن يصادف المعالج شرطاً محققاً، يتم تنفيذ الكتلة البرمجية الخاصة به فوراً، ويتجاهل المترجم كافة تفريعات ElseIf اللاحقة حتى لو كانت بعض شروطها محققة هي الأخرى.
لذلك، تقتضي القواعد الهندسية السليمة ترتيب شروط ElseIf بعناية فائقة، بحيث توضع الشروط الأكثر تحديداً وتضييقاً في قمة الهيكل الشرطي، وتترك الشروط الأكثر شمولاً وعمومية في المستويات الأدنى، كما يظهر في الكود التالي المخصص لتقييم الحالات الأكاديمية الاستثنائية للطلاب في إحدى الجامعات:
If ExamScore >= 95 Or GPA >= 3.9 Then
AcademicStatus = "مرتبة الشرف الأولى مع منحة كاملة"
ElseIf ExamScore >= 85 Or GPA >= 3.5 Then
AcademicStatus = "مرتبة الشرف الثانية"
ElseIf AttendanceRate < 75 Or DisciplinaryWarnings > 2 Then
AcademicStatus = "إنذار أكاديمي ومراجعة سلوكية"
Else
AcademicStatus = "مستوى اعتيادي"
End If
يضمن هذا التسلسل عدم ابتلاع الشروط العامة للشروط الخاصة، مما يمنح التطبيق دقته التقييمية الكاملة تحت شتى الظروف المتغيرة.
8.2 البديل الهيكلي: استخدام بنية Select Case مع القوائم المفصولة بفواصل
على الرغم من القوة التعبيرية لـ IF OR، إلا أن تكرار فحص نفس المتغير ضد قيم متعددة يولد كوداً متكرراً وطويلاً يصعب الحفاظ على نظافته وسلاسته. في مثل هذه السيناريوهات، توفر لغة VBA بديلاً هيكلياً بالغ الأناقة والكفاءة يتمثل في بنية Select Case. تتميز هذه البنية بالقدرة على استبدال المعامل المنطقي OR ببساطة متناهية من خلال استخدام الفواصل العادية (,) للفصل بين الاحتمالات المقبولة في سطر Case واحد.
لتوضيح التباين الصوري والجمالي، لنقارن بين الصياغتين البرمجيتين التاليتين لفحص الرموز الجغرافية للدول:
باستخدام IF OR:
If CountryCode = "KSA" Or CountryCode = "UAE" Or CountryCode = "QAT" Or CountryCode = "KWT" Then
Region = "Gulf Cooperation Council"
End If
باستخدام Select Case البديلة:
Select Case CountryCode
Case "KSA", "UAE", "QAT", "KWT"
Region = "Gulf Cooperation Council"
Case "EGY", "JOR", "LBN"
Region = "Middle East Other"
Case Else
Region = "International"
End Select
تتفوق بنية Select Case هنا في اختصار الكود، وتحسين القراءة التحريرية، وتسهيل إضافة خيارات جديدة مستقبلاً بمجرد إضافة فاصلة وقيمة، كما تتيح دمج نطاقات القيم باستخدام الكلمة To (مثل Case 1 To 10) أو الاشتراطات الكمية باستخدام Is (مثل Case Is > 100)، وهو ما يجعلها البديل المفضل عندما تتركز المقارنة على فحص متغير وحيد ضد بدائل متعددة متماثلة النوع.
8.3 التداخل الشرطي (Nested IF Statements) المحتوي على OR
يحدث التداخل الشرطي (Nesting) عندما يتم تضمين جملة If...Then بالكامل داخل فرع يتبع لجملة شرطية أخرى سابقة لها. وعندما تحتوي هذه الشروط المتداخلة على معاملات OR، يرتفع مستوى التعقيد الإدراكي للكود بشكل حاد، ويصبح الكود عرضة لتوليد أخطاء منطقية خفية إذا لم يُحكم تصميمه بدقة متناهية.
ينصح مهندسو البرمجيات النظيفة بتجنب تجاوز ثلاثة مستويات من التداخل الشرطي كقاعدة ذهبية. وللحد من هذه التعقيدات، يمكن اللجوء إلى استراتيجية “الحراسة والتراجع المبكر” (Guard Clauses & Early Exit)؛ حيث يتم فحص حالات الرفض أو الشروط المعوقة أولاً في أعلى الإجراء، واستخدام التعليمة Exit Sub أو Exit Function للخروج الفوري من مسار التنفيذ بمجرد تحقق أي شرط مانع يحدده المعامل OR. هذا الأسلوب المعماري يفرغ الكود الرئيسي من طبقات التداخل غير الضرورية، ويترك المسار الأساسي نظيفاً ومسطحاً وسهل التتبع والصيانة والتنقيح.
9. الأخطاء الشائعة واستراتيجيات استكشاف الأخطاء وتصحيحها في VBA
9.1 أخطاء الكتابة النحوية والصياغة المنطقية الخاطئة
يعد الخطأ النحوي والمنطقي الأكثر شيوعاً بين مطوري VBA المبتدئين، وحتى بعض الممارسين المتوسطين، هو محاولة اختزال كتابة المقارنة الشرطية اعتماداً على النمط اللغوي البشري المحكي، مثل كتابة:
If MyVar = 1 Or 2 Then ' صياغة خاطئة ومنحرفة برمجياً
يعتقد المطور هنا خطأً أن المترجم سيفهم أن المقصود هو فحص ما إذا كان المتغير MyVar يساوي 1 أو يساوي 2. لكن المحلل النحوي في VBA يفسر هذا السطر بطريقة مغايرة تماماً تعتمد على المعالجة الرياضية الصرفة للبتات؛ حيث يقوم أولاً بحساب التعبير العلائقي MyVar = 1 منتجاً قيمة بولينية (مثلاً False المقابلة للصفر 0)، ثم يقوم بإجراء عملية OR ثنائية بين الصفر والرقم 2 (والذي يمثل ثنائياً بوجود بت في الخانة الثانية). وبما أن ناتج المقارنة بين 0 و 2 هو رقم غير صفري، تترجم VBA أي رقم غير الصفر على أنه True، مما يجعل الجملة الشرطية تنتهي دائماً بكونها صحيحة بصورة دائمة وثابتة بغض النظر عن القيمة الفعلية للمتغير MyVar!
الصياغة البرمجية الصحيحة الوحيدة التي تفرضها القواعد النحوية تقتضي التصريح الكامل والواضح بالمتغير في طرفي المعادلة دون أي اختزال، كالتالي:
If MyVar = 1 Or MyVar = 2 Then ' الصياغة النحوية القويمة
تشمل الأخطاء الشائعة الأخرى نسيان الكلمة المفتاحية Then في نهاية السطر، أو إغفال وسم الإغلاق End If عند استخدام كتل الأسطر المتعددة، أو ارتكاب خطأ عدم تطابق الأنواع Type Mismatch (Run-time error 13) عند محاولة مقارنة متغير نصي صريح مع متغير رقمي داخل نفس جملة المقارنة دون استخدام دوال التحويل القياسية المناسبة.

9.2 أخطاء مطابقة النصوص وحساسية حالة الأحرف والمسافات
تعتبر النصوص من أكثر أنواع البيانات حساسية وتعقيداً عند إخضاعها لشروط IF OR في VBA. فبشكل افتراضي، ما لم يتم النص صراحة على خلاف ذلك، تعمل لغة VBA وفق نظام المقارنة الثنائية Option Compare Binary، مما يعني أن المترجم يقارن الحروف بناءً على قيمها الرقمية الداخلية في جدول ASCII أو Unicode. بناءً على هذا السلوك، فإن كلمة “Warriors” لا تتطابق مطلقاً مع كلمة “warriors” أو “WARRIORS”، وتفشل المقارنة الشرطية دون أن تدرك أعين المستخدمين السبب المباشر لهذا الإخفاق.
للتغلب على هذه المشكلة وتوحيد بيئة الفحص، يُنصح بإلزام مقارنات OR النصية بالمرور عبر دالتي التحويل UCase (لتحويل كافة الحروف إلى حروف كبيرة) أو LCase (لتحويلها إلى حروف صغيرة)، مثل:
If UCase(Range("A2").Value) = "WARRIORS" Or UCase(Range("A2").Value) = "LAKERS" Then
وإلى جانب حساسية الحروف، تبرز معضلة المسافات البيضاء الزائدة والرموز غير المرئية (Invisible Characters) التي قد تتسلل للمدخلات من برامج أخرى عبر عمليات النسخ واللصق. يؤدي وجود مسافة واحدة في بداية النص أو نهايته إلى فشل تام في التطابق الشرطي، وهو ما يستوجب الاستعانة الإلزامية بالدالة Trim لتطهير المدخلات من المسافات الهامشية قبل الشروع في فحصها داخل الشروط المنطقية.
9.3 تقنيات وأدوات التنقيح (Debugging) المتقدمة في VBE
يوفر محرر الفيجوال بيسك ترسانة متكاملة من أدوات فحص وتتبع الأخطاء البرمجية التي تتيح للمطور مراقبة الكيفية التي تقيّم بها محركات VBA الشروط المركبة خطوة بخطوة. تأتي في مقدمة هذه الأدوات “نقاط التوقف” (Breakpoints) التي يمكن وضعها عبر النقر على الشريط الجانبي الأيسر للكود أو بالضغط على المفتاح الوظيفي F9، مما يجبر البرنامج على تجميد مسار التنفيذ عند وصوله إلى الجملة الشرطية المعنية.
عقب توقف التنفيذ، يستطيع المطور استخدام المفتاح F8 للتنقل التتابعي التدريجي (Step Into) ومراقبة الفرع الشرطي الذي يختاره المعالج. كما تقدم “نافذة المراقبة المباشرة” (Immediate Window – Ctrl + G) إمكانية طباعة وفحص نواتج التعبيرات المنطقية اللحظية من خلال كتابة علامة الاستفهام متبوعة بالتعبير المراد فحصه، مثل:
? Range("A2").Value = "Warriors"
فتجيب البيئة فوراً بـ True أو False. بالإضافة إلى ذلك، تتيح “نافذة المراقبة المعينة” (Watches Window) تتبع التغيرات في قيم المتغيرات وإيقاف البرنامج تلقائياً عندما يتحقق شرط بوليني مركب معين (Break When Value Is True)، مما يختصر وقتاً هائلاً في تشخيص وتتبع أسباب الانحرافات المنطقية المعقدة.
10. تحسين الأداء الحسابي وسرعة تنفيذ الماكرو عند تعدد الشروط
10.1 قضية غياب التقييم قصير الدائرة (Eager vs Short-Circuit Evaluation)
كما تم تأصيله نظرياً، يمثل غياب خاصية “التقييم قصير الدائرة” في محرك VBA عقبة جوهرية أمام تحسين الأداء الحسابي في البرامج المعقدة؛ إذ تصر اللغة على تقييم جميع التعبيرات المنطقية المتصلة بالمعامل OR بصورة إلزامية مسبقة، بغض النظر عن كون الشرط الأول كافياً لحسم النتيجة الإجمالية بالإيجاب. يتفاقم الخطر الزمني لهذا القيد عندما ترتبط شروط OR بدوال مخصصة بطيئة أو عمليات مسح مكثفة في ملفات ومصنفات خارجية.
للالتفاف على هذا القيد ومحاكاة التقييم قصير الدائرة يدوياً لإنقاذ سرعة المعالجة، ينبغي على المطور تفكيك شرط OR الموحد إلى هيكل شرطي متسلسل يعتمد على كتل If...ElseIf المنفصلة؛ حيث يوضع الشرط السريع والأكثر احتمالاً للتحقق في قمة الهيكل، ولا يتم استدعاء الشرط البطيء أو الدالة المستنزفة للموارد إلا في الفرع الثاني الذي لا يتم الوصول إليه مطلقاً إذا نجح الشرط الأول، كما يوضح النموذج الهندسي التالي:
' محاكاة التقييم قصير الدائرة لتفادي استدعاء الدالة البطيئة
Dim ConditionMet As Boolean
ConditionMet = False
If QuickInMemoryCheck(RecordID) Then
ConditionMet = True
ElseIf HeavyDatabaseQuery(RecordID) Then ' لن تُستدعى مطلقاً إذا نجح الفحص السريع الأولي
ConditionMet = True
End If
If ConditionMet Then
' تنفيذ الأوامر المرتبطة بتحقق الشروط
End If
يضمن هذا التحوير البرمجي خفض استهلاك وحدة المعالجة المركزية بنسب قياسية، ويمنع الهدر الحسابي الناتج عن العمليات التقييمية غير الضرورية.
10.2 تحسين بيئة تشغيل إكسيل لرفع كفاءة المعالجة
عند تنفيذ إجراءات ماكرو تحتوي على مئات الآلاف من المقارنات الشرطية التي تتفاعل مع خلايا ورقة العمل، لا يقتصر العبء الزمني على محرك VBA فحسب، بل يمتد ليشمل محرك الرسوميات والحسابات الخاص بتطبيق إكسيل ككل. فمع كل تعديل تجريه الجملة الشرطية على قيمة خلية أو لونها، يقوم إكسيل تلقائياً بإعادة رسم الشاشة، وإعادة حساب كافة المعادلات والمصفوفات المرتبطة بتلك الخلية في كامل المصنف، وتفقد معالجات الأحداث (Event Handlers) لمعرفة ما إذا كان التعديل يستوجب إطلاق أكواد إضافية.
لتحقيق أقصى درجات التسريع الحسابي، يتوجب على المطور تجميد هذه الخدمات التطبيقية المؤقتة في بداية تنفيذ الإجراء، وإعادة تفعيلها بصورة آمنة عند اكتمال العمليات، وذلك عبر الكود القياسي الإلزامي التالي:
' إيقاف استنزاف الموارد التطبيقية قبل الشروع في المعالجة الشرطية المكثفة
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
' ... تنفيذ الحلقات التكرارية واختبارات IF OR هنا ...
' استعادة الحالة التشغيلية الطبيعية للتطبيق بعد انتهاء المعالجة
Application.EnableEvents = True
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
تسهم هذه التقنية بمفردها في تقليص الزمن الكلي لتنفيذ الماكرو بمعدلات تتراوح بين 70% إلى 95%، وتمنع وميض الشاشة المزعج للمستخدمين أثناء تدفق البيانات.
10.3 المعالجة الحلقية الفعالة عبر مجموعات السجلات الكبيرة
ترتبط كفاءة شروط IF OR ارتباطاً وثيقاً بنوع الحلقة التكرارية المستخدمة للمسح الميداني للسجلات. توفر VBA حلقتين أساسيتين لهذا الغرض: حلقة For...Next التقليدية وحلقة For Each...Next الموجهة للكائنات. عند التعامل المباشر مع نطاقات خلايا إكسيل، تتفوق حلقة For Each غالباً في السرعة والتوافق المعماري؛ لأنها تستخدم مؤشرات المؤشر الداخلي (Internal Pointers) للانتقال بين الخلايا دون الحاجة لإعادة حساب إحداثيات الصف والعمود في كل دورة.
ومع ذلك، تظل المعالجة عبر المصفوفات (Memory Arrays) التي أشرنا إليها سابقاً هي المعيار الذهبي المطلق لإدارة البيانات الضخمة. ويمكن قياس كفاءة هذا التحسين البرمجي بدقة متناهية باستخدام الدالة الحسابية Timer، والتي تسترجع عدد الثواني وأجزاء الثانية المنقضية منذ منتصف الليل. ومن خلال مقارنة قيمة Timer قبل وبعد انتهاء الدوران، يستطيع المطور إثبات جدوى التحسينات الهندسية ومراقبة ثبات استهلاك الذاكرة العشوائية لتفادي حدوث تسريبات الذاكرة (Memory Leaks) أثناء معالجة الملفات المؤسسية العملاقة.
11. تطبيقات متقدمة: التحقق من صحة البيانات وأتمتة التقارير
11.1 التحقق البرمجي الصارم من مدخلات المستخدم واستمارات الإدخال
يمثل التحقق من صحة البيانات (Data Validation) خط الدفاع البرمجي الأول لمنع دخول البيانات الفاسدة أو المشوهة إلى قواعد البيانات والنماذج المالية. في نماذج واجهات المستخدم (UserForms) وعناصر التحكم في أوراق العمل، يلعب المعامل IF OR دور الحارس الصارم لفحص الحقول الإلزامية والتأكد من مطابقتها للمحددات القياسية قبل الموافقة على تخزينها أو معالجتها.
يمكن استخدام OR لدمج شروط المنع والاعتراض المتعددة؛ مثل التأكد من عدم ترك الحقل فارغاً، والتأكد من أن القيمة المدخلة رقمية بحتة، وضمان بقائها ضمن النطاق الرياضي المسموح به، كما يوضح المثال التالي المخصص لفحص مدخلات نسبة الخصم المئوية:
If Trim(txtDiscount.Text) = "" Or Not IsNumeric(txtDiscount.Text) Or _
Val(txtDiscount.Text) < 0 Or Val(txtDiscount.Text) > 50 Then
MsgBox "قيمة الخصم غير صالحة! يجب إدخال رقم بين 0 و 50.", vbCritical, "خطأ في التحقق"
txtDiscount.SetFocus
Exit Sub
End If
يمتد هذا النمط ليشمل أيضاً فحص امتدادات وصيغ الملفات المستوردة؛ حيث يتم استخدام OR للتأكد من أن المسار المدخل ينتهي بأحد الامتدادات المعتمدة مثل .xlsx أو .csv أو .xlsm، وتوجيه رسائل تنبيهية واضحة ومخصصة للمستخدم تشرح بدقة سبب رفض المدخل وكيفية تصحيحه بصورة احترافية.
11.2 أتمتة تنقية وتصنيف مجموعات البيانات الإحصائية
في مجالات الإحصاء وأتمتة التقارير الإدارية، تعد عملية تنقية البيانات وتصنيفها تمهيداً لتوليد التقارير التلخيصية من أهم المهام التي تعتمد كلياً على مرونة المعامل IF OR. ففي كثير من الأحيان، تتطلب معايير الأهلية للتصنيف الإحصائي عزل وتسليط الضوء على السجلات التي تحقق مؤشرات شاذة أو استثنائية دون غيرها.
من خلال دمج شروط IF OR داخل إجراءات الأتمتة، يمكن للماكرو مسح آلاف القيود في جدول البيانات، وعزل العملاء المؤهلين لحملات تسويقية استثنائية (كالعملاء الذين أجروا أكثر من 5 طلبات في الشهر، أو الذين تجاوزت مدفوعاتهم حداً معيناً)، ونقل صفوف بياناتهم تلقائياً إلى ورقة تقارير منفصلة مع تطبيق تنسيقات شرطية متقدمة (كإبراز الخلايا بالخط العريض وتلوين الحدود). وفي الوقت نفسه، يتيح المنطق ذاته استبعاد القيم المتطرفة الشاذة (Outliers) التي قد تشوه نتائج التوزيع الإحصائي والمؤشرات القياسية للمؤسسة، مما يرفع دقة وموثوقية مخرجات الأعمال بصورة ذاتية ومستمرة.
11.3 إنشاء دوال مخصصة (User-Defined Functions – UDFs) تعتمد على IF OR
لا يقتصر استخدام IF OR على الإجراءات الفرعية المستقلة (Subs)، بل يمتد ليشكل العمود الفقري لبناء الدوال المخصصة (User-Defined Functions – UDFs) التي يمكن للمستخدم استدعاؤها مباشرة من داخل خلايا ورقة إكسيل تماماً كالدوال المدمجة مثل SUM و VLOOKUP. تتيح الدوال المخصصة للمحللين تضمين قواعد الأعمال المعقدة ومتعددة الشروط داخل دوال مركزية سهلة الاستخدام تعيد نتائج مرنة وتخفي التفاصيل البرمجية الشاقة عن المستخدم النهائي.
يوضح النموذج التالي كيفية صياغة دالة مخصصة تسمى CalculateShippingDiscount، تقبل كمدخلات نوع العميل وقيمة الفاتورة ووزن الشحنة، لتقرر ما إذا كان العميل يستحق الشحن المجاني بناءً على معايير تشغيلية متعددة تديرها شروط OR بدقة:
Public Function CalculateShippingDiscount(CustomerTier As String, OrderValue As Double, WeightKg As Double) As String
Application.Volatile False ' تحسين الأداء عبر تعطيل إعادة الحساب القسرية المستمرة
' فحص استحقاق الشحن المجاني بناءً على شروط بديلة
If CustomerTier = "VIP" Or OrderValue >= 500 Or (OrderValue >= 250 And WeightKg < 5) Then
CalculateShippingDiscount = "شحن مجاني بالكامل"
ElseIf OrderValue >= 150 Or CustomerTier = "Gold" Then
CalculateShippingDiscount = "خصم 50% على الشحن"
Else
CalculateShippingDiscount = "تعريفة الشحن القياسية"
End If
End Function
يوفر ضبط الخاصية Application.Volatile False حماية بالغة لأداء المصنف؛ حيث يمنع إكسيل من إعادة حساب هذه الدالة مع كل نقرة أو تعديل عشوائي يجري في أي مكان بالملف، ويقيد إعادة الحساب فقط بتغير قيم الخلايا المرتبطة بمدخلات الدالة تحديداً، مما يجمع بين الأناقة المنطقية والكفاءة الحسابية الفائقة.
12. أفضل الممارسات البرمجية والتوثيق الأكاديمي لكود VBA الشرطي
12.1 معايير كتابة الشفرة النظيفة (Clean Code) في وحدات VBA
تعتبر كتابة الشفرة النظيفة (Clean Code) في بيئة VBA التزاماً هندسياً يضمن استدامة النظم البرمجية وقابليتها للتطوير والتدقيق عبر أجيال متتابعة من المطورين والمحللين. تتصدر معايير الكود النظيف ضرورة التسمية الدلالية الواضحة والمعبرة للمتغيرات والإجراءات؛ فاستخدام أسماء هادفة مثل isEligibleForBonus أو hasExceededCreditLimit يوضح المقصد المنطقي للشرط فوراً، بعكس الأسماء المبهمة والمختصرة مثل x أو flag التي تضلل القارئ وتزيد من غموض الكود.
إلى جانب التسمية، تحظر المعايير الهندسية الصارمة استخدام “الأرقام والنصوص السحرية” (Magic Numbers & Strings) المخبأة عشوائياً داخل كتل المقارنة الشرطية دون تأصيل لمعناها وسياقها. ويتمثل البديل الاحترافي في تعريف هذه القيم كثوابت صريحة ذات أسماء معبرة باستخدام الكلمة المفتاحية Const في ترويسة الوحدة النمطية، مثل Const SCORE_THRESHOLD As Double = 100؛ مما يتيح للإدارة أو المطورين تعديل سياسات العمل والحدود الرقمية مستقبلاً من موضع مركزي واحد دون الحاجة للبحث المضني وتعديل عشرات الجمل الشرطية الموزعة في ثنايا الشفرة المصدرية.
12.2 التوثيق المنهجي والتعليقات التفسيرية للأكواد المعقدة
يمثل التوثيق البرمجي والتعليقات التفسيرية صلة الوصل الفكرية بين نوايا المطور والمنطق التنفيذي للشفرة. القاعدة الذهبية الراسخة في التوثيق الأكاديمي والمهني تنص على أن التعليقات يجب أن تركز بالأساس على شرح “لماذا” تم اختيار هذا المنطق أو هذا التصميم الشرطي تحديداً، وليس مجرد إعادة سرد حرفية وبديهية لـ “ماذا” يفعله الكود؛ فالسطر If A > 100 Or B = "VIP" يشرح بنفسه ما يفعله، ولكن التعليق يجب أن يوضح أن هذا الاستثناء قد أُقر بموجب قرار مجلس الإدارة رقم (44) للتعامل مع العملاء الاستراتيجيين وتفادي غرامات التأخير.
علاوة على ذلك، يجب أن تتصدر كل وحدة نمطية وكل إجراء رئيسي ترويسة توثيقية قياسية موحدة (Standard Header Block)، تتضمن اسم الإجراء، والمؤلف المسؤول، وتاريخ الإنشاء، وتاريخ آخر تعديل، وبيان الغرض الوظيفي، وتفصيل كافة الفرضيات المسبقة (Assumptions) المتعلقة بنوعية وهيكلية البيانات المدخلة والشروط الحدودية المتوقعة. كما يجب المحافظة على التحديث الدوري لهذه التعليقات بالتزامن الصارم مع أي تعديل يطرأ على البنية المنطقية، لتجنب خطر “التعليقات المضللة المتقادمة” التي تعد أشد خطراً من غياب التوثيق بالكلية.
12.3 هيكلة إدارة الأخطاء لضمان متانة واستمرارية التنفيذ
لا يمكن اعتبار أي كود برمجي يعتمد على الجمل الشرطية مكتملاً وجاهزاً للإنتاج المؤسسي ما لم يكن محصناً ببنية قوية لإدارة واعتراض الأخطاء التشغيلية (Error Handling). فبدون هذه الهيكلة، سيؤدي أي خطأ عارض في نوع البيانات أو تلف في بنية إحدى الخلايا إلى انهيار مفاجئ للتطبيق وظهور رسائل الخطأ الافتراضية المربكة للمستخدم النهائي، فضلاً عن بقاء الخصائص التطبيقية (مثل ScreenUpdating و Calculation) معطلة في حالة إيقافها، مما يصيب بيئة إكسيل بالشلل الوظيفي.
تقتضي الهيكلة الاحترافية تضمين الإجراء الشرطي داخل كتلة معالجة أخطاء تبدأ بتوجيه مسار التنفيذ عبر On Error GoTo ErrorHandler، وتفصل بين المسار الطبيعي السليم ومسار المعالجة عبر الكلمة Exit Sub. في كتلة المعالجة، يتم تفريغ الذاكرة وتنظيف الكائنات المحجوزة، وتسجيل تفاصيل الخطأ في ملف سجل خارجي (Error Log) للتدقيق الفني، مع الحرص الإلزامي والمطلق على إعادة تشغيل كافة خصائص النظام التطبيقية إلى حالتها النشطة الطبيعية قبل إغلاق الإجراء، لضمان متانة واستمرارية واستقرار النظام البيئي للحوسبة المكتبية في شتى الظروف والسيناريوهات الطارئة.
خاتمة
يمثل الاستخدام المتقن للجملة الشرطية IF OR في بيئة Visual Basic for Applications (VBA) إحدى المهارات المفصلية التي ترتقي بالمطور من مجرد مسجل لماكرو بسيط إلى مهندس نظم قادر على صياغة حلول برمجية متينة ومحصنة تلبي متطلبات الأعمال الأكثر تعقيداً. فمن خلال الفهم العميق للمنطق البوليني الكلاسيكي والتحليل الرياضي لجداول الصواب والخطأ، يكتسب المبرمج القدرة على نمذجة القرارات المتشعبة بأسلوب يجمع بين المرونة الإجرائية والصرامة المنطقية، مما يقلص بصورة جوهرية من الاعتماد على الشفرات المتداخلة والمعقدة التي تعيق الصيانة وتزيد من احتمالية تسلل الثغرات الحسابية.
وقد أثبتت الدراسات التطبيقية والتحليلات الهندسية التي استعرضها هذا الدليل أن تسخير إمكانات المعامل OR لا ينفصل عن الإدراك الكامل لكيفية تفاعل بيئة التشغيل ومترجم اللغة مع الذاكرة وأنماط البيانات المتنوعة؛ حيث يلعب الترتيب الدقيق لأسبقية المعاملات، والاستخدام الصارم للأقواس، واختيار الخصائص البرمجية الملائمة لكائنات الخلايا، دوراً محورياً في تفادي الأخطاء المفاهيمية وانهيارات “عدم تطابق الأنواع”. علاوة على ذلك، فإن ابتكار حلول برمجية ذكية للتغلب على غياب “التقييم قصير الدائرة” في VBA يضمن الحفاظ على أعلى معدلات الأداء الحسابي وسرعة الاستجابة، لا سيما عند إدارة ومعالجة قواعد البيانات الضخمة في قطاعات المال والأعمال المعاصرة.
المراجع
- Alexander, M., & Kusleika, D. (2019). Excel 2019 Power Programming with VBA. John Wiley & Sons.
- Boole, G. (1854). An Investigation of the Laws of Thought on Which Are Founded the Mathematical Theories of Logic and Probabilities. Walton and Maberly.
- De Morgan, A. (1847). Formal Logic: Or, The Calculus of Inference, Necessary and Probable. Taylor and Walton.
- Mansfield, R. (2010). Mastering VBA for Microsoft Office 2010. Sybex.
- Martin, R. C. (2008). Clean Code: A Handbook of Agile Software Craftsmanship. Prentice Hall.
- Microsoft Corporation. (2023). VBA language reference for Office: Logical Operators and Precedence. Microsoft Learn. https://learn.microsoft.com/en-us/office/vba/language/reference/user-interface-help/operator-precedence
- Microsoft Corporation. (2023). Range Object (Excel) reference. Microsoft Learn. https://learn.microsoft.com/en-us/office/vba/api/excel.range(object)
- Walkenbach, J. (2015). Excel VBA Programming For Dummies (4th ed.). John Wiley & Sons.