تُعد معالجة النصوص وسلاسل المحارف (String Manipulation) واحدة من الركائز الجوهرية في هندسة البيانات وإدارة نظم المعلومات الحديثة، لاسيما عند التعامل مع مجموعات البيانات الضخمة أو قواعد البيانات غير المهيكلة التي تتطلب عمليات تنقية وتفكيك منهجية. في بيئات الأعمال والمؤسسات الأكاديمية التي تعتمد على تطبيقات الجداول الإلكترونية، يبرز برنامج مايكروسوفت إكسيل كبيئة عمل مركزية لتحليل البيانات؛ ومع ذلك، تقف الدوال الحسابية والصيغ المضمنة التقليدية في كثير من الأحيان عاجزة أمام معالجة النصوص الديناميكية المعقدة بدقة وانسيابية. من هنا تكتسب لغة فيجوال بيسك للتطبيقات (Visual Basic for Applications – VBA) أهمية استثنائية، بوصفها أداة برمجية متقدمة تتيح للمطورين والباحثين تجاوز القيود الهيكلية عبر كتابة دوال مخصصة تُعيد تشكيل البيانات وتستخلص الأجزاء المستهدفة بأعلى درجات الكفاءة والموثوقية.
يمثل استخراج النصوص المحصورة بين محرفين أو رمزين محددين (Extracting Text Between Two Characters) مسألة حسابية وبرمجية بالغة الشيوع والأهمية؛ حيث تتكرر الحاجة إليها في استخلاص المعرفات الرقمية المحاطة بأقواس، أو اقتطاع النصوص الفرعية المفصولة بفواصل مائلة، أو تنقية البيانات المسترجعة من سجلات الخوادم والاستبيانات المفتوحة. إن الحلول القائمة على المعادلات الورقية الطويلة والمدمجة غالباً ما تُعاني من التكلفة الحسابية المرتفعة وصعوبة الصيانة وقابليتها للانهيار عند حدوث أي تغير طفيف في بنية السجل النصي، بينما يوفر بناء دالة مخصصة بواسطة VBA تحكماً دقيقاً في مسار معالجة المحارف، وإدارة متقدمة للأخطاء البرمجية، وقابلية إعادة استخدام الشيفرة عبر مصنفات عمل متعددة.
يتناول هذا الدليل الشامل تفكيكاً علمياً ومنهجياً عميقاً لكيفية بناء وتنفيذ دوال مخصصة لاستخراج النصوص بين محرفين باستخدام لغة VBA. سنستعرض الأسس الخوارزمية لدوال الفهرسة النصية مثل InStr ودوال الاقتطاع الرياضي مثل Mid، والتحليل الحسابي الدقيق لتفادي أخطاء الإزاحة بمقدار واحد، وتطوير دوال مرنة تدعم التعابير النمطية (Regular Expressions) لمعالجة الهياكل النصية الأكثر تعقيداً، وصولاً إلى استراتيجيات تحسين الأداء وحماية البيانات وفق أفضل الممارسات المتبعة في بيئات الحوسبة المؤسسية والأكاديمية.

1. مقدمة نظرية لمعالجة النصوص وسلاسل المحارف في بيئة VBA
1.1 مفهوم سلاسل النصوص وأهميتها في أتمتة جداول البيانات
تُعرّف السلسلة النصية (String) في علوم الحاسوب ونظم البرمجة بأنها متتالية خطية مرتبة من المحارف أو البايتات المأخوذة من مجموعة محددة من الرموز المشفرة، مثل جداول ترميز ASCII أو Unicode. في بيئة Visual Basic for Applications (VBA)، تُصنف المتغيرات من نوع String إلى نوعين رئيسيين: سلاسل ذات طول متغير وسلاسل ذات طول ثابت، حيث تمتاز السلاسل ذات الطول المتغير بقدرتها على استيعاب ما يقارب 2 مليار محرف، مما يجعلها مرنة للغاية في معالجة المدخلات الضخمة وتفكيك النصوص المعقدة. تتجلى أهمية التعامل المنهجي مع البيانات غير المهيكلة داخل بيئات الأعمال والتحليل الإحصائي في حقيقة أن معظم البيانات الخام الواردة من مصادر خارجية—مثل ملفات السجلات، أو المخرجات النصية للأنظمة القديمة، أو واجهات برمجة التطبيقات—لا تأتي في صيغة مصفوفات مرتبة، بل تتطلب تحليلاً دقيقاً لمواقع الرموز والفواصل لاستخلاص المؤشرات المفتاحية المطلوبة لأغراض اتخاذ القرار.
تكشف التجربة العملية لمحللي البيانات والباحثين عن محدودية واضحة في الصيغ الجاهزة المدمجة داخل أوراق العمل عند مواجهة متواليات نصية ديناميكية ومتباينة البنية. فالصيغ التقليدية غالباً ما تُبنى على افتراضات خطية ثابتة حول موقع الرمز وطول النص، وعندما يتغير موضع المحرف المحدد من سجل لآخر، تتعقد المعادلات الرياضية وتصبح متعددة الطبقات بشكل يصعب قراءته وتدقيقه. إن تحويل هذا المنطق المعقد إلى إجراءات برمجية واضحة ومغلفة داخل لغة VBA يمنح المحلل القدرة على التعامل مع النصوص ككيانات مرنة يمكن قياس أبعادها، وتتبع مؤشراتها، واستقطاع أجزائها عبر خوارزميات محكمة تضمن سلامة المخرجات الإحصائية والتحليلية.
1.2 التحديات التقنية المرتبطة بتفكيك النصوص واستخراج البيانات الجزئية
يرتبط تفكيك النصوص واستخلاص السلاسل الفرعية منها بمجموعة من التحديات التقنية المتأصلة في طبيعة البيانات غير المتجانسة. يأتي في مقدمة هذه التحديات التباين الشديد في أطوال النصوص ومواقع الرموز المحددة داخل كل سجل؛ فقد يقع رمز البداية في المحرف العاشر ضمن السجل الأول، بينما يقع في المحرف المائة ضمن سجل آخر، وقد يتغير طول المقطع النصي المستهدف بين حرف واحد ومئات الأحرف. يتطلب هذا التغير المستمر خوارزميات فهرسة ديناميكية قادرة على مسح السلسلة وحساب الإحداثيات النسبية بصورة فورية لكل صف على حدة دون الاعتماد على قيم إزاحة ثابتة ومسبقة التحديد.
يتفاقم هذا التحدي البرمجي عند حدوث تداخل بين الفواصل والمحددات النصية داخل الجمل والرموز التعريفية المركبة؛ فعلى سبيل المثال، قد يحتوي النص المراد استخراجه على نفس المحرف المحدد المستخدم كرمز بداية أو نهاية، أو قد تتكرر الأقواس والفواصل داخل السجل الواحد في سياقات مختلفة. يؤدي الاقتطاع اليدوي أو استخدام أدوات الفصل الساذجة في مثل هذه السيناريوهات إلى حدوث أخطاء فادحة في جودة البيانات وتناسقها، كما تم توثيقه في الدراسات اللغوية التطبيقية ومعالجة الذخائر النصية (Alfaifi, 2015). ومن ثم، تبرز الحاجة الملحة لتطوير دوال مبرمجة تقضي على التدخل اليدوي، وتوفر مرونة استثنائية في التحقق من بنية النص قبل محاولة قراءته، مما يضمن معالجة متسقة لآلاف السجلات بلمح البصر دون فقدان أجزاء من المحتوى أو تحريف الدلالات الرقمية والنصية.
1.3 دور الدوال المخصصة (UDF) في تحسين الكفاءة البرمجية
تمثل دوال المستخدم المخصصة (User-Defined Functions – UDF) في بيئة مايكروسوفت إكسيل جسراً برمجياً متقدماً يسد الفجوة القائمة بين الشيفرات المصدرية المكتوبة بلغة VBA والصيغ المباشرة المستخدمة داخل أوراق العمل. تستند فلسفة هذه الدوال إلى مبدأ التجريد البرمجي (Abstraction)، حيث يتم تجميع المنطق الحسابي والشرطي المعقد داخل وحدة نمطية مستقلة، ثم يُتاح للمستخدم النهائي استدعاؤها مباشرة في أي خلية مثلها مثل الدوال الرياضية القياسية كـ SUM أو VLOOKUP، مع تمرير المعاملات والمتغيرات بسلاسة متناهية.
تحقق دوال UDF وفورات ملحوظة في زمن المعالجة وتكلفة الصيانة التشغيلية لنظم البيانات؛ فهي تسمح بإعادة استخدام الشيفرة البرمجية عبر أوراق عمل متعددة دون الحاجة إلى تكرار كتابة الصيغ المركبة في كل خلية. هذا التوحيد يقلل بصورة جذرية من احتمالية حدوث أخطاء في النسخ والتوزيع، ويجعل عمليات التحديث مستقبلاً تقتصر على تعديل دالة واحدة داخل محرر الأكواد ليتم تطبيق التحسينات تلقائياً على كامل المصنف. علاوة على ذلك، تسهم هذه الدوال في تبسيط وتطهير واجهة ورقة العمل للمستخدمين غير المتخصصين في البرمجة، إذ يرون صيغة واضحة ذات معالم دلالية جلية، مما يقلل من العبء المعرفي الواقع على المراجعين والمدققين الماليين والإحصائيين، ويعزز التفاعل السلس بين الإنسان والأنظمة الحاسوبية الآلية في بيئات العمل المشتركة (Human-Machine Communication, 2022).
2. البنية البرمجية الأساسية لدالة استخراج النص المخصصة (ExtractBetween)
2.1 تفكيك الوسائط المدخلة للدالة وطبيعة البيانات النصية
عند بناء دالة مخصصة قوية لاستخراج النصوص بين محرفين، يتعين أولاً تحديد المعاملات والوسائط المدخلة بدقة لضمان استقرار التنفيذ البرمجي وقابلية التكيف مع مختلف المتغيرات. تتطلب الدالة الأساسية، والتي سنطلق عليها اسم ExtractBetween، ثلاثة مدخلات رئيسية محددة النوع: الوسيط الأول يمثل السلسلة النصية المصدرية (this_text As String)، وهو المرجع الأصلي الذي سيخضع للفحص والتفكيك؛ والوسيط الثاني يحدد رمز أو محرف البداية (start_char As String) الذي يعلن بداية المقطع المستهدف؛ بينما يمثل الوسيط الثالث محرف النهاية (end_char As String) الذي يُشير إلى حد الانتهاء للاقتطاع.
من الأهمية بمكان من منظور هندسة البرمجيات أن يتم إسناد نوع البيانات String الصريح لهذه المعاملات بدلاً من تركها كمتغيرات عامة غير محددة (Variant)، على الرغم من أن المتغيرات العامة قد تبدو أكثر مرونة في استقبال أنواع بيانات مختلفة كالأرقام والتواريخ. إن التحديد الصارم لنوع البيانات يقلل من استهلاك الذاكرة، ويمنع أخطاء التوافق التلقائي لنوع البيانات (Type Coercion Issues)، ويضمن أن بيئة تشغيل VBA ستقوم بالتعامل مع كافة المدخلات كسلاسل محارف متسلسلة، مما يمهد الطريق لتطبيق دوال الفهرسة المكانية بكفاءة عالية وبدون مفاجآت غير متوقعة أثناء زمن التشغيل.
2.2 دراسة آلية عمل دالة InStr لتحديد المواقع الفاصلة
تعتمد النواة الخوارزمية لتحديد مواقع المحارف في لغة VBA على الدالة المدمجة InStr (In-String Search). تعمل هذه الدالة عبر إجراء مسح خطي تسلسلي لمحارف السلسلة النصية المستهدفة بحثاً عن أول تطابق للرمز المطلوب، وتُرجع رقماً صحيحاً من نوع Long يمثل الفهرس المكاني (1-based index) للرمز داخل النص. تأخذ الدالة صيغة قياسية يمكن تمثيلها بالمعاملات التالية: نقطة البداية للمسح، السلسلة المستهدفة، الرمز المراد البحث عنه، ونوع المقارنة النصية؛ وعند إغفال نقطة البداية، تنطلق الدالة تلقائياً من المحرف الأول في السلسلة النصية.
يتميز سلوك دالة InStr بدقة متناهية وحتمية رياضية، حيث تُرجع القيمة 1 إذا وُجد الرمز في بداية السلسلة مباشرة، وتُرجع أرقاماً متصاعدة كلما توغل الرمز داخل عمق النص. وفي المقابل، إذا فشلت الدالة في العثور على أي تطابق للمحرف المحدد ضمن السلسلة المفحوصة، فإنها تعيد بشكل افتراضي القيمة الحسابية الصفرية 0. يشكل هذا السلوك الصامت عند الفشل نقطة حرجة في التصميم البرمجي؛ إذ يتوجب على المطور التقاط هذه القيمة الصفرية وفحصها بعناية، لمنع استغلالها المباشر في دوال الاقتطاع التي لا تقبل إحداثيات صفرية، وتفادي حدوث انهيار تنفيذي في معالجة السجلات.
2.3 توظيف دالة Mid لاقتطاع النصوص بدقة استناداً للإحداثيات
بمجرد تحديد المواقع الفهرسية لمحرفي البداية والنهاية عبر دالة InStr، تتدخل الدالة المدمجة Mid لتنفيذ عملية الاستقطاع الفعلي للمقطع النصي المطلوب. تتطلب دالة Mid ثلاثة معاملات أساسية: السلسلة النصية الأصلية التي يُقتطع منها، ونقطة الانطلاق العددية (Start Position) التي يبدأ منها استخلاص المحارف، وطول المقطع النصي المراد اقتطاعه (Length) مقاساً بعدد المحارف الإفرادية. تُرجع الدالة بعد ذلك سلسلة نصية فرعية تتطابق تماماً مع الأبعاد المحددة سلفاً.
تتحقق الكفاءة العالية في الدالة المخصصة عندما يتم تمرير نواتج الحسابات الرياضية للمواقع بدقة إلى دالة Mid؛ حيث يتم تعيين نقطة الانطلاق لتكون متجاوزة لمحرف البداية، ويتم ضبط معامل الطول ليتوقف مباشرة قبل محرف النهاية. بعد اكتمال تنفيذ عملية الاستقطاع، يتم إسناد القيمة النصية الناتجة إلى اسم الدالة المخصصة نفسها (ExtractBetween = Result)، وهو الأسلوب البرمجي القياسي في لغة VBA لإرجاع القيم من الدوال، مما يجعل النتيجة تظهر بصورة فورية ومباشرة داخل خلية ورقة العمل التي استدعت المعادلة.
3. التحليل الرياضي والمنطقي لحساب أبعاد النص المستهدف
3.1 معادلة إزاحة نقطة الانطلاق لتجاوز محرف البداية
تمثل مشكلة الإزاحة المكانية أحد أهم المفاصل المنطقية في هندسة دوال معالجة النصوص. عندما تُحدد دالة InStr موقع محرف البداية، فإنها تُعيد الفهرس الدقيق للمحرف نفسه؛ فإذا كان النص هو "Product[A100]Details" وكان محرف البداية هو القوس المربع "["، فإن InStr ستعيد القيمة 8، وهي موقع القوس المربع تحديداً. إذا تم تمرير هذا الرقم مباشرة كنقطة انطلاق لدالة Mid، فإن السلسلة المستخرجة ستتضمن محرف البداية ضمن نتائجها، مما يخل بنقاء البيانات المستهدفة ويتطلب معالجة يدوية لاحقة لإزالة الرمز غير المرغوب فيه.
لضمان تجاوز محرف البداية واستخلاص المحتوى المحصور حصراً، يتعين رياضياً إضافة طول محرف البداية إلى الموقع المكتشف. في الحالات القياسية التي يكون فيها محرف البداية عبارة عن رمز فردي ذي طول يساوي واحداً، يتم صياغة معادلة نقطة الانطلاق كالتالي: StartPosition = InStr(1, this_text, start_char) + Len(start_char). تضمن هذه الإضافة الحسابية قفز مؤشر القراءة بمقدار خانة واحدة أو خانات متعددة للأمام، ليبدأ الاقتطاع من الحرف الأول الفعلي للبيانات الجوهرية، وهو ما يرفع من موثوقية المخرجات التحليلية المعتمدة على دقة المتغيرات اللفظية والرمزية.
3.2 صياغة معادلة حساب الطول الدقيق للسلسلة المستخرجة
يتطلب تحديد طول السلسلة المستخرجة اشتقاقاً رياضياً دقيقاً يربط بين موقع نهاية المقطع النصي وموقع انطلاقه الفعلي. إذا افترضنا أن موقع محرف البداية هو $P_{start}$ وموقع محرف النهاية هو $P_{\end}$، فإن المسافة الإجمالية بين المحرفين تتحدد بالفارق الرياضي بين الإحداثيين. ولما كانت نقطة البداية الفعلية للاقتطاع قد تمت إزاحتها للأمام لتجاوز رمز البداية، وكان الهدف هو التوقف قبل الوصول إلى رمز النهاية، فإن المعادلة الصارمة لحساب الطول المستخلص ($L$) تُصاغ رياضياً على النحو الآتي:
$$L = P_{\end} – (P_{start} + \text{Len}(start_char))$$
وفي الحالة المبسطة التي يمثل فيها محرف البداية رمزاً أحادياً، تُختزل المعادلة إلى الشكل الكلاسيكي الشائع: Length = EndPosition - StartPosition - 1. يضمن هذا الخصم الحسابي المزدوج استبعاد كلا المحرفين المحددين من المخرجات؛ حيث يمنع ظهور رمز النهاية ملتصقاً بآخر الكلمة المستخرجة، ويحول دون اقتطاع أحرف زائدة قد تفسد بنية المفاتيح الرقمية أو الأكواد التعريفية المشفرة. إن النمذجة الرياضية لهذه المسافة تضمن تطبيقاً متسقاً وصحيحاً عبر كافة السجلات بصرف النظر عن تباين تباعد الرموز داخل النصوص المختلفة.
3.3 تفادي أخطاء الإزاحة بمقدار واحد (Off-by-One Errors)
يُعد خطأ الإزاحة بمقدار واحد (Off-by-One Error) من أكثر الأخطاء المنطقية شيوعاً وخطورة في علوم الحاسوب وهندسة البرمجيات، ويحدث عندما يتم ضبط حدود التكرار أو الفهرسة الحسابية بقيمة تزيد أو تنقص بمقدار وحدة واحدة عن النطاق الصحيح. في سياق معالجة النصوص في VBA، ينشأ هذا الخطأ عادةً نتيجة الخلط بين الفهرسة القائمة على الأساس واحد (1-based indexing) المعتمدة افتراضياً في لغة VBA، وبين الفهرسة القائمة على الأساس صفر (0-based indexing) الشائعة في لغات أخرى مثل بايثون وسي بلس بلس، أو بسبب سوء تقدير تأثير الإزاحات المضافة أو المطروحة.
تتجسد تداعيات هذا الخطأ عملياً في سيناريوهات إحصائية غير مقصودة، كأن يتم بتر الحرف الأخير من الكود المستهدف، أو تضمين محرف الإغلاق ضمن البيانات المستخلصة، مما يؤدي إلى فشل عمليات المطابقة والربط الإحصائي لاحقاً. لتفادي هذه الانزلاقات البرمجية، ينبغي تطبيق منهجية التدقيق الحسابي للحدود (Boundary Testing) عبر إخضاع المعادلة لاختبارات يدوية على سلاسل نصية قياسية معلومة الأبعاد بدقة؛ فإذا كان النص هو "(ABC)" فإن موقع "(" هو 1 وموقع ")" هو 5، وبتطبيق المعادلة: $5 – 1 – 1 = 3$، وهو طول السلسلة "ABC" تماماً، مما يبرهن على سلامة البناء الرياضي ويقي الشيفرة من انحرافات الإزاحة الخفية.

4. خطوات تثبيت وتفعيل الكود داخل محرر Visual Basic for Applications
4.1 الوصول إلى بيئة التطوير عبر شريط المطور (Developer Tab)
تتطلب كتابة وتنفيذ الأكواد البرمجية المخصصة في مايكروسوفت إكسيل الدخول إلى بيئة التطوير المتكاملة (Integrated Development Environment – IDE) الخاصة بلغة VBA. بشكل افتراضي، يأتي شريط المطور (Developer Tab) مخفياً في واجهة إكسيل القياسية لمنع العبث غير المقصود بالخيارات المتقدمة، ولتفعيله يتعين التوجه إلى قائمة “ملف” (File)، ثم اختيار “خيارات” (Options)، والنقر على “تخصيص الشريط” (Customize Ribbon)؛ ومن ثم وضع علامة الاختيار في المربع المجاور لتبويب “المطور” في القائمة اليمنى والضغط على موافق لإظهاره بصورة دائمة في شريط الأدوات العلوي.
للوصول المباشر والسريع إلى محرر الأكواد دون التنقل عبر القوائم، يُفضل استخدام الاختصار البرمجي الكلاسيكي في لوحة المفاتيح Alt + F11، والذي يفتح فوراً نافذة محرر مايكروسوفت فيجوال بيسك للتطبيقات المستقلة. تشتمل هذه النافذة المتكاملة على عناصر تحكم جوهرية، يتصدرها جزء مستكشف المشاريع (Project Explorer) في الجانب الأيسر، والذي يعرض هيكلاً شجرياً لكافة المصنفات المفتوحة وأوراق العمل التابعة لها، بالإضافة إلى نافذة الخصائص (Properties Window) ونافذة كتابة الأكواد الرئيسية، مما يوفر بيئة متكاملة لإدارة وتتبع المشاريع البرمجية بكفاءة واحترافية عالية.
4.2 إنشاء وحدة نمطية قياسية (Standard Module) وإدراج الكود
من الأخطاء الجسيمة الشائعة بين المطورين المبتدئين لصق الدوال المخصصة داخل الحاويات البرمجية الخاصة بأوراق العمل الفردية (مثل Sheet1 أو ThisWorkbook)؛ حيث إن الأكواد المكتوبة داخل نطاق ورقة العمل تُعامل كإجراءات خاصة مرتبطة بأحداث تلك الورقة حصراً، ولا يمكن للبرنامج التعرف عليها كدوال عامة قابلة للاستدعاء من صيغ الخلايا في سائر المصنف. ولضمان إتاحة الدالة لكافة خلايا المصنف وفي جميع أوراق العمل دون قيود، يتعين بالضرورة إدراج وحدة نمطية قياسية عامة (Standard Module).
يتم إنجاز ذلك بالنقر بزر الفأرة الأيمن على اسم المصنف داخل نافذة مستكشف المشاريع، ثم اختيار قائمة “إدراج” (Insert)، والضغط على خيار “وحدة نمطية” (Module). يفتح هذا الإجراء نافذة تحرير نصية بيضاء جديدة تمثل الوحدة النمطية القياسية المنشأة. داخل هذه النافذة، يتم لصق الشيفرة البرمجية للدالة المخصصة مع مراعاة التنسيق الجمالي والمسافات البادئة (Indentation) لقراءة الكود بسلاسة. بعد اللصق، ينبغي فحص الشيفرة والتأكد من عدم تظليل أي سطر باللون الأحمر، وهو المؤشر البصري الفوري في بيئة VBA الذي يدل على وجود خطأ تركيبي أو نحوي أولي في صياغة الكود.
4.3 حفظ المصنف بصيغة تدعم وحدات الماكرو وتأمين التشغيل
تفرض حزمة مايكروسوفت أوفيس قيوداً أمنية وهيكلية صارمة لحماية نظم التشغيل من البرمجيات الخبيثة المضمنة داخل المستندات؛ ونتيجة لذلك، فإن حفظ ملف إكسيل بالصيغة الافتراضية القياسية ذات الامتداد .xlsx سيؤدي حتماً إلى حذف وتجريد كافة وحدات الماكرو والدوال المخصصة المكتوبة بلغة VBA فور إغلاق الملف، مع فقدان الشيفرات المصدرية بصورة نهائية لا يمكن استرجاعها. لتجنب هذه الكارثة التشغيلية، يجب حفظ المصنف بصيغة تدعم وحدات الماكرو، وذلك باختيار امتداد المصنف الممكّن لوحدات الماكرو (Excel Macro-Enabled Workbook) والذي يحمل الامتداد .xlsm.
بالتوازي مع حفظ الملف بالامتداد الصحيح، يتوجب على المستخدم فحص إعدادات مركز التوثيق (Trust Center) داخل برنامج إكسيل للتأكد من السماح بتنفيذ الأكواد البرمجية بأمان وموثوقية. يمكن الوصول إلى هذه الإعدادات عبر تبويب المطور ثم اختيار “أمان الماكرو” (Macro Security)، وضبط الخيار على “تعطيل كافة وحدات الماكرو مع إشعار” (Disable all macros with notification). يتيح هذا الإعداد الآمن للنظام تشغيل الأكواد البرمجية بعد ظهور شريط أصفر علوي يطلب من المستخدم تمكين المحتوى (Enable Content) عند فتح الملف للمرة الأولى، مما يوفر بيئة تشغيل آمنة تجمع بين الفاعلية البرمجية والحماية الوقائية للمعلومات.
5. التطبيق العملي: استخراج النصوص المحصورة بين أقواس في جداول البيانات
5.1 إعداد نموذج البيانات وتجهيز أعمدة الإدخال والإخراج
لتوضيح الفاعلية التطبيقية للدالة المخصصة في بيئات العمل الحقيقية، نأخذ نموذجاً واقعياً لجدول بيانات مبيعات أو مخزون يحتوي على عمود يسجل “بيانات المنتج المركبة”، حيث تُكتب السجلات بصيغ تجمع بين الاسم التجاري ورمز الفئة المضمن بين قوسين دائريين، على غرار النمط التالي: "Workstation Laptop (CAT-9821) 32GB RAM" أو "Wireless Mouse (PER-104) Optical". تمثل الأكواد المحصورة بين القوسين CAT-9821 و PER-104 المعرفات المفتاحية الفريدة التي تحتاج أقسام المحاسبة وإدارة المخزون إلى استخلاصها ومطابقتها بصورة دقيقة ومستقلة.
يتم إعداد جدول البيانات بتخصيص العمود A لاحتواء هذه النصوص المصدرية غير المهيكلة، ثم يُنشأ عمود مجاور وليكن العمود B ويُعنون باسم “كود الفئة المستخرج”. قبل الشروع في تطبيق الصيغة، يقوم المحلل بإجراء مسح بصري وإحصائي أولي على العمود المصدر للتأكد من طبيعة تموضع الأقواس؛ وملاحظة ما إذا كانت هناك سجلات استثنائية تخلو من الأقواس أو تتضمن مسافات إضافية داخلها، حيث يساعد هذا الفحص الأولي في التنبؤ بسلوك الدالة وتحديد المعاملات النصية المطلوبة لعملية الاستخراج بنجاح.
5.2 استدعاء الدالة المخصصة داخل الخلايا وتمرير المعاملات
بمجرد تثبيت الدالة داخل الوحدة النمطية للمصنف، تصبح جاهزة للاستدعاء في واجهة ورقة العمل بصورة تلقائية وفورية تماماً كأي دالة مدمجة في إكسيل. يتوجه المستخدم إلى الخلية الأولى في عمود الإخراج (ولتكن الخلية B2)، ويبدأ بكتابة علامة التساوي متبوعة باسم الدالة: =ExtractBetween(. سيلاحظ المستخدم ظهور اسم الدالة في قائمة الإكمال التلقائي، مما يؤكد نجاح تسجيلها في مساحة الأسماء الخاصة بالمصنف.
لتمرير المعاملات الثلاثة المطلوبة، يتم النقر أولاً على الخلية المصدرية المجاورة A2 لتمثيل وسيط النص الأصلي؛ ثم تُوضع فاصلة (أو فاصلة منقوطة بحسب الإعدادات الإقليمية للنظام)، ويُمرر محرف البداية وهو قوس الفتح محاطاً بعلامتي اقتباس مزدوجتين "("؛ وأخيراً يُمرر محرف النهاية وهو قوس الإغلاق محاطاً بعلامتي اقتباس مزدوجتين ")"، لتكتمل الصيغة على النحو التالي: =ExtractBetween(A2, "(", ")"). عند الضغط على مفتاح الإدخال Enter، يقوم محرك الحساب في إكسيل بتمرير القيم للشيفرة البرمجية في VBA، لترجع الخلية فوراً القيمة النصية الصافية CAT-9821 خالية تماماً من القوسين ومن النصوص الخارجية المحيطة بها.
5.3 السحب التلقائي وتطبيق الصيغة على مجموعات السجلات الكبيرة
تكتمل القوة التشغيلية للدالة عند نشرها على مجموعات البيانات الموسعة التي قد تضم آلاف السجلات المتتالية. يتم ذلك من خلال النقر المزدوج أو السحب الرأسي لمقبض التعبئة التلقائية (Auto-fill Handle) المتمركز في الزاوية اليسرى السفلى (أو اليمنى بحسب اتجاه الورقة) للخلية B2 باتجاه الأسفل لنهاية نطاق البيانات. وبفضل استخدام المراجع النسبية للمتغير الأول (A2)، ستقوم بيئة إكسيل بتحديث مرجع الصف تلقائياً لكل سجل (ليصبح A3، A4، وهكذا)، بينما تظل وسائط المحارف المحددة ثابتة ومستقرة عبر كافة الصفوف.
خلال أجزاء من الثانية، تتم معالجة كامل مصفوفة البيانات بدقة فائقة. وفي هذه المرحلة، يتعين إجراء تدقيق إحصائي عشوائي للمخرجات للتحقق من سلامة القيم المستخلصة وعدم وجود تشوهات مظهرية ناتجة عن اختلافات في بنية السجلات الفردية. يؤكد هذا التطبيق الانسيابي كيف تساهم الدوال المخصصة في تقليص زمن المعالجة اليدوية بنسبة تقارب 100%، وتوفير تدفق عمل أوتوماتيكي متكامل يُعتمد عليه في بناء التقارير التحليلية واللوجستية الدورية.
6. إدارة الأخطاء والاستثناءات البرمجية عند غياب المحارف المحددة
6.1 معالجة حالة غياب أحد محرفي البداية أو النهاية
في بيئات البيانات الواقعية، نادراً ما تتسم المدخلات بالكمال والنمطية المطلقة؛ فكثيراً ما تصادف الدوال سجلات غير مكتملة، كأن يُذكر اسم المنتج متبوعاً بقوس فتح دون إغلاقه ("Item (Missing End")، أو أن يخلو السجل بالكامل من الرموز المحددة. في الشيفرات البرمجية الساذجة التي تفتقر لمعالجة الأخطاء، يؤدي غياب أحد المحرفين إلى إرجاع دالة InStr للقيمة الصفرية 0؛ وحينها ينتج عن حساب الطول بالمعادلة Length = EndPosition - StartPosition - 1 رقم سالب (مثل: $0 – 5 – 1 = -6$).
عند تمرير طول سالب إلى دالة Mid، تنهار الدالة برمجياً وتُطلق بيئة VBA استثناء تشغيلياً خطيراً يُعرف بـ “خطأ وقت التشغيل 5: استدعاء إجراء أو وسيط غير صالح” (Run-time error ‘5’: Invalid procedure call or argument)، مما يترجم داخل خلايا إكسيل إلى خطأ القيمة الشهير #VALUE!. ولمعالجة هذا القصور المنهجي، يتوجب على المطور تضمين فحص منطقي استباقي باستخدام جملة شرطية: If StartPosition = 0 Or EndPosition = 0 Then؛ فإذا تحقق هذا الشرط، يتم توجيه الدالة فوراً لإرجاع سلسلة نصية فارغة "" أو رسالة توضيحية محددة والخروج بأمان، مما يحافظ على استقرار المصنف وتماسكه البصري والتحليلي.
6.2 معالجة انعكاس ترتيب المحارف وتداخل النصوص غير المنطقي
تتمثل إحدى الحالات الشاذة الخفية (Edge Cases) في قواعد البيانات في انعكاس الترتيب المنطقي للرموز؛ كأن يظهر محرف النهاية المفترض في موقع يسبق محرف البداية داخل السلسلة النصية الواحدة (على سبيل المثال: "Review) Code [Test"). في هذا السياق، ستجد دالة InStr كلا المحرفين بنجاح، وترجع قيماً موجبة غير صفرية لكليهما (مثلاً موقع القوس المغلق هو 7 وموقع القوس المفتوح هو 15)؛ مما يخدع الفحوصات المنطقية البسيطة التي تكتفي بالتحقق من أن القيم أكبر من الصفر.
إذا تم حساب الطول في هذا السيناريو، فسينتج مجدداً رقم سالب لأن EndPosition أصغر رياضياً من StartPosition ($7 – 15 – 1 = -9$)، مؤدياً بدوره إلى حدوث خطأ وقت التشغيل رقم 5 وانهيار الصيغة. لذلك، يقتضي التصميم البرمجي الرصين صياغة شرط منطقي إضافي يتحقق بصرامة من أن موقع النهاية أكبر قطعاً من موقع البداية: If EndPosition > StartPosition Then. ومن خلال هذا التحقق المزدوج للوجود والترتيب الزمني الصحيح، تكتسب الدالة مناعة كاملة ضد تشوهات البيانات النصية غير المتوقعة، وتضمن معالجة منطقية رصينة لكافة الاحتمالات الهيكلية.
6.3 بناء دالة متينة ومرنة تدعم معالجات الأخطاء المتقدمة
للارتقاء بالدالة المخصصة إلى المستويات المؤسسية الجاهزة للاستخدام في الإنتاج، يجب تدعيمها بمنظومة متكاملة لمعالجة الأخطاء غير المتوقعة عبر توظيف عبارة On Error GoTo. تضمن هذه العبارة توجيه دفة التنفيذ في حال حدوث أي خطأ حوسبي غير متوقع—مثل تمرير كائنات غير متوافقة أو حدوث فيض في الذاكرة—إلى كتلة برمجية خاصة في نهاية الدالة تتعامل مع الاستثناء بنعومة ودون إظهار نوافذ التحذير المزعجة للمستخدم النهائي.
تسمح هذه المنظومة بإرجاع نصوص دلالية واضحة بدلاً من أخطاء النظام الافتراضية، كأن ترجع الدالة نصاً مثل "غير متطابق" أو تبقى الخلية فارغة بصمت بحسب ما تقتضيه متطلبات النمذجة الإحصائية وتفضيلات المستخدمين (Zöller, 2019). بعد انتهاء معالجة الخطأ، يُفضل دوماً إعادة تعيين بيئة الأخطاء إلى وضعها الطبيعي باستخدام On Error GoTo 0 لضمان استقرار جلسة العمل. يوضح الكود التالي النموذج البرمجي الأمثل والمتكامل للدالة بعد إدماج كافة تقنيات التحقق والتحصين المنطقي المذكورة:
Function ExtractBetween(ByVal this_text As String, ByVal start_char As String, ByVal end_char As String) As String
On Error GoTo ErrorHandler
Dim StartPos As Long
Dim EndPos As Long
Dim ExtractLength As Long
StartPos = InStr(1, this_text, start_char, vbTextCompare)
If StartPos = 0 Then
ExtractBetween = “”
Exit Function
End If
StartPos = StartPos + Len(start_char)
EndPos = InStr(StartPos, this_text, end_char, vbTextCompare)
If EndPos > StartPos Then
ExtractLength = EndPos – StartPos
ExtractBetween = Mid(this_text, StartPos, ExtractLength)
Else
ExtractBetween = “”
End If
Exit Function
ErrorHandler:
ExtractBetween = “”
End Function
7. التعامل مع حالات التعقيد النصي وتكرار المحارف
7.1 استخراج النص بين محارف مكررة داخل السلسلة الواحدة
تواجه الدوال النصية تحدياً كبيراً عندما يكون المحرف المحدد مكرراً أكثر من مرة داخل السلسلة النصية، أو عندما يكون محرفا البداية والنهاية متماثلين في الشكل والرمز؛ مثل استخراج النص المحصور بين علامتي تنصيص متتاليتين "Text" أو بين شرطتين مائلتين /Folder/Subfolder/. إذا تم استدعاء InStr مرتين بصورة تقليدية تبدأ كلاهما من أول النص، فإن كلاً من StartPos و EndPos سيتطابقان عند نفس الرقم، ليكون طول النص المستخرج صفراً وتفشل العملية برمتها.
يكمن الحل التقني لهذه المعضلة في استغلال المعامل الاختياري الأول لدالة InStr، وهو معامل نقطة البداية (Start Parameter). فبدلاً من ترك دالة البحث الثانية تبدأ من الخانة الأولى، يتم ضبطها لتنطلق حصراً من بعد موقع محرف البداية مباشرة: EndPos = InStr(StartPos + Len(start_char), this_text, end_char). بهذه الطريقة الخوارزمية، تتجاهل عملية البحث الثانية المحرف الأول الذي تم استخدامه كنقطة انطلاق، وتبدأ مسحها للأمام لاقتناص التكرار الثاني التالي مباشرة للمحرف، مما يتيح عزل المقاطع النصية المحصورة بين الرموز المتطابقة بمنتهى السلاسة والاتساق المنطقي.
7.2 التحكم في حساسية حالة الأحرف (Case Sensitivity)
عندما تكون الرموز المحددة للاستخراج عبارة عن حروف هجائية (مثل استخراج النص المحصور بين الحرفين [A] و [Z] في اللغات المعتمدة على الأبجدية اللاتينية)، تبرز إشكالية حساسية حالة الأحرف (Case Sensitivity). في بيئة VBA الافتراضية، تعمل دالة InStr وفق نمط المقارنة الثنائية (vbBinaryCompare)، وهو نمط يتطابق فيه كود الحرف تماماً مع قيمته في جدول الأسكي، مما يعني أن الحرف الكبير "A" يختلف جذرياً عن الحرف الصغير "a"، وبالتالي لن تكتشف الدالة الرمز إذا اختلف نمط الحرف في الخلية عن الوسيط المدخل.
لإضفاء المرونة على الدالة وجعلها غير حساسة لحالة الأحرف عند الحاجة، يمكن ضبط وسيط المقارنة في دالة InStr على النمط النصي (vbTextCompare)، والذي يقوم بمقارنة الحروف استناداً لترتيبها الهجائي المستقل عن حالة الحجم. بل إنه يمكن تطوير الدالة المخصصة لتقبل معاملاً اختيارياً رابعاً من نوع منطقي (Optional ByVal CaseSensitive As Boolean = False)؛ حيث تفحص الدالة هذا المعامل وتوجه عملية البحث إما إلى المقارنة الثنائية الدقيقة أو المقارنة النصية العامة، مما يمنح الباحثين في اللغويات الحاسوبية وتحليل الخطاب دقة استثنائية في ضبط حدود الاستخراج النصي بما يتلاءم مع طبيعة المدونات المحللة (Renzi et al., 2016).
7.3 استخراج النصوص من الهياكل المتداخلة متعددة المستويات
تعتبر الهياكل المتداخلة (Nested Delimiters) من أكثر الأنماط النصية تعقيداً في معالجة البيانات؛ وتحدث عندما تتضمن السلسلة أقواساً داخل أقواس أخرى، على غرار النمط: "Alpha (Beta (Gamma) Delta) Epsilon". في مثل هذه الحالات، ينقسم الهدف التحليلي إلى مسارين: إما استخراج النص المحصور بين القوس الخارجي الأول وآخر قوس إغلاق في السلسلة (الشامل: Beta (Gamma) Delta)، أو استخراج النص المتمركز في النواة الأعمق (الداخلي: Gamma).
إذا كان الهدف هو الاقتطاع الخارجي الأشمل، فإن استخدام InStr العادية لتحديد القوس الأول بالتزامن مع استخدام دالة البحث العكسي InStrRev لتحديد القوس الأخير يمثل الحل الهندسي الأمثل؛ حيث تنطلق InStrRev من نهاية السلسلة عائدة إلى الوراء لتلتقط آخر ظهور لمحرف الإغلاق بدقة. أما إذا كان المطلوب هو اقتناص النواة الأعمق، فيتطلب الأمر بناء خوارزمية تكرارية (Recursive Algorithm) أو حلقة تكرارية تبحث عن آخر محرف فتح يسبق أول محرف إغلاق مباشر. يتيح فهم هذه التكتيكات البرمجية المتقدمة مرونة فائقة في التعامل مع مختلف مستويات التشابك النصي دون إخلال بحدود البنية اللغوية للبيانات المدروسة.
8. مقارنة أداء الدالة المخصصة ببدائل Excel المدمجة
8.1 المقارنة مع صيغ إكسيل التقليدية المدمجة (MID, SEARCH, FIND)
يمكن للمستخدم المتقدم في إكسيل تحقيق عملية استخراج النص بين محرفين دون اللجوء لأكواد VBA عبر دمج الدوال التقليدية المدمجة في ورقة العمل ضمن صيغة واحدة مركبة على النحو التالي:
=MID(A2, SEARCH("(", A2) + 1, SEARCH(")", A2, SEARCH("(", A2) + 1) - SEARCH("(", A2) - 1)
على الرغم من أن هذه المعادلة تؤدي نفس الغرض الوظيفي، إلا أنها تعاني من عيوب هيكلية خطيرة؛ أولها انخفاض مقروئية الصيغة بصورة حادة وتشتت المستخدم غير المتخصص، مما يرفع من تكلفة الصيانة البرمجية والتدقيق البشري. فإذا تطلب العمل لاحقاً تعديل الرموز المحددة، يتعين على المحلل تحديث الرمز في أربعة مواقع مختلفة داخل المعادلة، مما يرفع احتمالية الخطأ اليدوي بشكل دراماتيكي مقارنة بالدالة المخصصة ExtractBetween التي تُمرر إليها الرموز كوسائط مباشرة وسلسة.
علاوة على ذلك، تتميز دالة VBA المخصصة بقدرتها الفائقة على معالجة الأخطاء بصمت ومرونة داخل محركها البرمجي، بينما تتطلب الصيغ المدمجة تغليف المعادلة الطويلة بدالة IFERROR إضافية، مما يجعلها مضاعفة الطول وشديدة التعقيد. ومع ذلك، تتفوق الصيغ المدمجة في نقطة جوهرية واحدة وهي سرعتها الفائقة عند التشغيل في المصنفات الضخمة؛ نظراً لأنها مبرمجة بلغة C++ ومحسنة داخل النواة الصلبة لبرنامج إكسيل، مما يفرض موازنة واعية بين سهولة الصيانة وسرعة الحساب الصافية.
8.2 المقارنة مع أداة استخراج البيانات المتقدمة (Power Query)
تمثل بيئة باور كويري (Power Query) المدمجة في الإصدارات الحديثة من إكسيل البديل المعاصر والأكثر كفاءة لمعالجة وتحويل البيانات (ETL). توفر هذه الأداة واجهة تفاعلية بديهية تتيح استخراج النصوص بين محددات بنقرات بسيطة من خلال أمر “استخراج النص بين محددات” (Text Between Delimiters) المعتمد على لغة M البرمجية، دون الحاجة لكتابة معادلات رياضية معقدة أو وحدات ماكرو.
تتمحور المفاضلة بين Power Query ودوال VBA حول طبيعة وتواتر تدفق البيانات؛ فإذا كانت البيانات عبارة عن تدفقات يومية ثابتة يتم استيرادها دورياً من مصادر خارجية، فإن Power Query تُعد الخيار الأمثل لقدرتها الفائقة على تنظيف مئات الآلاف من الصفوف في الخلفية وتحديثها بضغطة زر واحدة دون استهلاك موارد المعالجة الحية للمصنف. وفي المقابل، تظل دالة VBA المخصصة متفوقة في السيناريوهات الحية التفاعلية التي تتطلب حساباً فورياً ولحظياً داخل خلايا ورقة العمل بمجرد قيام المستخدم بتعديل قيمة السجل النصي، مما يجعل الأداة البرمجية متكاملة مع بنية الجداول الديناميكية المتغيرة لحظة بلحظة.
8.3 تقييم الكفاءة الحسابية واستهلاك الذاكرة في الملفات الضخمة
يشكل تقييم الكفاءة الحسابية (Computational Complexity) واستهلاك الذاكرة أحد المعايير المحورية في اختيار الحلول البرمجية المثلى. تتميز دوال VBA المخصصة بكونها تخضع لآلية “الحساب التلقائي عند الطلب”؛ ومع ذلك، فإن تطبيق دالة مخصصة على مصفوفات بيانات هائلة تتجاوز مئات الآلاف من الصفوف يؤدي إلى بطء ملحوظ في زمن إعادة حساب المصنف (Workbook Recalculation)، نتيجة الانتقال المتكرر بين بيئة تشغيل ورقة العمل (Excel Engine) وبيئة تنفيذ أكواد الماكرو (VBA Virtual Machine)، وهو ما يعرف بتكلفة تبديل السياق (Context Switching Overhead).
لتحسين أداء الأكواد وتخفيض هذا العبء، يُنصح بتعطيل تحديث الشاشة والحساب التلقائي أثناء تنفيذ المعالجات الكبيرة، أو اللجوء إلى معالجة البيانات عبر مصفوفات الذاكرة الافتراضية (VBA Memory Arrays) بدلاً من استدعاء الدالة داخل كل خلية منفردة. يوضح الجدول المقارن التالي أبرز الفروق الفنية بين الأساليب الثلاثة لمعالجة النصوص المستهدفة:
| معيار المقارنة | دالة VBA المخصصة (UDF) | صيغ إكسيل المدمجة (MID/SEARCH) | أداة Power Query |
|---|---|---|---|
| سهولة القراءة والصيانة | عالية جداً (كود مركزي موحد) | منخفضة (معادلات طويلة ومعقدة) | ممتازة (واجهة مرئية وخطوات مسجلة) |
| التحديث اللحظي للبيانات | فوري وتلقائي مع تغير الخلية | فوري وتلقائي مع تغير الخلية | يتطلب أمراً يدوياً أو مجدولاً للتحديث |
| الأداء مع السجلات الضخمة (>100K) | متوسط (يتأثر بتكلفة تبديل السياق) | سريع جداً (محسن بلغة C++) | استثنائي ومحسن لمعالجة البيانات الضخمة |
| مرونة إدارة الأخطاء | تحكم كامل ومخصص برمجياً | محدودة (تتطلب دوال IFERROR إضافية) | عالية (عزل تلقائي للصفوف المعطوبة) |
| التوافقية والأمان | تتطلب حفظ الملف بصيغة XLSM وتمكين الماكرو | متوافقة تماماً مع كافة الإصدارات وصيغ XLSX | متوافقة مع الإصدارات الحديثة (2016 فما فوق) |
9. توسيع نطاق الدالة واستخدام التعابير النمطية (Regular Expressions)
9.1 حدود الدوال النصية التقليدية وضرورة التحول للتعابير النمطية
تقف دوال الفهرسة المكانية البسيطة مثل InStr عاجزة عند مواجهة أنماط نصية متغيرة البنية لا تعتمد على رموز ثابتة بعينها، بل على قوالب ومفاهيم عامة؛ كأن يكون المطلوب استخراج النص المحصور بين أي رقمين عشريين، أو بين أي حرف هجائي وعلامة ترقيم، أو بين أنواع متباينة من الأقواس المتناثرة داخل النص بصورة غير منتظمة. في مثل هذه البيئات المعقدة، يتطلب استخدام الدوال التقليدية كتابة عشرات الشروط المتداخلة التي تجعل الشيفرة غير قابلة للصيانة أو التوسع.
من هنا تنبع ضرورة التحول نحو توظيف التعابير النمطية (Regular Expressions – Regex)، وهي لغة توصيفية قياسية فائقة التطور تتيح مطابقة الأنماط النصية المعقدة بمرونة حوسبية لا نظير لها. تمكن التعابير النمطية المطور من صياغة سطر برمجي واحد قادر على البحث عن أنماط دلالية مجردة، مما يفتح آفاقاً واسعة في معالجة المدونات والوثائق اللغوية المعقدة التي تخضع لأطر تنقية متقدمة في علوم اللسانيات الحاسوبية والذكاء الاصطناعي (Jagadish et al., 2024).
9.2 استدعاء مكتبة VBScript Regular Expressions داخل VBA
لا تدعم لغة VBA التعابير النمطية بصورة فطرية مضمنة، ولكنها تتيح للمطورين استدعاء كائن المحرك الخارجي المتخصص عبر مكتبة Microsoft VBScript Regular Expressions 5.5. يمكن ربط هذه المكتبة برمجياً بأسلوبين: الربط المبكر (Early Binding) الذي يتطلب تفعيل المكتبة يدوياً من قائمة الأدوات والمراجع في محرر VBA، أو الربط المتأخر (Late Binding) الذي يتم عبر إنشاء الكائن ديناميكياً أثناء زمن التشغيل باستخدام الدالة: Set regEx = CreateObject("VBScript.RegExp").
يُعد أسلوب الربط المتأخر هو الخيار المفضل والأكثر موثوقية في بيئات العمل المشتركة؛ لأنه يضمن تشغيل الدالة على أجهزة المستخدمين الآخرين دون الحاجة لضبط يدوي لمراجع النظام أو مواجهة أخطاء فقدان المكتبات (Missing References). بعد إنشاء كائن التعبير النمطي، يتم ضبط خصائصه الأساسية، مثل تفعيل خاصية Global = True للبحث عن كافة التطابقات داخل السلسلة، وتعيين IgnoreCase = True لضمان عدم التأثر بحجم الحروف، وتهيئة خاصية MultiLine لتحديد ما إذا كان المسح سيشمل الأسطر المتعددة داخل الخلية الواحدة.
9.3 صياغة أنماط التعبير النمطي لاستخلاص المحتوى المحصور
تعتمد قوة التعابير النمطية على دقة صياغة النمط البحثي (Pattern). لاستخراج النص المحصور بين محرفين معينين، يتم بناء نمط رياضي ذكي يوظف مفهوم “المجموعات الملتقطة” (Capturing Groups) عبر استخدام الأقواس الهلالية (). على سبيل المثال، لاستخراج النص المحصور بين قوسي فتح وإغلاق، يُصاغ النمط بالشكل التالي: ((.*?))؛ حيث تُستخدم الشرطة المائلة المعكوسة لتمييز الأقواس كرموز حرفية وليست رموزاً برمجية خاصة، بينما يمثل الجزء (.*?) النواة الحقيقية للاستخلاص.
يحمل التعبير .*? أهمية هندسية استثنائية؛ إذ تُعرف علامة الاستفهام اللاحقة لنجمة التكرار بأنها “المطابقة غير الجشعة” أو الكسولة (Non-greedy matching). تضمن هذه المطابقة توقف محرك البحث عند أول ظهور لمحدد النهاية مباشرة، متجنبة بذلك “المطابقة الجشعة” (Greedy matching) التي قد تلتهم كامل السلسلة حتى آخر محرف إغلاق في السطر لتقتطع مقاطع زائدة لا صلة لها بالهدف. بمجرد تنفيذ المطابقة عبر الدالة regEx.Execute(this_text)، يمكن استرجاع القيمة المستهدفة مباشرة من مجموعة الالتقاط الفرعية SubMatches(0)، لتقدم الدالة حلاً نموذجياً فائق الدقة والمرونة لأعقد المشكلات النصية.
10. أفضل الممارسات الأكاديمية والمهنية في توثيق وصيانة كود VBA
10.1 التوثيق البرمجي والتعليقات الإيضاحية للشفرة المصدرية
يُعد التوثيق المنهجي للشيفرة المصدرية حجر الزاوية في استدامة الأنظمة البرمجية وضمان قابليتها للتطوير والتدقيق المستمر في المؤسسات الأكاديمية والمهنية. تتطلب الممارسات الهندسية الرصينة كتابة ترويسة معيارية في مقدمة كل دالة مخصصة تتضمن وصفاً دقيقاً لوظيفة الدالة، وتفصيلاً شاملاً للوسائط المدخلة وأنواعها، وبياناً بطبيعة المخرجات والقيم المرتجعة، بالإضافة إلى اسم المطور، وتاريخ الإنشاء، وتوثيق سجل التعديلات اللاحقة ورقم الإصدار.
بالتوازي مع الترويسة، يجب تضمين التعليقات السطرية الإيضاحية (Inline Comments) باستخدام علامة الفاصلة العليا ' قبل السطور البرمجية الحساسة، لاسيما تلك التي تتناول المنطق الرياضي لحساب الإزاحات وتفادي أخطاء الفهرسة. تسهم هذه التعليقات في تسريع فهم المنطق الداخلي للدالة لأي مراجع خارجي أو مدقق جودة، وتمنع عمليات التعديل العشوائية التي قد يرتكبها مطورون آخرون مستقبلاً نتيجة سوء تقدير المعادلات الدقيقة، متماشية مع المعايير القياسية لتسمية المتغيرات كاستخدام بادئات دلالية واضحة تعكس نوع المتغير ونطاقه التشغيلي.
10.2 منهجية اختبار جودة البيانات والتحقق من صحة المخرجات
تقتضي معايير ضبط الجودة البرمجية إخضاع الدوال المخصصة لمنظومة اختبار صارمة للتحقق من خلو المخرجات من الانحيازات والأخطاء الحوسبية. ترتكز هذه المنهجية على تصميم مصفوفة من حالات الاختبار (Test Cases) تغطي ثلاثة مستويات أساسية: الحالات النمطية القياسية التي تمثل البيانات المتوقعة، والحالات الحدية (Boundary Conditions) كأن تكون السلسلة خالية تماماً أو تتكون من المحرفين المحددين فقط ملتصقين ()، وأخيراً الحالات الشاذة المتطرفة (Edge Cases) كانعكاس الترتيب، أو وجود نصوص ذات أطوال تتجاوز آلاف المحارف، أو استخدام محارف يونيكود غير قياسية.
يُفضل بناء إجراء تجريبي أوتوماتيكي داخل بيئة VBA يعمل عبر تشغيل الدالة على هذه النطاقات ومقارنة النتائج بالقيم المتوقعة مسجلاً أي حيود أو إخفاق بصورة فورية. يتيح هذا النهج المنهجي في القياس والتحقق تأكيد سلامة البناء الخوارزمي للدالة، تماماً كما يتم تطبيق بروتوكولات القياس والمعايرة الصارمة في الدراسات البيوميكانيكية والسريرية لضمان سلامة الإحداثيات والمتغيرات المرصودة خوارزمياً وتجريبياً (Michoński et al., 2019).
10.3 إرشادات صيانة الشفرات لضمان التوافقية المستدامة
يتطلب النشر المؤسسي لأكواد VBA مراعاة التوافقية العابرة للمنصات والإصدارات المختلفة من حزمة مايكروسوفت أوفيس، لاسيما الفروق الجوهرية بين بيئات العمل ذات المعمارية 32 بت وتلك المعتمدة على 64 بت. على الرغم من أن دوال معالجة النصوص البسيطة غالباً ما تكون آمنة، إلا أن استدعاء دوال واجهات برمجة التطبيقات الخاصة بنظام التشغيل (Windows API) يستلزم استخدام توجيهات التجميع المشروط (Conditional Compilation) واستخدام عبارة PtrSafe لضمان استقرار العمل وعدم انهيار البرنامج.
كما يُنصح بوضع استراتيجيات واضحة لحماية الشيفرات البرمجية داخل بيئات العمل التشاركية عبر تفعيل حماية مشروع VBA بكلمة مرور (VBA Project Password) من نافذة خصائص المشروع، لمنع التعديل غير المصرح به على المنطق الحسابي من قِبل المستخدمين العاديين، مع الاحتفاظ بنسخ مصدرية غير محمية وموثقة في مستودعات الكود لإتاحة أعمال الصيانة للمطورين المعتمدين. تضمن هذه الإجراءات التشغيلية الحفاظ على سلامة تدفق البيانات ومنع تعطل سلاسل التوريد والتقارير المالية الاستراتيجية الناتجة عن أخطاء برمجية غير مقصودة في البيئات الحوسبية المعقدة (Segal, 2025).
خاتمة وتطلعات مستقبلية
استعرض هذا الدليل المتعمق الأبعاد النظرية والتطبيقية لمسألة استخراج النصوص المحصورة بين حرفين في بيئة مايكروسوفت إكسيل باستخدام لغة Visual Basic for Applications (VBA). من خلال تفكيك الخوارزميات الفهرسية المتمثلة في دالتي InStr و Mid، أظهرنا كيف يمكن للتحليل الرياضي الصارم لمعادلات الإزاحة وحساب الأبعاد أن يقي الشيفرة البرمجية من أخطاء الإزاحة بمقدار واحد وانهيارات التشغيل السلبية. كما بيّنا الدور المحوري الذي تلعبه الفحوصات المنطقية وجمل الاستثناء في تحصين الدوال المخصصة ضد البيانات المشوهة أو غير المكتملة، مما يمنحها استقراراً يتفوق بوضوح على الصيغ الحسابية التقليدية المدمجة.
مع تطور أدوات تحليل البيانات وظهور تقنيات أكثر حداثة مثل Power Query ومحركات بايثون المدمجة حديثاً في بيئة إكسيل، تبقى لغة VBA حلاً هندسياً أصيلاً وحيوياً لمعالجة البيانات اللحظية التفاعلية داخل المصنفات المحلية. إن تبني أفضل الممارسات في توثيق الأكواد، وتوسيع قدرات الفهرسة عبر التعابير النمطية، وتطبيق منهجيات التحقق الصارمة يضمن للمطورين والباحثين بناء حلول برمجية مستدامة وعالية الأداء، قادرة على تحويل السجلات النصية الخام إلى رؤى ومعارف دقيقة تسهم في دفع عجلة التطوير الأكاديمي والمؤسسي بكفاءة واقتدار.
المراجع
- Abdullah Yahya G. Alfaifi (2015). Building the Arabic Learner Corpus and a System for Arabic Error Annotation. White Rose eTheses Online (University of Leeds, The University of Sheffield, University of York). https://doi.org/10.13140/rg.2.2.32081.53608
- Akshay Kumar Jagadish, Julian Coda-Forno, Mirko Thalmann, Eric Schulz, Marcel Binz (2024). Human-like Category Learning by Injecting Ecological Priors from Large Language Models into Neural Networks. arXiv (Cornell University). https://doi.org/10.48550/arxiv.2402.01821
- Barbara Gabriella Renzi, Matthew Cotton, Giulio Napolitano, Ralf Barkemeyer (2016). Rebirth, Devastation and Sickness: Analyzing the Role of Metaphor in Media Discourses of Nuclear Power. Environmental Communication. https://doi.org/10.1080/17524032.2016.1157506
- (2022). Human-Machine Communication: Complete Volume 4. Human-Machine Communication. https://doi.org/10.30658/hmc.4
- Jakub Michoński, Marcin Witkowski, Bożena Glinkowska, Robert Sitnik, Wojciech Glinkowski (2019). Decreased Vertical Trunk Inclination Angle and Pelvic Inclination as the Result of Mid-High-Heeled Footwear on Static Posture Parameters in Asymptomatic Young Adult Women. International Journal of Environmental Research and Public Health. https://doi.org/10.3390/ijerph16224556
- Susan Gretchen Zöller (2019). Mapping Individual Subjective Values to Product Design: An Attitudes-Based Approach for User Centered Design. OPUS Repository (Kooperativer Bibliotheksverbund Berlin-Brandenburg). https://doi.org/10.25593/978-3-96147-203-1
- Tariq Segal (2025). My Digital ‘Friend’: Response Machine or Conversational Companion?. https://doi.org/10.5204/thesis.eprints.257422