أتمتة المكاتببرمجة إكسيل

VBA: صيغة بسيطة لـ “إذا كانت الخلية تحتوي على”

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

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

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

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

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

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

1. مقدمة تأصيلية لمفهوم الفحص النصي الشرطي في بيئة VBA

1.1 ماهية التحقق الشرطي من النصوص وأهميته في أتمتة جداول البيانات

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

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

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

1.2 المقارنة البنيوية بين دوال إكسيل المضمنة وأكواد VBA البرمجية

توفر بيئة إكسيل المدمجة ترسانة من الدوال الرياضية والنصية مثل SEARCH وFIND وISNUMBER وIF، والتي يمكن تركيبها بصورة تعشيقية لتحديد ما إذا كانت الخلية تحتوي على نص مستهدف. فعلى سبيل المثال، الصيغة التقليدية =IF(ISNUMBER(SEARCH("target", A1)), "Yes", "No") تؤدي الغرض بكفاءة داخل حدود الخلية الفردية. ومع ذلك، تواجه هذه الصيغ حدوداً وظيفية وبنيوية قاسية عندما يتعلق الأمر بإدارة نطاقات بيانات عملاقة أو بناء مسارات عمل تعتمد على شروط متفرعة وتعديلات هيكلية في المصنف كإنشاء مصنفات جديدة أو تصدير النتائج تلقائياً إلى قواعد بيانات خارجية.

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

تتجلى المرونة المعمارية لـ VBA أيضاً في قابلية التوسع وإعادة الاستخدام (Reusability)؛ إذ يمكن صياغة الماكرو البرمجي وتخزينه في مصنف الماكرو الشخصي (Personal Macro Workbook) ليكون متاحاً لجميع ملفات العمل دون الحاجة إلى إعادة كتابة الصيغ الحسابية أو نسخها بين الأوراق المختلفة، فضلاً عن إمكانية تعديل منطق الفحص أثناء وقت التشغيل (Runtime) بناءً على متغيرات يتم استردادها ديناميكياً من واجهات المستخدم أو ملفات الإعداد الخارجية.

1.3 الأسس المنطقية لصياغة قاعدة “إذا كانت الخلية تحتوي على نص محدد”

ترتكز صياغة قاعدة التحقق النصي على تفكيك المنطق الرياضي للبحث عن سلسلة نصية فرعية (Substring) ضمن سلسلة نصية أصلية (Superstring). في علم الحاسوب، تُعامل النصوص كمصفوفات متتابعة من المحارف (Arrays of Characters)، وتتطلب خوارزمية البحث فحص تطابق المحارف المستهدفة مع مقاطع السلسلة الأصلية بصورة تتابعية حتى يتم العثور على التطابق أو استنفاد طول السلسلة بالكامل.

تتم ترجمة هذا الفحص التتابعي إلى قيم منطقية تتبع الجبر البولياني (Boolean Logic). عندما تكتشف الخوارزمية وجود السلسلة الفرعية، فإنها ترجع إما القيمة True كدلالة على التحقق الإيجابي، أو ترجع رقماً يمثل الإحداثي الموضعي الذي تبدأ منه السلسلة الفرعية داخل النص الأصلي. في سياق صناعة القرار البرمجي، يتم ربط هذا الإخراج بكتل شرطية من نمط If...Then، حيث يتم توجيه مسار تنفيذ البرنامج بناءً على ما إذا كانت نتيجة الفحص تفي بالمعيار المحدد، كأن تكون القيمة المرجعة أكبر من الصفر.

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

2. التشريح المعماري لدالة InStr: المحرك الجوهري لمطابقة النصوص

2.1 المعلمات الرياضية لدالة InStr وتفسير القيمة المرجعة

تعد دالة InStr (اختصاراً لعبارة In-String) المحرك الأساسي والأكثر استخداماً في لغة VBA لإجراء عمليات التقصي النصي ومطابقة السلاسل. تم تصميم هذه الدالة لترجع رقماً صحيحاً من نوع Long يحدد الموضع الرقمي لبداية أول ظهور لسلسلة نصية داخل سلسلة أخرى. يتكون البناء التركيبي للدالة من أربع معلمات رئيسية تكتب على النحو التالي: InStr([Start], String1, String2, [Compare])، وتلعب كل معلمة دوراً محورياً في تحديد سلوك البحث وكفاءته.

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

إن تفسير القيمة المرجعة من الدالة يستند إلى قاعدة رياضية صارمة: إذا أعادت الدالة القيمة 0، فهذا يعني بصورة قطعية أن السلسلة النصية الفرعية غير موجودة إطلاقاً داخل السلسلة الأصلية، أو أن السلسلة الأصلية فارغة تماماً. أما إذا كانت القيمة المرجعة رقماً صحيحاً موجباً (مثل 1 أو 15)، فإن هذا الرقم يوثق الموضع الدقيق للحرف الأول من النص المستهدف داخل النص الأصلي. هذه الاستجابة الرقمية تمنح المبرمج مرونة مزدوجة؛ فهي تتيح التحقق من مجرد الوجود (هل القيمة أكبر من الصفر؟) وتتيح في الوقت ذاته استخراج النصوص المحيطة باستخدام دوال القطع النصي مثل Mid وLeft وRight بناءً على ذلك المؤشر الموضعي.

2.2 تحديد نمط المقارنة (Compare Mode) وتأثيره على الدقة

تحتوي دالة InStr على معلمة رابعة غاية في الأهمية هي معلمة نمط المقارنة Compare، والتي تحدد كيفية معالجة الفروق الهيكلية بين الرموز والمحارف، لا سيما في اللغات اللاتينية التي تفرق بين الأحرف الكبيرة (Uppercase) والأحرف الصغيرة (Lowercase). إذا لم يتم تحديد هذه المعلمة صراحة، فإن VBA يعتمد النمط الافتراضي للمشروع، وهو في الغالب النمط الثنائي vbBinaryCompare (وقيمته العددية 0).

في نمط المقارنة الثنائية vbBinaryCompare، تتم المقارنة بالاعتماد المباشر على التشفير الثنائي للرموز في جدول ASCII أو نظام التشفير الموحد Unicode؛ وبناءً على ذلك، فإن الحرف “A” الكبير (ذو القيمة العشرية 65) لا يتطابق إطلاقاً مع الحرف “a” الصغير (ذو القيمة العشرية 97). ورغم أن هذا النمط يقدم أداءً فائق السرعة نظراً لعدم حاجة المعالج إلى تفسير دلالات الحروف، فإنه قد يؤدي إلى إخفاق البحث عند محاولة العثور على كلمات أدخلها المستخدمون بحالات أحرف متباينة.

على الجانب الآخر، يوفر النمط النصي vbTextCompare (وقيمته العددية 1) مقارنة لغوية تتجاهل الفروق بين الأحرف الكبيرة والصغيرة؛ حيث يرى هذا النمط أن الحرف “A” يطابق تماماً الحرف “a”. كما تتيح البيئة نمطاً متخصصاً هو vbDatabaseCompare (وقيمته 2)، والذي يُستخدم أساساً في تطبيقات مايكروسوفت أكسس لإجراء المقارنات وفق قواعد الترتيب المحددة في قاعدة البيانات نفسها. إن الاختيار الواعي لنمط المقارنة هو الذي يحدد التوازن الدقيق بين سرعة التنفيذ الحسابي ودقة النتائج المتوقعة من عملية الفحص.

2.3 العلاقة الشرطية بين مخرجات InStr وعامل عدم المساواة (<> 0)

لبناء الصيغة القياسية “إذا كانت الخلية تحتوي على نص محدد”، يعمد المبرمجون إلى دمج استدعاء دالة InStr مع عامل عدم المساواة المنطقي <> 0. فبما أن الدالة ترجع صفراً في حالة الفشل المطلق في العثور على النص، فإن التعبير الرياضي InStr(TargetString, SearchTerm) > 0 أو InStr(TargetString, SearchTerm) <> 0 يتم تقييمه فوراً كقيمة منطقية Boolean ترجع إما True في حالة وجود النص في أي موضع، أو False في حالة غيابه التام.

تكمن قوة هذا الأسلوب البنائي في بساطته وملاءمته المباشرة للكتل الشرطية، حيث يمكن صياغة الشرط البرمجي على النحو التالي:

If InStr(Cell.Value, "SearchTerm") > 0 Then

يتيح هذا التعبير تقييماً بالغ الكفاءة لا يستهلك سوى دورات معالجة ضئيلة للغاية مقارنة بالدوال الحسابية المركبة، مما يجعله مثالياً للحلقات التكرارية التي تتعامل مع نطاقات عريضة.

ومع ذلك، ينبغي للمطورين الانتباه للحالات الحدية (Edge Cases)؛ فإذا كانت قيمة السلسلة المستهدفة SearchTerm عبارة عن نص فارغ ""، فإن دالة InStr ترجع القيمة المحددة في وسيط Start (أي 1 افتراضياً)، مما يجعل الشرط يتحقق إيجابياً بصورة وهمية! ولذلك، تتطلب صياغة الأكواد الاحترافية التحقق المسبق من أن كلمة البحث تحتوي بالفعل على محارف صالحة قبل إدراجها في تعبير المقارنة، لضمان متانة الشفرة البرمجية ضد الأخطاء غير المقصودة.

3. معالجة حساسية حالة الأحرف والتطبيع النصي باستخدام دالة LCase

3.1 إشكالية التباين بين الأحرف الكبيرة والصغيرة في المعالجة الآلية

تمثل مشكلة التباين بين الأحرف الكبيرة والصغيرة (Case Sensitivity) أحد التحديات الكلاسيكية في معالجة اللغات الطبيعية والنصوص البرمجية. ففي كثير من بيئات العمل التي تعتمد على إدخال البيانات يدوياً، قد يكتب أحد الموظفين مصطلحاً معيناً مثل “Turtle”، بينما يدخله آخر بصيغة “TURTLE”، ويكتبه ثالث بصيغة “turtle”، أو حتى بصيغ هجينة مثل “tUrtLe”. في حال تطبيق خوارزمية بحث ثنائية دون مراعاة هذا التنوع، ستفشل معظم عمليات المطابقة، مما يترتب عليه تقارير غير دقيقة وتصنيفات ناقصة تؤثر سلباً على قرارات الأعمال.

يعود السبب الجوهري لهذا التباين إلى الطريقة التي تمثل بها الحواسيب الرموز الرقمية؛ فكل رمز يمتلك شفرة بايت محددة ومستقلة تماماً. إن محاولة مطابقة بايت الحرف الكبير مع بايت الحرف الصغير دون وسيط تحويلي ستنتهي دائماً بنتيجة عدم التطابق (Mismatch). ومن هنا تبرز حتمية ما يُعرف بـ “التطبيع النصي” (Text Normalization)، وهي مرحلة تمهيدية تهدف إلى إخضاع النصوص المدخلة لمعيار شكلي موحد قبل الشروع في مطابقتها خوارزمياً.

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

3.2 آلية عمل دالة LCase في توحيد السلاسل النصية

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

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

لتحقيق أعلى درجات الأمان في الفحص النصي، يُنصح بتطبيق ما يُعرف بـ “التطبيع المزدوج” (Double Normalization)؛ حيث يتم تمرير محتوى الخلية عبر دالة LCase، وفي الوقت ذاته، يتم تمرير كلمة البحث المستهدفة عبر دالة LCase أيضاً، كما في الصيغة الرياضية التالية:

InStr(LCase(Cell.Value), LCase(SearchTerm)) > 0

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

3.3 المفاضلة الهندسية بين دمج LCase واستخدام وسيط vbTextCompare

يواجه مطورو VBA مفترق طرق هندسي عند الرغبة في تجاهل حالة الأحرف: فهل الأفضل استخدام دمج دالة LCase مع نمط البحث الافتراضي، أم استخدام وسيط المقارنة النصية المباشر vbTextCompare داخل دالة InStr؟ للإجابة عن هذا التساؤل، يتعين فحص المعايير المتعلقة بالأداء، وقابلية القراءة (Readability)، وسلوك استدعاء المعلمات.

من حيث الأداء المجرد، يتفوق خيار استخدام vbTextCompare بشكل طفيف في بعض البيئات ذات البيانات الضخمة لأنه يتجنب إنشاء كائنات نصية مؤقتة في الذاكرة لتخزين نتائج تحويل LCase. ومع ذلك، يفرض استخدام vbTextCompare إلزامية تمرير المعلمة الأولى Start (موضع البداية) في دالة InStr؛ حيث لا يسمح بناء لغة VBA بتحديد معلمة المقارنة الرابعة إلا إذا تم تحديد المعلمة الأولى صراحة، لتصبح الصيغة: InStr(1, Cell.Value, SearchTerm, vbTextCompare).

في المقابل، يفضل العديد من المبرمجين نمط InStr(LCase(Cell.Value), "term") لسهولة قراءته ووضوحه البصري الفوري، فضلاً عن تجنب تحديد معلمات البداية التي قد يراها البعض عبئاً شكلياً لا داعي له. إن المعيار الحاسم هنا يعود لسياسة توثيق الأكواد المتبعة في المؤسسة؛ حيث يميل مهندسو الأنظمة الحساسة للسرعة إلى vbTextCompare المصممة معمارياً لهذا الغرض، في حين يُفضل مبرمجو الأدوات السريعة استخدام LCase لاختصار التعليمات والتركيز على المنطق الوظيفي المباشر.

4. الهيكل البرمجي القياسي للماكرو الأساسي: تفكيك الشيفرة خطوة بخطوة

4.1 إعلان المتغيرات وضبط نطاقات الذاكرة (Variable Declarations)

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

عند إعلان المتغيرات باستخدام الكلمة المفتاحية Dim، ينبغي اختيار الأنواع البيانية ذات الكفاءة العالية؛ فبالنسبة لمتغيرات الفهرسة وحساب الصفوف، يجب دائماً استخدام النوع Long بدلاً من Integer؛ إذ إن إكسيل الحديث يدعم أكثر من مليون صف (1,048,576 صفاً)، في حين أن النوع Integer في VBA يتوقف عند القيمة 32,767، ومحاولة تخطيها ستؤدي حتماً إلى خطأ فيضان السعة الحسابية الشهير (Overflow Error – Run-time error 6). كما يتم تعريف متغيرات النصوص باستخدام النوع String لضمان حجز المساحة التخزينية الملائمة لسلاسل المحارف.

يتضمن الإعلان النموذجي للماكرو تعريف متغير يمثل مؤشر الصف Dim i As Long، ومتغير يمثل النص المستهدف للبحث Dim my_text As String، ومتغير يمثل نص النتيجة المراد إسنادها Dim my_res As String، بالإضافة إلى متغيرات الكائنات مثل ورقة العمل Dim ws As Worksheet إذا كان الكود يتعامل مع أوراق محددة، مما يتيح للإدارة الداخلية للذاكرة تحسين استهلاك الموارد البرمجية وتسهيل عمليات التتبع والتصحيح.

4.2 بناء حلقة التكرار المتسلسلة For…Next ومسح النطاقات

تمثل حلقة التكرار المتسلسلة For...Next العمود الفقري لعملية مسح النطاقات المجدولة في أوراق العمل؛ حيث تتيح الانتقال الحسابي المنتظم بين الصفوف المستهدفة بنمط خطي يبدأ من الصف الأولي وينتهي بالصف الأخير المحدد. على سبيل المثال، التعبير البرمجي For i = 2 To 8 ينشئ مساراً تكرارياً يغطي سبعة صفوف متتالية، متجاهلاً الصف الأول الذي يمثل عادة ترويسة الجدول (Header Row).

داخل جسم الحلقة، يتم استهداف الخلايا بصورة ديناميكية باستخدام خاصية Range مقرونة بعامل الربط النصي & لتركيب اسم الخلية؛ كأن نكتب Range("A" & i).Value للوصول إلى محتوى الخلية في العمود A والصف الحالي i، أو باستخدام خاصية Cells(i, 1).Value التي تعد هندسياً أكثر كفاءة وسرعة في المعالجة التكرارية لكونها تعتمد على الأرقام المفهرسة للصفوف والأعمدة بدلاً من تركيب السلاسل النصية لأسماء النطاقات.

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

4.3 صياغة الكتلة الشرطية If…Then…Else وإسناد النتائج النهائية

تشكل الكتلة الشرطية If...Then...Else وحدة المعالجة المركزية لاتخاذ القرار داخل الماكرو البرمجي. في هذه المرحلة، يتم دمج الأدوات السابقة لتقييم الشرط المركب؛ حيث تقوم دالة InStr بالبحث عن النص المستهدف المنقى عبر LCase داخل محتوى الخلية المنقى بدوره، وبناءً على القيمة المنطقية الناتجة عن المقارنة مع الصفر، يتم توجيه مسار الكود إلى الفرع المناسب.

في حال تحقق الشرط وثبوت احتواء الخلية على النص المستهدف، يتم إسناد النص الإيجابي (مثل “Contains Turtle”) إلى المتغير الوسيط my_res. أما إذا أرجع الفحص القيمة صفر التي تدل على غياب المصطلح، يتولى الفرع Else التعامل مع الموقف عبر إسناد النص السلبي المناظر (مثل “Does Not Contain Turtle”) إلى المتغير نفسه. يمنع استخدام المتغير الوسيط تكرار عمليات الكتابة المباشرة إلى ورقة العمل، وهو نمط برمجي يحافظ على تماسك منطق البرنامج ويسهل صيانته.

تُختتم كل دورة تكرارية داخل الكتلة الشرطية بكتابة القيمة النهائية لـ my_res في الخلية المقابلة ضمن العمود المجاور، كأن يتم توجيهها إلى Range("B" & i).Value = my_res. يُغلق هذا التركيب باستخدام التعليمة End If المتبوعة بـ Next i لإطلاق الدورة التالية، مما يضمن تدفقاً برمجياً خالياً من التداخل أو التسريب المنطقي للبيانات بين الصفوف المختلفة، مع الحفاظ التام على سلامة السجلات المعالجة مسبقاً.

5. التطبيق العملي التوضيحي: نموذج البحث عن كلمة “turtle” في نطاق محدد

5.1 إعداد بيئة الاختبار التجريبية وإدخال البيانات المعيارية

لتطبيق المفاهيم النظرية في بيئة واقعية تحاكي تحديات الأعمال، نقوم بإنشاء ورقة عمل تجريبية ونخصص النطاق A2:A8 لإدخال مصفوفة من النصوص المصممة عمداً لاختبار كافة الحالات الممكنة لعملية التحقق النصي. يجب أن تشمل هذه المصفوفة حالات التطابق الصريح، والتطابق المشوه، والحالات الحدية التي قد تفشل معها الأكواد الهشة المكتوبة دون مراعاة لمعايير الجودة البرمجية.

نقوم بتوزيع البيانات في العمود A على النحو التالي:

  • الخلية A2: نضع النص "green sea turtle" (تطابق جزئي ضمن عبارة بحروف صغيرة).
  • الخلية A3: نضع النص "Snapping Turtle" (تطابق مع حرف كبير في البداية).
  • الخلية A4: نضع النص "TURTLE LOGISTICS" (تطابق كامل بحروف كبيرة مدمجة في اسم مؤسسي).
  • الخلية A5: نضع النص "marine biology" (حالة سلبية: نص لا يمت بصلة لكلمة البحث).
  • الخلية A6: نضع النص "tortoise and sea" (حالة سلبية قريبة: كلمة تشبه المعنى لكن تختلف نصياً).
  • الخلية A7: نتركها فارغة تماماً "" (لاختبار كيفية تعامل الكود مع الخلايا ذات الطول الصفري).
  • الخلية A8: نضع النص "box-turtle-habitat" (تطابق جزئي محاط برموز وصل خاصة).

تتم تهيئة العمود المجاور B، بدءاً من الخلية B2 وحتى B8، ليكون الحقل المخصص لاستقبال المخرجات التوصيفية الصادرة عن الماكرو البرمجي، وتُترك خلاياه فارغة تماماً قبل بدء الاختبار للتأكد من أن الكود هو المصدر الوحيد للقيم التي ستظهر فيه لاحقاً.

5.2 تتبع التنفيذ السطري (Step-by-Step Execution) وتحليل حركة المؤشر

تبدأ عملية التحقق الهندسي من صحة الكود بفتح محرر Visual Basic عبر الضغط على المفتاحين Alt + F11، ثم إدراج وحدة برمجية قياسية ولصق الماكرو المصمم لهذا الغرض. بدلاً من تشغيل الماكرو بضغطة واحدة باستخدام مفتاح F5، يلجأ المطور المحترف إلى تقنية التتبع السطري باستخدام مفتاح التصحيح F8 (Step Into)، والتي تتيح فحص سلوك المعالج عند كل سطر برمجي ومراقبة قيم المتغيرات عبر نافذة المراقبة الفورية (Locals Window).

عند وصول المؤشر الأصفر إلى السطر الخاص بالصف الثاني i = 2، يتم استدعاء قيمة الخلية A2 وهي “green sea turtle”. تمر هذه القيمة عبر دالة LCase، وتبقى كما هي لأنها مكتوبة بحروف صغيرة أصلاً. تقوم دالة InStr بالبحث عن “turtle” فتجده يبدأ عند الحرف العاشر؛ وبما أن القيمة 10 أكبر من الصفر، ينتقل المؤشر مباشرة إلى السطر التالي للشرط ويقوم بإسناد “Contains Turtle” للمتغير my_res، ثم كتابتها فوراً في الخلية B2.

تتضح القوة الحقيقية للكود عند الانتقال إلى الصفوف التالية؛ ففي الصف A3، تقوم دالة LCase بتحويل “Snapping Turtle” إلى “snapping turtle” داخل الذاكرة، مما يتيح لـ InStr العثور على التطابق بنجاح رغم وجود الحرف الكبير. وفي الصف A4، يتم تطبيع النص الكبير بالكامل ليطابق مصطلح البحث دون أي خلل. وعند الوصول إلى الصف A5، ترجع دالة InStr القيمة 0، فيقفز المؤشر متجاوزاً عبارة الإسناد الأولى ليتجه مباشرة إلى كتلة Else، معلناً إسناد “Does Not Contain Turtle” إلى الخلية B5 بدقة بالغة.

5.3 تقييم المخرجات البرمجية ومطابقتها للمعايير المتوقعة

بانتهاء دورة الماكرو ووصول التنفيذ إلى السطر الأخير End Sub، نعود إلى واجهة ورقة العمل لمعاينة النتائج وتقييم مدى مطابقتها للتوقعات المنطقية المحددة سلفاً. يُظهر الجدول المعالج في العمود B مخرجات متسقة تعكس التطبيق الدقيق للمنطق البرمجي المشترك بين دالتي InStr وLCase.

تُظهر الخلايا B2 وB3 وB4 وB8 العبارة الإيجابية الصريحة “Contains Turtle”، مما يثبت نجاح الكود في تجاوز عقبة الأحرف الكبيرة في الخلية B3، والنصوص المؤسسية الصاخبة في الخلية B4، وحتى الرموز والشرطات الفاصلة في الخلية B8 دون أي عائق. يثبت هذا السلوك أن دالة InStr تبحث عن السلسلة الفرعية كمجرد مصفوفة محارف متتابعة، بغض النظر عما يسبقها أو يعقبها من نصوص أو رموز داخل الخلية نفسها.

في المقابل، استقبلت الخلايا B5 وB6 وB7 العبارة السلبية “Does Not Contain Turtle”. يؤكد نجاح الخلية B6 متانة الفحص النصي وعدم خلطه بين الكلمات ذات الصلة الدلالية ولكن المختلفة لغوياً (“tortoise” لا تطابق “turtle”). كما يؤكد نجاح الخلية B7 الفارغة قدرة الكود على معالجة السلاسل النصية ذات الأطوال الصفرية بأمان دون التسبب في انهيار البرنامج أو إصدار رسائل خطأ للمستخدم، وهو المعيار الحاسم لسلامة الأتمتة المؤسسية.

6. توسيع النطاق الخوارزمي: التعامل مع الكلمات المتعددة والشروط المركبة

6.1 تطبيق المعاملات المنطقية (And / Or) لربط عبارات الفحص

في كثير من السيناريوهات المتقدمة، لا يقتصر التحقق النصي على البحث عن مصطلح منفرد، بل يتطلب تقييم وجود عدة كلمات بناءً على علاقات منطقية معقدة. تتيح لغة VBA استخدام المعاملات البوليانية مثل And وOr لربط استدعاءات متعددة لدالة InStr داخل تعبير شرطي واحد، مما يمنح المبرمج القدرة على صياغة فلاتر دقيقة تخدم احتياجات التحليل المتقدم.

عند الرغبة في التحقق من أن الخلية تحتوي على كلمتين معاً، بصرف النظر عن ترتيب ورودهما في الجملة، يتم استخدام المعامل And على النحو التالي:

If InStr(LCase(Cell.Value), "sea") > 0 And InStr(LCase(Cell.Value), "turtle") > 0 Then

في هذه الحالة، لن يتحقق الشرط إلا إذا أرجعت كلتا الدالتين قيمة موجبة تفوق الصفر، مما يضمن مطابقة الخلايا التي تجمع بين المصطلحين فقط (مثل “green sea turtle”) واستبعاد الخلايا التي تحتوي على أحدهما دون الآخر.

على النقيض من ذلك، يُستخدم المعامل Or لصياغة شروط بديلة تكفي فيها مطابقة كلمة واحدة لاعتبار الفحص ناجحاً؛ كأن نبحث عما إذا كانت الخلية تحتوي على “turtle” أو “tortoise”. ومن الأهمية بمكان استخدام الأقواس الرياضية بدقة عند بناء تعابير شرطية هجينة تجمع بين And وOr، لتفادي أخطاء أسبقية العمليات المنطقية (Logical Operator Precedence) التي قد تؤدي إلى نتائج مغلوطة إذا فسر المترجم البرمجي الشروط بترتيب يخالف نية المطور.

6.2 الفحص النصي المستند إلى مصفوفة كلمات بحث متعددة (Array-Based Search)

عندما تتسع قائمة المصطلحات المستهدفة لتشمل عشرات الكلمات، يصبح تكرار المعاملات المنطقية Or في شفرة البرنامج ممارسة سيئة تتنافى مع معايير كتابة الشفرات النظيفة وتجعل الكود عصياً على القراءة والتعديل. يكمن الحل الهندسي الأمثل في هذه الحالة في استخدام “مصفوفات الكلمات” (Word Arrays) بالتكامل مع حلقة تكرار داخلية تفحص عناصر المصفوفة تباعاً.

يتم تعريف مصفوفة نصوص وتعبئتها بالمصطلحات المطلوبة باستخدام الدالة المدمجة Array، كالتالي:

keywords = Array("turtle", "tortoise", "terrapin", "reptile")

بعد ذلك، يتم تدوير حلقة تكرار داخلية من نوع For k = LBound(keywords) To UBound(keywords) لفحص كل كلمة من كلمات المصفوفة داخل محتوى الخلية الواحدة.

ولتحقيق أقصى كفاءة حسابية ممكنة، يجب تضمين تعليمة الإنهاء المبكر Exit For داخل الحلقة؛ فبمجرد أن تعثر دالة InStr على أول تطابق لأي مصطلح من مصطلحات المصفوفة داخل الخلية، يتم تسجيل النتيجة الإيجابية وتعيين علامة نجاح (Boolean Flag)، ثم كسر الحلقة الداخلية فوراً والانتقال إلى الخلية التالية. يمنع هذا النهج إهدار وقت المعالج في فحص بقية الكلمات لمجرد التحقق من وجود كلمة واحدة، مما يقلص زمن المعالجة الإجمالي بمعدلات ملحوظة عند التعامل مع مجموعات البيانات الكبرى.

6.3 استراتيجيات الفحص العكسي والاستبعاد (Negative Filtering)

تكتسب استراتيجيات الفحص العكسي أهمية بالغة في تنقية البيانات، حيث يكون الهدف الأساسي هو تحديد السجلات التي “لا تحتوي” على نصوص محددة، أو عزل السجلات التي تشتمل على لواحق استثنائية أو وسوم تدل على معاملات تالفة أو ملغاة. يتم تفعيل هذا المنطق في VBA عبر استخدام معامل النفي البولياني Not أو عبر المطابقة المباشرة مع القيمة الصفرية = 0.

يتيح التعبير البرمجي If InStr(LCase(Cell.Value), "canceled") = 0 Then تصفية مسار العمل ليقتصر فقط على المعاملات السارية والمقبولة، متجاهلاً أي سجل يحتوي على وسم الإلغاء. كما يمكن دمج الاستبعاد مع الاحتواء في معادلة مركبة بالغة الدقة؛ كأن يتم البحث عن الخلايا التي تحتوي على مصطلح “turtle” بشرط ألا تحتوي على كلمة “dead” أو “fossil”، لفرز الكائنات الحية فقط في الأبحاث البيئية الميدانية:

If InStr(LCase(Cell.Value), "turtle") > 0 And InStr(LCase(Cell.Value), "fossil") = 0 Then

تتطلب هذه الاستراتيجيات العكسية عناية فائقة في معالجة السجلات الفارغة؛ فالخلية الفارغة بطبيعتها لا تحتوي على الكلمة المستبعدة، مما يجعل الفحص العكسي يقيّمها على أنها صالحة إذا لم يتم وضع شرط استباقي يتأكد من أن الخلية ليست فارغة أصلاً (Not IsEmpty(Cell.Value)). إن مراعاة هذه التدقيقات المتقاطعة ترفع من مناعة الكود وتضمن عدم تسرب أي بيانات مشوهة إلى التحليلات النهائية للمشروع.

7. تحويل الشيفرة البرمجية إلى دالة مخصصة (UDF) قابلة للاستدعاء من ورقة العمل

7.1 الفروق الجوهرية بين الإجراء الفرعي (Sub) والدالة المعرفة من المستخدم (Function)

في بنية VBA، ينقسم الكود التنفيذي إلى نوعين أساسيين: الإجراءات الفرعية Subroutines والدوال المعرفة من قبل المستخدم User-Defined Functions (UDFs). يتميز الإجراء الفرعي بقدرته على إحداث تغييرات شاملة في بيئة العمل، مثل إنشاء أوراق عمل جديدة، وتنسيق الألوان، ومسح النطاقات، وإدراج القيم قسراً في أي خلية يحددها المبرمج، إلا أنه لا يمكن استدعاؤه كصيغة رياضية مباشرة داخل خلايا إكسيل عبر علامة المساواة (=).

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

يكمن الوجه الأبرز لفائدة تحويل كود فحص النصوص إلى دالة مخصصة في تبسيط واجهة الاستخدام لمحللي البيانات العاديين الذين لا يمتلكون خلفية برمجية في التعامل مع وحدات الماكرو؛ إذ يصبح بإمكانهم ببساطة كتابة صيغة مألوفة مثل =CellContainsText(A2, "turtle") والاستفادة من القوة الخوارزمية لـ VBA دون مغادرة الواجهة الرسومية المعتادة لبرنامج إكسيل.

7.2 كتابة وتصميم الدالة المخصصة CellContainsText

يتطلب التصميم المعماري للدالة المخصصة CellContainsText تحديد وسائط الدخل ونوع القيمة المرجعة بدقة فائقة لضمان تكاملها السلس مع محرك حسابات إكسيل. يتم الإعلان عن الدالة بحيث تقبل وسيطين إجباريين: الأول يمثل النطاق المستهدف TargetCell As Range، والثاني يمثل السلسلة النصية المراد البحث عنها SearchText As String، مع ضبط نوع الخرج ليكون من النوع المنطقي Boolean الذي يعيد إما True أو False.

تُصاغ الدالة داخل وحدة برمجية قياسية وفق التركيب التالي:

Function CellContainsText(ByVal TargetCell As Range, ByVal SearchText As String) As Boolean
    If TargetCell.Cells.CountLarge > 1 Then Exit Function
    If Len(SearchText) = 0 Then Exit Function
    
    If InStr(1, TargetCell.Value, SearchText, vbTextCompare) > 0 Then
        CellContainsText = True
    Else
        CellContainsText = False
    End If
End Function

يوفر استخدام ByVal حماية للمعلمات من أي تعديل عرضي غير مقصود لقيمها الأصلية أثناء المعالجة، بينما يحمي الفحص الاستباقي TargetCell.Cells.CountLarge > 1 الدالة من الانهيار في حال قام المستخدم بتمرير نطاق متعدد الخلايا بدلاً من خلية فردية. كما يتم تصنيف هذه الدالة داخل نافذة معالج الدوال (Insert Function Dialog) تحت فئة النصوص (Text Category) عبر استدعاء تعليمة Application.MacroOptions، مما يضفي عليها طابعاً احترافياً يماثل دوال مايكروسوفت الأصلية.

7.3 إدراج وسائط اختيارية (Optional Arguments) لتخصيص سلوك البحث

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

يمكن تعديل توقيع الدالة ليصبح على النحو التالي:

Function CellContainsText(ByVal TargetCell As Range, _
                          ByVal SearchText As String, _
                          Optional ByVal MatchCase As Boolean = False) As Boolean
    Dim compMode As VbCompareMethod
    If MatchCase Then
        compMode = vbBinaryCompare
    Else
        compMode = vbTextCompare
    End If
    
    If Len(TargetCell.Value) > 0 And Len(SearchText) > 0 Then
        CellContainsText = (InStr(1, TargetCell.Value, SearchText, compMode) > 0)
    End If
End Function

في هذا البناء الأنيق، إذا استدعى المستخدم الدالة بصيغتها المختصرة =CellContainsText(A2, "turtle")، تتولى القيمة الافتراضية MatchCase = False ضبط نمط البحث ليتجاهل الفروق بين الأحرف الكبيرة والصغيرة تلقائياً عبر vbTextCompare. أما إذا رغب المستخدم في إجراء تدقيق ثنائي صارم يفرق بين الأحرف، فما عليه سوى تمرير القيمة TRUE كمعلمة ثالثة: =CellContainsText(A2, "Turtle", TRUE)، وهو ما يعكس قمة المرونة في التصميم البرمجي الحديث.

8. هندسة الأداء وتحسين سرعة المعالجة للنطاقات الكبيرة ومجموعات البيانات الضخمة

8.1 تعطيل محركات الرسوميات والتحديث الحسابي في إكسيل

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

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

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False

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

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

8.2 التحول من التعامل المباشر مع الخلايا إلى المعالجة عبر مصفوفات الذاكرة

تعتبر قراءة الخلايا الفردية وكتابتها عبر حلقة تكرارية مباشرة (Cell-by-Cell Processing) من أسوأ الممارسات البرمجية في معالجة البيانات الضخمة؛ إذ تتطلب كل دورة تكرارية عبور جسر الربط البيني (COM Interface Boundary) بين محرك VBA ومحرك إكسيل الأساسي، وهي عملية باهظة التكلفة الزمنية بملايين المرات مقارنة بالقراءة والتدوير المباشر داخل الذاكرة العشوائية السريعة (RAM).

يكمن التحول المعماري النوعي في استراتيجية “تفريغ النطاق بالكامل في مصفوفة ذاكرة ثنائية الأبعاد” (In-Memory Array Processing). في هذا النموذج المتقدم، يتم استدعاء بيانات النطاق الضخم بالكامل دفعة واحدة إلى متغير من النوع العام Variant بسطر واحد: dataArray = Range("A2:A100000").Value. في هذه اللحظة، تتشكل في الذاكرة مصفوفة برمجية نقية تحاكي أبعاد الجدول بدقة متناهية ودون أي عبء إضافي على واجهة إكسيل الرسومية.

تتم بعد ذلك معالجة عناصر المصفوفة النصية باستخدام دوال InStr وLCase داخل حلقة تكرارية برمجية خالصة، وتُحفظ النتائج المنبثقة في مصفوفة نتائج موازية بنفس الأبعاد. وبمجرد اكتمال فحص كافة السجلات، يتم ضخ مصفوفة النتائج بالكامل إلى العمود المستهدف في ورقة العمل في عملية كتابة موحدة بسطر واحد: Range("B2:B100000").Value = resultArray. يؤدي هذا التحول الهندسي الجذري إلى تقليص زمن المعالجة من عدة دقائق أو ساعات إلى أجزاء طفيفة من الثانية، محققاً أعلى معدلات الكفاءة الممكنة في معالجة البيانات الضخمة.

8.3 القياس الزمني والمقارنة المعيارية (Benchmarking) لمعدلات استهلاك الموارد

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

يتم قياس الأداء عبر تسجيل توقيت البدء startTime = Timer فوراً قبل انطلاق خوارزمية الفحص، وتسجيل توقيت الانتهاء endTime = Timer عقب ختامها مباشرة، ومن ثم حساب الفارق الزمني وطباعته في نافذة المتابعة الفورية (Immediate Window) باستخدام السطر البرمجي التالي:

Debug.Print "Elapsed Time: " & Format(endTime - startTime, "0.000") & " seconds"

تُظهر الاختبارات التجريبية القياسية عند معالجة نطاق يحتوي على 100,000 صف تفاوتاً شاسعاً: فالنهج التقليدي القائم على التكرار عبر الخلايا الفردية For Each Cell In Range يستغرق عادة زمناً يتراوح بين 45 إلى 90 ثانية اعتماداً على قدرات الجهاز وعدد الدوال النشطة. في المقابل، فإن النهج المتقدم المعتمد على مصفوفات الذاكرة ينجز فحص وكتابة نفس السجلات المائة ألف في زمن قياسي لا يتجاوز 0.3 إلى 0.6 ثانية! توفر هذه المقارنة المعيارية الدليل القاطع على ضرورة تبني مصفوفات الذاكرة كمعيار هندسي افتراضي في كافة مشاريع الأتمتة ذات النطاقات الكبرى.

9. التقنيات المتقدمة: استخدام التعابير النمطية (Regular Expressions) للمطابقة المعقدة

9.1 دواعي الانتقال من دالة InStr إلى كائنات RegExp

على الرغم من البساطة والسرعة الفائقة لدالة InStr، إلا أنها تظل مقيدة بحدود مطابقة المحارف الحرفية؛ فهي تعجز تماماً عن التعرف على “الأنماط الشكلية” للبيانات (Patterns)، وتفتقر إلى القدرة على التمييز التلقائي لحدود الكلمات المنفصلة (Word Boundaries). فعلى سبيل المثال، إذا كنا نبحث عن الكلمة الإنجليزية المستقلة “cat”، فإن دالة InStr ستعطي نتيجة إيجابية خاطئة مع كلمات مثل “caterpillar” أو “scatter” أو “certificate”، لكونها تحتوي جميعاً على تسلسل المحارف الثلاثة نفسه!

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

كما تتيح التعابير النمطية فحص النصوص واستخراج المقاطع المطابقة وتعديلها في خطوة خوارزمية واحدة باستخدام طرق مثل Execute وReplace، متفوقة بمراحل على تركيبات InStr وMid التعشيقية المرهقة، وهو ما يجعلها الأداة المفضلة في مهام التنقيب في النصوص (Text Mining) واستخراج البيانات غير المهيكلة (Unstructured Data Parsing).

9.2 ربط وتهيئة كائن VBScript.RegExp في كود VBA

لاستخدام محرك التعابير النمطية داخل بيئة VBA، يتاح للمطور مساران معماريان: “الربط المبكر” (Early Binding) عبر إضافة مرجع مكتبة Microsoft VBScript Regular Expressions 5.5 من قائمة المراجع (References) في المحرر، أو “الربط المتأخر” (Late Binding) باستخدام دالة الإنشاء الديناميكي CreateObject. يُعد الربط المتأخر الخيار الأكثر شيوعاً وأماناً في بيئات النشر المؤسسية؛ لكونه يمنع حدوث أخطاء فقدان المراجع (Missing Reference Errors) عند تشغيل الملف على حواسيب مختلفة بمستويات تحديث متفاوتة.

تتم تهيئة كائن التعبير النمطي عبر الكود القياسي التالي:

Dim regEx As Object
Set regEx = CreateObject("VBScript.RegExp")

With regEx
    .Pattern = "bcatb"
    .IgnoreCase = True
    .Global = False
End With

تتحكم الخصائص الثلاث السابقة في سلوك محرك البحث؛ حيث تحدد الخاصية Pattern النمط التعبيري المراد فحصه، بينما تضمن الخاصية IgnoreCase = True تجاهل التباين بين الأحرف الكبيرة والصغيرة دون الحاجة لاستدعاء دوال تحويل إضافية. أما الخاصية Global، فتحدد ما إذا كان المطلوب العثور على أول تطابق فقط (عند ضبطها على False) أم الاستمرار في مسح النص بالكامل للعثور على كافة التطابقات. ولإجراء الفحص الشرطي السريع، يتم استدعاء الطريقة regEx.Test(Cell.Value)، والتي ترجع مباشرة قيمة منطقية Boolean (إما True أو False) بسرعة فائقة ودون استهلاك ذاكرة إضافية لتسجيل مواضع التطابق.

9.3 بناء أنماط بحث دقيقة للتحقق من الكلمات المستقلة

يكمن السر في قوة التعابير النمطية في استخدام المحددات الهيكلية للمحارف (Metacharacters)، وعلى رأسها محدد حدود الكلمات b (Word Boundary). يمثل هذا الرمز موضع الانتقال بين محرف أبجدي-رقمي ومحرف غير أبجدي (كالمسافات وعلامات الترقيم ونهايات الأسطر)، مما يتيح عزل الكلمة المستهدفة ومنع التطابقات الجزئية العرضية داخل الكلمات الأطول.

إذا قمنا بضبط النمط على .Pattern = "bturtleb"، فإن هذا النمط سيطابق كلمة “turtle” المنفصلة في جملة “A green turtle swims”، وسيطابقها كذلك إذا كانت محاطة بعلامات ترقيم مثل “(turtle)” أو “turtle,” أو في بداية السطر أو نهايته. في الوقت ذاته، سيرفض النمط بشكل قاطع مطابقة كلمات مشتقة مثل “turtles” (بصيغة الجمع) أو “turtleback”، وهو أمر يستحيل تحقيقه باستخدام دالة InStr المنفردة إلا عبر بناء كتل شرطية معقدة تفحص الحرف السابق واللاحق لكل تطابق محتمل.

علاوة على ذلك، توفر التعابير النمطية آليات الهروب (Escaping) باستخدام الشرطة المائلة العكسية للبحث عن الرموز الخاصة المحجوزة في لغات البرمجة؛ فإذا كان النص المستهدف يحتوي على أقواس أو علامات دولار أو نقاط، مثل البحث عن كود منتج بصيغة “(ID-99)”، يتم صياغة النمط كالتالي: .Pattern = "(ID-99)"، مما يضمن معالجة الرموز كمحارف نصية بحتة دون التسبب في أخطاء ترجمة قواعدية داخل محرك التعبير النمطي، ويوفر دقة متناهية لا تضاهى في فحص المدخلات المشوهة.

10. إدارة الأخطاء والاستثناءات والبيانات غير المتجانسة

10.1 معالجة الخلايا الفارغة والقيم الشاذة وأخطاء الصيغ

في بيئات العمل الواقعية، نادراً ما تكون أوراق البيانات نظيفة ومتجانسة تماماً؛ فغالباً ما تصادف أكواد المعالجة خلايا تحتوي على أخطاء صيغ ناتجة عن حسابات سابقة مشوهة، مثل #N/A أو #VALUE! أو #DIV/0! أو #REF!. إذا حاول كود VBA قراءة خاصية .Value لخلية تحتوي على أي من هذه الأخطاء وتمريرها مباشرة إلى دالة نصية مثل InStr أو LCase، سيتوقف البرنامج فوراً عن العمل مصدراً خطأ وقت التشغيل الشهير (Run-time error 13: Type Mismatch)، مما يؤدي إلى فشل الأتمتة بالكامل.

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

وبالمثل، يجب التعامل بحذر مع الخلايا الفارغة (Empty Cells) والنصوص الصفرية (Zero-length Strings: "" أو vbNullString). على الرغم من أن دالة InStr لا تنهار عند تمرير سلسلة فارغة كنص أصلي، إلا أنها قد تعيد قيماً غير متوقعة إذا كانت كلمة البحث نفسها فارغة كما أسلفنا. يوفر الدمج بين دالتي IsEmpty وLen صمام أمان محكماً:

If Not IsEmpty(Cell.Value) And Len(Trim(Cell.Value)) > 0 Then

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

10.2 هيكلة معالجات الأخطاء المتقدمة باستخدام On Error GoTo

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

يتم تنظيم بنية معالج الخطأ وفق الهيكل المعياري التالي:

Sub SafeTextSearch()
    On Error GoTo ErrorHandler
    
    ' إعدادات تسريع الأداء
    Application.ScreenUpdating = False
    
    ' جسم الكود الرئيسي ومعالجة البيانات
    ' ...
    
CleanExit:
    ' استعادة إعدادات التطبيق الإلزامية دائماً
    Application.ScreenUpdating = True
    Exit Sub

ErrorHandler:
    ' توثيق الخطأ وإشعار المستخدم
    MsgBox "حدث خطأ غير متوقع: " & Err.Description & " (كود الخطأ: " & Err.Number & ")", vbCritical, "خطأ في المعالجة"
    Resume CleanExit
End Sub

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

10.3 تسجيل الأخطاء (Error Logging) لضمان موثوقية الأتمتة المؤسسية

في الأنظمة الحيوية التي تعمل دون رقابة بشرية مباشرة (Unattended Automation)، لا يكفي مجرد تجاوز الخطأ أو إظهار رسالة تنبيهية للمستخدم قد تعطل تدفق المعالجة الليلية؛ بل يتعين تبني استراتيجية “تسجيل الأخطاء” (Error Logging) لتوثيق كافة السجلات الشاذة التي واجهت الخوارزمية في سجل منفصل للرجوع إليه عند التدقيق والمراجعة.

يتم تصميم آلية التسجيل إما عبر توجيه السجلات المعيبة إلى ورقة عمل مخفية مخصصة للأخطاء تسمى مثلاً “Error_Log”، أو عبر كتابة تفاصيل السجل في ملف نصي خارجي (External Log File). يتضمن السجل عادة إحداثيات الخلية المعيبة (عنوان الخلية واسم ورقة العمل)، والقيمة الأصلية التي تسببت في الخطأ، ورقم الخطأ ورسالته في نظام VBA، متبوعاً بالطابع الزمني الدقيق لوقوع الحادثة عبر الدالة المدمجة Now.

في ختام دورة العمل، يقوم الماكرو بإصدار تقرير تلخيصي (Summary Notification) يوضح إجمالي عدد الصفوف المعالجة بنجاح، وعدد السجلات التي أظهرت تطابقاً، وعدد السجلات المستبعدة أو المعيبة التي تم توثيقها في السجل. تضمن هذه المنهجية المؤسسية سلامة ونزاهة البيانات (Data Integrity)، وتمنح مسؤولي النظم الشفافية الكاملة لمراقبة جودة البيانات الواردة وتطوير خوارزميات التنقية بصورة مستمرة لمواجهة أي شذوذ هيكلي جديد في البيانات المدخلة.

11. التحليل المقارن: VBA في مواجهة الأدوات الحديثة في إكسيل المعاصر

11.1 المقارنة مع صيغ إكسيل الديناميكية الحديثة (Dynamic Array Formulas)

شهدت الإصدارات الحديثة من مايكروسوفت إكسيل (Microsoft 365 وOffice 2021 وما بعدها) ثورة بنيوية مع إطلاق محرك المصفوفات الديناميكية (Dynamic Arrays)، والذي أدخل دوالاً متطورة مثل FILTER وUNIQUE وXLOOKUP وLAMBDA. أصبح بالإمكان إنجاز عمليات التحقق النصي والتصفية دون كتابة سطر برمجي واحد، عبر دمج صيغ المصفوفات المتقدمة؛ كأن نكتب الصيغة المتدفقة التالية:

=FILTER(A2:A100, ISNUMBER(SEARCH("turtle", A2:A100)), "لا توجد نتائج")

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

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

11.2 المقارنة مع تقنيات Power Query لمعالجة النصوص الشرطية

تعد أداة Power Query المدمجة في إكسيل المحرك الأحدث والأقوى لإجراء عمليات الاستخراج والتحويل والتحميل (ETL). تتيح Power Query تنظيف البيانات ومعالجة الشروط النصية باستخدام لغة M القوية والموجهة نحو البيانات، وذلك من خلال واجهة رسومية بديهية تمكن المستخدم من إضافة “أعمدة شرطية” (Conditional Columns) تتحقق مما إذا كان النص يحتوي على كلمة محددة (عبر الدالة Text.Contains([Column], "turtle", Comparer.OrdinalIgnoreCase)) ببضع نقرات بالماوس.

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

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

11.3 موقع VBA المستقبلي بجانب Office Scripts ولغة Python في إكسيل

تشهد بيومة إكسيل تحولات جذرية مع دخول لغات وتقنيات معاصرة تعيد تعريف مستقبل الأتمتة المكتبية. يبرز في هذا السياق ظهور لغة Office Scripts القائمة على لغة TypeScript والمعتمدة كلياً على السحابة، والمصممة خصيصاً لأتمتة المهام في إصدارات إكسيل على الويب والتكامل مع خدمات Microsoft Power Automate، مما يمنحها ميزة تشغيل العمليات عبر الأجهزة المحمولة والخوادم السحابية دون الاعتماد على بيئة ويندوز المكتبية.

بالتوازي مع ذلك، شكل الدمج التاريخي الأخير للغة بايثون داخل إكسيل (Python in Excel) قفزة هائلة في قدرات التحليل النصي؛ حيث أصبح بإمكان المحللين تطبيق مكتبات معالجة اللغات الطبيعية (NLP) المتطورة مثل NLTK وspaCy والتعلم الآلي المتقدم لمطابقة النصوص بناءً على المعنى والسياق الدلالي والتشابه الإحصائي، متجاوزين بمراحل قدرات المطابقة الحرفية الصرفة لدوال InStr والتعابير النمطية.

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

12. أفضل الممارسات الهندسية لصيانة الأكواد وتأمين بيئة العمل البرمجية

12.1 معايير التوثيق وتسمية المتغيرات البرمجية وفق الاصطلاحات القياسية

تقتضي معايير الهندسة البرمجية الاحترافية الالتزام الصارم بقواعد تسمية المتغيرات لضمان قابلية قراءة الأكواد وصيانتها من قبل فرق العمل المختلفة عبر الزمن. يُعد تطبيق “التدوين المجري المنقح” (Modified Hungarian Notation) أحد أشهر الاصطلاحات المعتمدة في مجتمع VBA؛ حيث يتم تزويد اسم كل متغير ببادئة تدل على نوعه البياني، مثل استخدام strSearchTerm للمتغيرات النصية، وlngRowIndex لمتغيرات الأعداد الطويلة، وwsTarget لمتغيرات أوراق العمل، وrngData لمتغيرات النطاقات.

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

كما يُنصح بتنظيم الكود داخل وحدات برمجية (Standard Modules) موزعة موضوعياً وفقاً للمسؤوليات الوظيفية؛ كأن تُخصص وحدة برمجية لدوال فحص النصوص والتحقق المنطقي، ووحدة أخرى لمعالجة واجهة المستخدم، وثالثة لعمليات الاستيراد والتصدير، بدلاً من تكديس كافة الإجراءات في وحدة برمجية واحدة غير متجانسة، وهو ما يعزز مبدأ “فصل الاهتمامات” (Separation of Concerns) ويسهل اكتشاف وتصحيح العيوب البرمجية (Debugging).

12.2 تأمين التعليمات البرمجية والتعامل مع بروتوكولات حماية الماكرو

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

لضمان تشغيل الأكواد المؤسسية بسلاسة دون الحاجة إلى خفض مستويات الأمان العامة للجهاز، يتعين حفظ ملفات العمل التي تتضمن أكواد الماكرو في “مواقع موثوقة” (Trusted Locations) محددة مسبقاً في إعدادات مركز التوثيق، أو توقيع مشاريع VBA رقمياً باستخدام “شهادات رقمية موثوقة” (Digital Certificates) صادرة من مراجع تصديق داخلية بالمؤسسة أو عالمية موثوقة. يتيح التوقيع الرقمي للمستخدمين التحقق من سلامة الكود والتأكد من أنه لم يتعرض لأي تعديل أو تلاعب تخريبي منذ لحظة توقيعه من قبل المطور المعتمد.

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

12.3 ضمان التوافقية العابرة للإصدارات ومنصات التشغيل المختلفة

يواجه مهندسو الحلول البرمجية في VBA تحديات حقيقية عند نشر الأدوات البرمجية عبر أجهزة متعددة تعمل ببيئات تشغيل متباينة؛ وتحديداً التوافق بين بيئتي إكسيل 32 بت و64 بت (32-bit vs. 64-bit Architecture). تظهر هذه المعضلة بوضوح عند استدعاء دوال واجهة برمجة تطبيقات ويندوز (Windows API)، حيث يتطلب الانتقال إلى معمارية 64 بت استخدام الكلمة المفتاحية PtrSafe والنوع البياني المخصص للمؤشرات LongPtr لضمان عدم حدوث أخطاء عدم تطابق الذاكرة وانهيار التطبيق.

يتم التعامل مع هذه الفروق عبر تطبيق تقنية “الترجمة البرمجية الشرطية” (Conditional Compilation) باستخدام ثوابت التوجيه المسبق للمترجم (Compiler Directives) على النحو التالي:

#If VBA7 Then
    ' كود متوافق مع إصدارات إكسيل الحديثة 64 بت و32 بت
    Private Declare PtrSafe Function GetTickCount64 Lib "kernel32" () As LongLong
#Else
    ' كود للتوافق مع الإصدارات القديمة جداً
    Private Declare Function GetTickCount Lib "kernel32" () As Long
#End If

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

خاتمة

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

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

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

المراجع

  • Alexander, M., & Kusleika, D. (2022). Excel 2022 Power Programming with VBA. Wiley.
  • DeMarco, J. (2021). Mastering Excel VBA and Machine Learning: A Practical Guide. O’Reilly Media.
  • Friedl, J. E. F. (2006). Mastering Regular Expressions (3rd ed.). O’Reilly Media.
  • Jelen, B., & Syrstad, T. (2022). Microsoft Excel 2022 VBA and Macros. Microsoft Press.
  • Microsoft. (2023). InStr function (Visual Basic for Applications). Microsoft Learn. https://learn.microsoft.com/en-us/office/vba/language/reference/user-interface-help/instr-function
  • Microsoft. (2023). LCase function (Visual Basic for Applications). Microsoft Learn. https://learn.microsoft.com/en-us/office/vba/language/reference/user-interface-help/lcase-function
  • Microsoft. (2023). Introduction to Python in Excel. Microsoft Support. https://support.microsoft.com/en-us/office/introduction-to-python-in-excel-55643c2e-ff56-4168-b1ce-9428399e28c4
  • Microsoft. (2023). Office Scripts documentation. Microsoft Learn. https://learn.microsoft.com/en-us/office/dev/scripts/
  • Walkenbach, J. (2015). Excel VBA Programming For Dummies (4th ed.). For Dummies.

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

0.0 / 5 0 تقييمات

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

looti, M. (2026, سبتمبر 12). VBA: صيغة بسيطة لـ “إذا كانت الخلية تحتوي على”. عرب سايكلوجي. https://arabpsychology.com/statistics/vba-simple-formula-if-cell-contains/
looti, Mohammed. “VBA: صيغة بسيطة لـ “إذا كانت الخلية تحتوي على”.” عرب سايكلوجي, 12 سبتمبر 2026, https://arabpsychology.com/statistics/vba-simple-formula-if-cell-contains/.
looti, Mohammed. “VBA: صيغة بسيطة لـ “إذا كانت الخلية تحتوي على”.” عرب سايكلوجي. سبتمبر 12, 2026. https://arabpsychology.com/statistics/vba-simple-formula-if-cell-contains/.