VBA: كيفية سرد الملفات في مجلد

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

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

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

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

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

تستعرض هذه الدراسة التقنية الشاملة والمنهجية كافة الأبعاد الهندسية والبرمجية المتعلقة بمسألة كيفية سرد الملفات المخزنة في مجلد معين عبر لغة VBA. سنناقش بالتفصيل المعماري كائن نظام الملفات (FileSystemObject) التابع لمكتبة Scripting Runtime، ونقارنه بعمق مع دالة المسار الأصلية (Dir Function)، مستعرضين آليات التصفية المتقدمة وفق الامتدادات، وتطبيقات الخوارزميات التكرارية ذاتية الاستدعاء (Recursion) للتنقل في الهياكل الشجرية المعقدة، واستخراج البيانات الوصفية، وصولاً إلى استراتيجيات معالجة الأخطاء وتحسين الأداء الحسابي في بيئات العمل الضخمة.

1. مقدمة منهجية للتعامل مع أنظمة الملفات عبر لغة البرمجة VBA

1.1 أهمية أتمتة إدارة الملفات في بيئات العمل التحليلية

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

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

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

1.2 الأسس الهيكلية للتفاعل بين مايكروسوفت إكسيل ونظام تشغيل ويندوز

يعتمد التفاعل المتبادل بين تطبيق مايكروسوفت إكسيل ونظام تشغيل ويندوز على معمارية نموذج كائنات المكونات (Component Object Model – COM)، وهو المعيار الهندسي الذي ابتكرته مايكروسوفت لتمكين البرمجيات المختلفة من التواصل وتبادل الوظائف والبيانات. في بيئة Office، يمثل محرك VBA المضيف الرئيسي الذي ينفذ الأوامر ويتعامل مع واجهات برمجة التطبيقات (APIs) التابعة للنظام، حيث تتيح هذه البنية للغة البرمجة تجاوز حدود خلايا ورقة العمل والتفاعل المباشر مع واجهات الإدخال والإخراج (I/O Subsystems) ونظام الملفات الأساسي (NTFS أو FAT32).

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

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

2. المفاهيم البرمجية لكائن نظام الملفات (FileSystemObject)

2.1 تعريف مكتبة Microsoft Scripting Runtime ودورها

تمثل مكتبة Microsoft Scripting Runtime، المتجسدة في الملف التنفيذي المساعد scrrun.dll، إحدى الإضافات الجوهرية التي أطلقتها مايكروسوفت في أواخر تسعينيات القرن العشرين لدعم بيئة Windows Script Host وتطوير قدرات إدارة النظام. تكمن الأهمية المعمارية لهذه المكتبة في تقديمها لكائن نظام الملفات الفائق المعروف باسم FileSystemObject، والذي شكل نقلة نوعية في برمجة VBA من خلال استبدال الدوال القديمة والموروثة من لغة Basic التقليدية بنموذج برمجي كائني التوجه (Object-Oriented Programming Model) يتسم بالقوة والشمولية.

تتمثل الفروق المعمارية الأساسية في أن الطرق التقليدية للوصول إلى الملفات كانت تعتمد على استدعاءات إجرائية تتطلب معالجة يدوية دقيقة للمسارات ومقابض الملفات (File Handles)، مما كان يفتح الباب واسعاً للأخطاء المنطقية وتسرب الذاكرة. في المقابل، توفر مكتبة Scripting Runtime واجهة مجردة موحدة تدير التفاعل مع الأقراص الصلبة، والمجلدات، والملفات النصية عبر كائنات برمجية تمتلك خصائص (Properties) وأساليب (Methods) واضحة المعالم تسهل معالجة المسارات المتقلبة دون القلق بشأن تفاصيل واجهات النظام منخفضة المستوى.

يتيح استخدام Scripting.FileSystemObject للمطورين التعامل مع المسارات المحلية المعقدة والمسارات الموحدة عبر الشبكات (UNC Paths) بنفس المستوى من السهولة والاتساق البرمجي. كما يقدم الكائن دعماً متفوقاً لقراءة وكتابة تدفقات النصوص الثنائية واليونيكود، مما يجعله الخيار الأمثل والمنهجي لبناء أدوات الفهرسة المتقدمة، لا سيما في البيئات المؤسسية التي تتطلب أداءً فائقاً وشفافية برمجية تامة في إدارة محتويات المجلدات.

2.2 المقارنة بين الربط المبكر (Early Binding) والربط المتأخر (Late Binding)

عند الشروع في كتابة كود VBA للتعامل مع كائن نظام الملفات، يواجه المطور خيارين منهجيين لربط البرنامج بالمكتبة الخارجية: أسلوب الربط المبكر (Early Binding) وأسلوب الربط المتأخر (Late Binding). يرتكز الربط المبكر على إضافة مرجع صريح للمكتبة (Microsoft Scripting Runtime) عبر قائمة المراجع (References) في محرر Visual Basic، مما يسمح للمترجم بالتعرف على كافة الكائنات وأنواع البيانات والخصائص أثناء مرحلة الترجمة والتطوير التفاعلي للشيفرة البرمجية.

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

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

2.3 التسلسل الهرمي لكائنات المجلد والملف داخل بيئة الفحص

يقوم كائن FileSystemObject على بنية هيكلية شجرية تتسلسل فيها الكائنات بشكل متدرج يحاكي التكوين الفعلي لأنظمة التخزين الرقمية. عند القمة يتربع الكائن الجذر FileSystemObject، والذي تنبثق منه كائنات الأقراص (Drives)، والمجلدات (Folders)، والملفات (Files). للوصول إلى مجلد محدد، يتم استخدام الدالة البرمجية GetFolder وتمرير المسار النصي كمعامل، لتقوم الدالة بإرجاع مثيل لكائن المجلد (Folder Object) الذي يمثل المدخل الرئيسي لاستكشاف المحتويات المادية الكامنة فيه.

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

أما على مستوى كائن الملف الفردي (File Object)، فإنه يقدم للمطور واجهة غنية للوصول إلى كافة الخصائص الوصفية للمستند الرقمي. تتضمن هذه الخصائص: اسم الملف Name، ومساره المطلق Path، وحجمه الفيزيائي الدقيق بالبايت Size، وتاريخ ووقت إنشائه DateCreated، وتاريخ ووقت آخر تعديل طرأ عليه DateLastModified، إضافة إلى سمات الملف Attributes التي توضح ما إذا كان الملف للقراءة فقط أو مخفياً أو مصنفاً كملف نظام. هذا التسلسل الهرمي المنظم يمنح كود VBA مرونة غير محدودة في فهرسة وتحليل منظومة الملفات بأعلى معايير الدقة الرياضية والبرمجية.

3. التجهيز التقني وبيئة العمل في محرر Visual Basic for Applications

3.1 تهيئة واجهة المحرر وإعداد الموديول البرمجي

تبدأ الخطوة العملية الأولى في بناء أدوات الأتمتة بالولوج الصحيح والمنظم إلى بيئة التطوير المتكاملة الخاصة بلغة VBA المضمنة داخل مايكروسوفت إكسيل. يتم ذلك من خلال الضغط على الاختصار اللوحي القياسي Alt + F11، أو عبر تفعيل تبويب المطور (Developer Tab) من خيارات شريط الأدوات الرئيسي في إكسيل ثم النقر على أيقونة Visual Basic. تفتح هذه الواجهة المتخصصة نافذة إدارة المشروع (Project Explorer) ونافذة الخصائص (Properties Window)، اللتين تمثلان منصة التحكم المعمارية بكامل التطبيق الماكروني.

لتفادي كتابة الأكواد في النطاقات المرتبطة بأوراق العمل الفردية (Sheet Modules) أو داخل مصنف العمل نفسه (ThisWorkbook) دون مبرر هندسي، ينبغي دائماً إدراج وحدة برمجية قياسية جديدة من النوع Standard Module عبر النقر على قائمة Insert واختيار Module. يضمن هذا الإجراء استقلالية الإجراءات الفرعية والدوال المكتوبة، ويتيح إمكانية استدعائها والوصول إليها عبر مختلف أوراق العمل، فضلًا عن تسهيل عملية تصدير واستيراد الكود مستقبلاً بين المشاريع المختلفة بهدف إعادة الاستخدام البرمجي.

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

3.2 تعريف المتغيرات وتخصيص الذاكرة البرمجية

يتطلب التصميم البرمجي الرصين اختياراً دقيقاً لأنواع البيانات المخصصة للمتغيرات وفقاً لطبيعة المهام وحجم البيانات المتوقع فهرستها. فعند تعريف متغيرات العدادات المخصصة للإشارة إلى أرقام الصفوف في ورقة العمل، يجب تجنب استخدام النوع Integer الذي تقتصر طاقته الاستيعابية التاريخية في بيئة 16-bit و32-bit على القيمة القصوى 32,767؛ حيث يؤدي تجاوز هذا الرقم عند سرد مجلدات تحتوي على عشرات الآلاف من الملفات إلى حدوث خطأ الفيض الحسابي (Overflow Error). بدلاً من ذلك، يتحتم استخدام النوع Long الذي يتيح التعامل مع قيم صحيحة تفوق ملياري صف، وهو ما يتطابق مع حدود جداول إكسيل الحديثة التي تتسع لـ 1,048,576 صفاً.

أما فيما يخص المتغيرات الكائنية، فيتم تعريفها باستخدام الكلمة المفتاحية Dim مقترنة بنوع الكائن المحدد في حال الربط المبكر، مثل Dim fso As Scripting.FileSystemObject وDim fld As Scripting.Folder وDim fil As Scripting.File، أو ككائنات عامة عبر Dim fso As Object في حال الربط المتأخر. تخصص هذه المتغيرات مساحات في جدول المؤشرات داخل الذاكرة تشير إلى عناوين الكائنات الفعلية التي سيتم إنشاؤها في مساحة التخزين الديناميكية (Heap Memory).

وتماشياً مع أفضل الممارسات البرمجية في إدارة الموارد الحوسبية، ينبغي على المطور تحرير هذه المتغيرات الكائنية فور الانتهاء من العمليات المطلوبة وقبل خروج الإجراء من نطاق التنفيذ. يتم ذلك بإسناد القيمة الخاصة Nothing إليها (مثل Set fil = Nothing وSet fld = Nothing وSet fso = Nothing)، وهو إجراء حيوي يسمح لجامع المهملات (Garbage Collector) التابع لنظام التشغيل بتحرير المقابض ومساحات الذاكرة المحجوزة فوراً، مما يمنع ظاهرة تسرب الذاكرة (Memory Leakage) ويضمن استمرارية كفاءة واستقرار بيئة العمل حتى مع تنفيذ عمليات الفهرسة لمجلدات عملاقة وبشكل متكرر.

4. الطريقة الأولى: سرد كافة الملفات داخل مجلد محدد تفصيلياً

4.1 التحليل البنيوي للكود البرمجي الأساسي لقراءة المسار

يعتمد السرد البنيوي للملفات المخزنة داخل مجلد محدد على سلسلة من الخطوات المنطقية المتتابعة بدقة. تبدأ العملية بتهيئة بيئة التنفيذ واستدعاء دالة CreateObject("Scripting.FileSystemObject") لإنشاء مثيل تشغيلي نشط لكائن نظام الملفات. يتم إسناد هذا المثيل إلى متغير كائني باستخدام الكلمة المفتاحية Set. تمثل هذه الخطوة التأسيسية إشارة البدء التي تفتح قنوات الاتصال بين تطبيق إكسيل والمكتبات التشغيلية لنظام الملفات في ويندوز.

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

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

4.2 تنفيذ حلقة التكرار (For Each) لاستخراج الأسماء

عقب إتمام الربط مع كائن المجلد، تبرز حلقة التكرار البرمجية For Each...In...Next كأداة هندسية مثالية لمعالجة مجموعة الملفات Files Collection التابعة له. تتفوق هذه الحلقة التكرارية على الحلقات العددية التقليدية القائمة على الفهارس الترتيبية (For i = 1 To N)، لكون مجموعة الملفات في كائن FileSystemObject لا تدعم بطبيعتها الفهرسة الرقمية العشوائية المباشرة، بل تتبع بنية القوائم المتصلة التي تتطلب التنقل التتابعي من عنصر إلى العنصر الذي يليه.

داخل جسم الحلقة التكرارية، يتم إسناد كل ملف على حدة إلى متغير فرعي من النوع الكائني المخصص للملفات. ومن خلال هذا المتغير، يستطيع الكود قراءة خاصية الاسم fil.Name وكتابتها مباشرة في خلايا ورقة العمل النشطة باستخدام الخاصية البرمجية Cells(rowIndex, columnIndex).Value. تلعب إدارة مؤشر الصف (Row Index Counter) دوراً محورياً في هذه المرحلة؛ إذ يتعين زيادته بمقدار رقم صحيح واحد مع كل تكرار لضمان تدفق أسماء الملفات بشكل رأسي متسلسل دون الكتابة فوق البيانات المدخلة في التكرارات السابقة.

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

4.3 دراسة حالة عملية: فهرسة المجلد الافتراضي current_data

لتجسيد هذه الآلية البرمجية في واقع تطبيقي ملموس، نفترض وجود مجلد تحليلي تجريبي باسم C:current_data، يحتوي على حزمة متنوعة من الملفات ذات الامتدادات المتعددة، مثل جداول البيانات المجمعة بصيغة xlsx، والنصوص المجدولة csv، والمستندات النصية docx، وتقارير العروض التقديمية pptx. تتمثل مهمة الإجراء البرمجي في مسح هذا المجلد وإدراج قائمة وثائقية كاملة بأسماء كافة الملفات في العمود الأول من ورقة العمل الحالية، ابتداءً من الصف الثاني لتخصيص الصف الأول للعناوين.

يبدأ الكود بمسح محتويات ورقة العمل لضمان نظافة بيئة العرض، ثم يكتب ترويسة العمود في الخلية A1 بالقيمة “اسم الملف”. يبدأ مؤشر الصفوف بالقيمة 2، ويباشر كائن FileSystemObject الدوران عبر ملفات current_data. مع كل تكرار، يُدرج اسم الملف متضمناً امتداده (مثل financial_report_2023.xlsx أو sensor_readings.csv) في الخلية المقابلة لمؤشر الصف الحالي، ويتبع ذلك فوراً زيادة المتغير الرقمي بمقدار 1.

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

5. الطريقة الثانية: تصفية وسرد الملفات وفق الامتدادات المحددة

5.1 منطق الفرز المشروط باستخدام الجملة الشرطية If

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

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

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

5.2 استخراج وتقييم امتداد الملف عبر دالة Right البرمجية

تعد دالة الاقتطاع النصي Right إحدى أقدم الوسائل البرمجية الشائعة في لغة VBA لعزل امتداد الملف وتقييمه. تقوم هذه الدالة باستخلاص عدد محدد من الأحرف الواقعة في أقصى الجانب الأيمن من السلسلة النصية لاسم الملف. فإذا كان الهدف هو تصفية مصنفات إكسيل الحديثة، يتم استخدام صياغة شرطية تفحص ما إذا كانت الأحرف الأربعة الأخيرة من اسم الملف تعادل الصيغة النصية المطلوبة عبر فحص رياضي مثل: If LCase(Right(fil.Name, 4)) = "xlsx" Then.

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

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

5.3 البدائل المتقدمة للتعرف على امتداد الملف بدقة

يقدم كائن FileSystemObject حلاً برمجياً متفوقاً يتفادى تماماً سلبيات الاقتطاع اليدوي، وذلك من خلال الأسلوب البرمجي المدمج المسمى GetExtensionName. تستقبل هذه الدالة مسار الملف أو اسمه الكامل كمعامل نصي، وتقوم تلقائياً بتحليله برمجياً واستخراج الامتداد بدقة بالغة، مع معالجة مرنة للنقاط المتعددة التي قد تتواجد داخل الاسم التجاري للمستند (مثل data.backup.2023.xlsx)، حيث تقوم الدالة باقتطاع النص الواقع بعد النقطة الأخيرة تحديداً.

تتمثل القوة التقنية لدالة GetExtensionName في قدرتها على تجريد الامتداد وتوحيده بغض النظر عن طوله، مما يتيح إجراء اختبارات شرطية متعددة الخيارات بسهولة ووضوح عبر تركيب Select Case أو الجمل الشرطية المركبة. يتيح ذلك فحص وتصنيف ملفات ذات صيغ متنوعة في إجراء واحد، مثل تجميع ملفات xlsx وxlsm وxlsb وcsv تحت مظلة الملفات التحليلية، وتوجيه كل نوع إلى جدول مخصص أو إخضاعه لمعالجة مختلفة دون أي تضارب.

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

6. المقارنة التقنية بين كائن FileSystemObject ودالة Dir البرمجية

6.1 آلية عمل دالة Dir التقليدية في بيئة VBA

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

تعتمد آلية عمل دالة Dir على نمط تنفيذي ثنائي المراحل؛ ففي المرحلة الأولى، يتم استدعاء الدالة مع تمرير مسار المجلد مصحوباً بنمط المحارف البديلة (Wildcards)، مثل Dir("C:Data*.xlsx")، لتقوم الدالة فوراً بإرجاع اسم أول ملف يطابق هذا النمط المحدد. بعد ذلك، ولجلب بقية الملفات المتطابقة في المجلد تباعاً، يتم استدعاء الدالة ذاتها داخل حلقة تكرارية من النوع Do While fileName <> "" دون تمرير أي معاملات (أي مجرد fileName = Dir())، حيث تستمر الدالة في تقديم أسماء الملفات اللاحقة واحداً تلو الآخر حتى استنفاد كافة المحتويات وإرجاع سلسلة نصية فارغة.

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

6.2 التحليل المقارن: المزايا والعيوب التشغيلية

لتقييم الاختيار بين كائن FileSystemObject ودالة Dir من منظور هندسي رصين، لا بد من تفكيك خصائص كل منهما عبر جدول مقارنة شامل يوضح الفروق الجوهرية في الأداء والإمكانيات الوظيفية وسهولة التطوير والصيانة على المدى الطويل:

  • الأداء والسرعة الحسابية: تتفوق دالة Dir تفوقاً طفيفاً في سرعة القراءة الخام للمجلدات المفردة البسيطة، نظراً لارتباطها المباشر منخفض المستوى بواجهات نظام التشغيل، في حين يتطلب FileSystemObject إنشاء كائنات برمجية متعددة في الذاكرة (Instantiating Objects)، مما يرتب كلفة حسابية إضافية متواضعة لا تكاد تلاحظ إلا عند مسح ملايين الملفات.
  • دعم المسارات الشبكية والأحرف الدولية: يتميز FileSystemObject بقدرة فائقة وموثوقية مطلقة في التعامل مع مسارات الشبكة المعقدة (UNC Paths) والمسارات الطويلة التي تتضمن أحرفاً من لغات متعددة (Unicode)، في حين تواجه دالة Dir قيوداً مزمنة قد تؤدي إلى تشويه المحارف غير اللاتينية أو فشل قراءة المسارات غير المحلية تحت بعض إعدادات النظام الإقليمية.
  • التعامل مع البيانات الوصفية (Metadata): يوفر FileSystemObject وصولاً سلساً وفورياً لكافة خصائص الملفات (الحجم، تاريخ الإنشاء، تاريخ التعديل) عبر الكائن المباشر، بينما تقتصر دالة Dir على إرجاع الاسم فقط؛ مما يجبر المطور على استدعاء دوال إضافية مستقلة مثل FileLen وFileDateTime للحصول على تلك البيانات، وهو ما يلغي تفوقها في السرعة عند الحاجة لتلك الخصائص.
  • التعامل مع الاستدعاء الذاتي (Recursion): تنهار دالة Dir تماماً عند محاولة استدعائها بشكل متكرر ذاتي لفحص المجلدات المتداخلة؛ نظراً لأنها تحافظ على مؤشر داخلي وحيد (Single Internal Pointer) تتم إعادة ضبطه ومسحه عند أي استدعاء فرعي داخل الحلقة، مما يستلزم تخزين المسارات مؤقتاً في مصفوفات. بينما يتعامل FileSystemObject مع التفرعات الشجرية بأعلى درجات الانسيابية والأناقة المعمارية.

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

7. سرد محتويات المجلدات الفرعية باستخدام تقنية الاستدعاء الذاتي (Recursion)

7.1 مفهوم التكرار الذاتي في معالجة الهياكل الشجرية

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

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

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

7.2 بناء إجراء فرعي متكرر لفهرسة كامل الشجرة الهيكلية للملفات

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

يستقبل الإجراء المتكرر كائناً يمثل المجلد المستهدف ByVal currentFolder As Scripting.Folder، ويمتلك حق الوصول إلى مؤشر الصفوف المرجعي العام. تبدأ الخوارزمية داخل هذا الإجراء بتنفيذ حلقة تكرار For Each fil In currentFolder.Files لتدوين كافة الملفات المتواجدة في هذا المستوى المباشر، وتوثيق خصائصها ومساراتها الكاملة في خلايا ورقة العمل. يضمن هذا الإجراء أرشفة الطبقة الحالية قبل التوغل في المستويات الأكثر عمقاً.

بمجرد انتهاء حلقة الملفات، يشرع الإجراء في فحص مجموعة المجلدات الفرعية عبر حلقة ثانية من النوع For Each subFolder In currentFolder.SubFolders. وداخل هذه الحلقة، يقوم الإجراء بالاستدعاء الذاتي الفعلي لنفسه من خلال تمرير المتغير subFolder كمعامل للإجراء: Call RecursiveListFiles(subFolder). تتكرر هذه الدورة ديناميكياً لكافة الطبقات المتفرعة مهما بلغ عمقها، مع استمرار مؤشر الصفوف في الزيادة التراكمية، وعندما يصل المسار إلى مجلد فرعي عقيم يخلو من مجلدات أخرى، تنتهي الحلقة التكرارية وتعود السيطرة تلقائياً إلى المستوى الأعلى لمواصلة الفحص، مما يضمن في النهاية مسحاً شجرياً شاملاً لكافة محتويات القرص المستهدف دون إغفال أي ملف أو مسار.

8. استخراج البيانات الوصفية المتقدمة للملفات وتوثيقها

8.1 استخراج الخصائص الزمنية والحجمية للملفات

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

في مقدمة هذه البيانات تأتي خاصية الحجم fil.Size، والتي تقوم باسترجاع الحجم الفيزيائي الدقيق للملف مقدراً بوحدة البايت (Bytes). ولإضفاء طابع منهجي وأكاديمي على جدول المخرجات، يتم تحويل هذا الرقم برمجياً عبر عمليات قسمة حسابية بسيطة على القيمة الثنائية القياسية 1024 للحصول على الحجم بوحدة الكيلوبايت (KB)، أو على القيمة 1,048,576 (1024 × 1024) للحصول عليه بالميجابايت (MB)، مع تطبيق دالة التقريب Round لتنسيق الرقم عشرياً بما يلائم العرض والتحليل الإحصائي المقارن.

كما تكتسب الخصائص الزمنية أهمية بالغة في دراسات التتبع والتدقيق؛ حيث تقدم خاصية fil.DateCreated الطابع الزمني الدقيق للحظة إنشاء الملف الأولية على وسيط التخزين، بينما تعكس خاصية fil.DateLastModified تاريخ ووقت آخر تغيير وتعديل جرى على محتوى الملف. يتم تدوين هذه القيم في خلايا ورقة العمل وتنسيقها زمنياً بواسطة خصائص التنسيق الرقمي (NumberFormat) في إكسيل. ويضاف إلى ذلك إمكانية استخراج نوع الملف المسجل في النظام عبر خاصية fil.Type، والتي تعطي وصفاً نصياً لطبيعة الوثيقة (مثل “Microsoft Excel Worksheet” أو “Text Document”)، مما يوفر رؤية توثيقية ثلاثية الأبعاد تشمل الحجم والزمن والهوية البرمجية.

8.2 توليد الروابط التشعبية للملفات مباشرة في إكسيل

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

تتم إضافة الرابط التشعبي برمجياً عبر استدعاء الأسلوب المنهجي Hyperlinks.Add التابع لكائن ورقة العمل ActiveSheet أو كائن النطاق Range. يستقبل هذا الأسلوب مجموعة من المعاملات المحورية: معامل الموضع Anchor لتحديد الخلية التي ستحتضن الرابط، ومعامل العنوان Address الذي يتلقى المسار الكامل والمطلق للملف المخزن في خاصية fil.Path، بالإضافة إلى معامل النص المعروض TextToDisplay الذي يحدد التسمية التفاعلية التي يراها المستخدم، مثل اسم الملف المجرد fil.Name.

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

9. معالجة الأخطاء البرمجية واستراتيجيات تحسين الأداء

9.1 إدارة استثناءات التشغيل وأخطاء صلاحيات الوصول

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

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

أما بالنسبة للأخطاء غير المتوقعة التي تقع أثناء التنفيذ الميداني—مثل مصادفة مجلد نظام محمي يولد خطأ رفض الوصول “Permission Denied” (الخطأ رقم 70)—فيتحتم بناء هيكل متقدم لمعالجة الأخطاء باستخدام العبارة البرمجية On Error GoTo ErrorHandler. يقوم هذا التركيب بتحويل مسار التنفيذ عند تعثر أي سطر برمجي إلى كتلة معالجة مخصصة تقوم بقراءة كائن الخطأ Err، وتوثيق رقمه ووصفه في سجل مخصص (Log File) أو ورقة أخطاء مستقلة، ثم استئناف البرنامج للمسارات التالية عبر Resume Next دون أن ينهار التطبيق بالكامل. يمنح هذا الأسلوب الدفاعي الأداة البرمجية صلابة هيكلية تجعلها قادرة على الصمود في البيئات التقنية المتباينة والمعقدة.

9.2 تقنيات تسريع تنفيذ الأكواد في المجلدات الضخمة

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

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

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

بالإضافة إلى تلك التدابير، فإن الاستراتيجية المتقدمة الأقوى لمعالجة قواعد الملفات العملاقة تتمثل في الاستغناء التام عن الكتابة الخلوية المباشرة (Cell-by-Cell Writing)، والاستعاضة عنها بتخزين بيانات الملفات المفهرسة داخل مصفوفة برمجية ديناميكية في الذاكرة العشوائية (In-Memory Dynamic Array). وبعد استكمال حلقة التكرار وتعبئة المصفوفة بكامل سجلات الملفات، يقوم الكود بصب محتويات المصفوفة دفعة واحدة في نطاق الخلايا المستهدف عبر سطر برمجي وحيد مثل: Range("A2").Resize(UBound(dataArray, 1), UBound(dataArray, 2)).Value = dataArray. يقلص هذا الأسلوب المتقدم زمن التنفيذ بنسبة تتجاوز 90%، مما يحول مهمة كانت تستغرق دقائق طويلة إلى عملية فائقة السرعة تنجز في ثوانٍ معدودة.

10. التطبيقات الميدانية وحالات الاستخدام في البيئات المهنية

10.1 بناء أدوات الأرشفة والتدقيق الرقمي للبيانات

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

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

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

10.2 أتمتة عمليات دمج وتوحيد التقارير المتفرقة

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

في الأبحاث الأكاديمية والنمذجة الحسابية المعاصرة، تبرز الأتمتة البرمجية كعنصر حاسم في إدارة البيانات التجريبية؛ حيث تتكامل البيئات البرمجية المتعددة لمعالجة المدخلات الضخمة وضمان موثوقية النتائج ومحاكاتها بدقة واضحة (Waade et al., 2022). إن تطوير مثل هذه النظم المتكاملة يؤكد أن التحكم في تدفقات الملفات عبر البرمجة المنهجية يمثل الأساس الذي تقوم عليه كافة مراحل التحليل الإحصائي المتقدم ومحاكاة النماذج الواقعية.

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

خاتمة

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

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

المراجع

Waade, P. T., Enevoldsen, K., Vermillet, A.-Q., Simonsen, A., & Fusaroli, R. (2022). Introducing tomsup: Theory of mind simulations using Python. Behavior Research Methods. https://doi.org/10.3758/s13428-022-01827-2

★

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

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

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

looti, M. (2026, أكتوبر 22). VBA: كيفية سرد الملفات في مجلد. عرب سايكلوجي. https://arabpsychology.com/statistics/vba-how-to-list-files-in-folder/
looti, Mohammed. “VBA: كيفية سرد الملفات في مجلد.” عرب سايكلوجي, 22 أكتوبر 2026, https://arabpsychology.com/statistics/vba-how-to-list-files-in-folder/.
looti, Mohammed. “VBA: كيفية سرد الملفات في مجلد.” عرب سايكلوجي. أكتوبر 22, 2026. https://arabpsychology.com/statistics/vba-how-to-list-files-in-folder/.