شهدت بيئة المعالجة الرقمية وجداول البيانات في برنامج مايكروسوفت إكسيل (Microsoft Excel) تحولاً بنيوياً جذرياً مع إطلاق محرك المصفوفات الديناميكية؛ إذ انتقلت المنظومة الحسابية من النماذج الإجرائية المقيدة بنطاق الخلية الواحدة وصيغ الصفيف المعقدة إلى فضاء المعالجة الموجهة المتدفقة تلقائياً عبر مساحات العمل. وفي طليعة هذا التطور المعماري، برزت أدوات التحويل وإعادة التشكيل الهيكلي، التي أتاحت للمحللين والمطورين تجاوز القيود التاريخية في توحيد السجلات المتباينة دون الحاجة إلى كتابة نصوص برمجية مخصصة أو استخدام واجهات الاستعلام الخارجية.
ومع ذلك، واجه التطبيق العملي لهذه التقنيات المعاصرة، وتحديداً عند تجميع النطاقات المنفصلة عمودياً، تحدياً منطقياً وإحصائياً متكرراً يتمثل في كيفية تعاطي المحرك الحسابي مع الفجوات الهيكلية والخلايا غير المأهولة بالبيانات. فالطبيعة الصارمة لعمليات التكديس الرقمي تفترض تماسك السلاسل، مما يجعل وجود الفراغات سبباً رئيساً في توليد تشوهات بصرية وحسابية تؤثر سلباً على موثوقية التقارير ونزاهة المقاييس الإحصائية المعيارية.
يسعى هذا التقرير الأكاديمي الشامل إلى تفكيك الأسس الهندسية والرياضية لاستخدام دالة التكديس الرأسي المتقدمة، مع التركيز المعمق على منهجيات عزل الخلايا الفارغة وإسقاطها وفق أفضل الممارسات الحوسبية، وموازنة الكفاءة التشغيلية للأجهزة عبر توظيف تقنيات المتغيرات المحلية والتصفية المنطقية المتقدمة.
1. مقدمة تأصيلية لدالة VSTACK في بيئة إكسيل المعاصرة
1.1 التطور الهيكلي لمصفوفات إكسيل الديناميكية
يمثل تدشين محرك المصفوفات الديناميكية (Dynamic Arrays Engine) في برنامج مايكروسوفت إكسيل نقطة تحول مفصلية في هندسة برمجيات الجداول الحسابية. تاريخياً، كان التعامل مع العمليات متعددة العناصر يتطلب صياغات صفيف تقليدية تستدعي الضغط المتزامن على مفاتيح التحكم والتبديل والإدخال (Ctrl + Shift + Enter)، وهي بيئة عمل اتسمت بالصلابة الهيكلية وصعوبة التعديل واستهلاكها المرتفع للموارد المعالجة. أزال المحرك الحديث هذا الحاجز الإجرائي تماماً، حيث باتت الصيغ الحسابية تُدرك بطبيعتها ككائنات مصفوفية قادرة على تقييم مجموعات كاملة من البيانات وتمريرها وإرجاعها في هيئة مساحات متدفقة (Spill Ranges) تتمدد وتنكمش تلقائياً تبعاً لحجم المدخلات دون أي تدخل يدوي إضافي.
في إطار هذه المعمارية المحدثة، أعلنت شركة مايكروسوفت في مطلع عام 2022 عن حزمة من دوال معالجة وتشكيل المصفوفات، وتحديداً ضمن إصدارات Microsoft 365، وكان في مقدمتها دالة التكديس الرأسي المعروفة اختصاراً باسم VSTACK. تتبوأ هذه الدالة موقعاً استراتيجياً بين دوال الربط الهيكلي، حيث تتكامل بصورة أصلية مع دوال التحويل الحديثة مثل CHOOSEROWS وHSTACK وTOCOL، لتشكل مجتمعة منظومة متكاملة لإدارة تدفق البيانات وتجميعها دون اللجوء إلى تقنيات الدمج التقليدية أو كتابة إجراءات معقدة بلغة Visual Basic for Applications (VBA).
1.2 البنية التركيبية والمحددات الرياضية لدالة VSTACK
تتأسس الدالة VSTACK رياضياً على مبدأ الربط التتابعي للمتجهات والمصفوفات ذات البعد الواحد أو البعدين في اتجاه رأسي موحد. وتأخذ الصياغة العامة للدالة الشكل القياسي التالي:
=VSTACK(array1, [array2], ...)
حيث تمثل الوسيطة الأولى مصفوفة البيانات الإلزامية التي تشكل قاعدة التكديس، وتليها وسائط مصفوفية اختيارية متتابعة تُلحق تباعاً أسفل المصفوفة السابقة. من المنظور الرياضي، إذا كانت المصفوفة الأولى ذات أبعاد (m × k) والمصفوفة الثانية ذات أبعاد (n × k)، فإن ناتج تطبيق الدالة يؤول إلى مصفوفة موحدة ذات أبعاد ((m + n) × k). وتتطلب هذه العملية مطابقة قطعية في عدد الأعمدة بين المصفوفات المدخلة لتجنب حدوث فجوات تركيبية في بنية السجلات المدمجة، وهو ما يحققه المحرك تلقائياً بملء أي نقص في الأبعاد بقيم الخطأ غير المتاحة (#N/A) إذا تباينت أطوال الأعمدة، تأكيداً على الحفاظ على استقامة الشكل المستطيل للمصفوفة الناتجة.
تتميز الدالة بسرعة استجابة عالية وخفة فائقة في الذاكرة مقارنة بالمعادلات التقليدية، إلا أن كفاءتها الحسابية ترتبط ارتباطاً وثيقاً بعدد الخلايا المرجعية وتكرار عمليات إعادة التقييم المتطاير (Volatile Calculation) داخل المصنف، مما يفرض ضرورة فهم محدداتها التشغيلية عند التعامل مع قواعد البيانات المؤسسية ذات السجلات المليونية.
1.3 إشكالية الخلايا الفارغة والتحويل القسري إلى أصفار
على النقيض من بعض الدوال النصية المستحدثة مثل TEXTJOIN التي تتضمن وسيطة صريحة ومباشرة لتجاهل الخلايا الفارغة، تفتقر دالة VSTACK إلى أي وسيطة منطقية مدمجة تتيح لها إسقاط الصفوف أو الحقول الشاغرة تلقائياً. يرجع ذلك إلى البنية الرياضية الصارمة للدالة، والتي صُممت لمطابقة ومحاذاة النطاقات بالكامل كما هي دون إجراء تعديلات على المحتوى أو تصفية انتقائية أثناء مرحلة التجميع الأولي.
يترتب على هذا التصميم الهندسي سلوك افتراضي صريح من محرك إكسيل للمصفوفات الديناميكية؛ فعندما تقرأ الدالة خلية فارغة من النطاق المصدر وتسكبها ضمن نطاق الإخراج على ورقة العمل، يقوم المحرك تلقائياً بإجراء تحويل قسري للأنماط (Type Coercion)، محولاً الفراغ المطلق (Empty/Null) إلى قيمة عددية صفرية (0). يُحدث هذا السلوك تشوهاً منهجياً جسيماً في بنية السلاسل الإحصائية، إذ تتبدل طبيعة الخلية من “غياب للبيان” إلى “بيان عددي ذي دلالة كمية”، مما يستدعي تدخلاً خوارزمياً لعزل هذه الأصفار المصطنعة وضمان نزاهة المصفوفة الناتجة.
2. التوصيف المنهجي لسلوك دالة VSTACK مع البيانات المفقودة
2.1 التفرقة المفاهيمية بين الفراغ والقيمة الصفرية
يقتضي التحليل الإحصائي الرصين التمييز الصارم بين مفهوم الفراغ الدال على غياب القياس (Missing Data / Null State) ومفهوم الصفر كقيمة عددية مطلقة تقع على خط الأعداد وتعبر عن كمية منعدمة مدروسة. إن الخلط الحسابي بين هاتين الحالتين يقود بالضرورة إلى انحيازات منهجية غير مقبولة؛ فعلى سبيل المثال، يؤدي احتساب الخلايا الشاغرة كأصفار داخل دوال النزعة المركزية مثل AVERAGE إلى تضخيم المقام (حجم العينة) بقيم مصطنعة، مما يتسبب في هبوط زائف للمتوسط الحسابي وانحراف غير مبرر في مقاييس التشتت كالانحراف المعياري والتباين.
أما في التطبيقات المالية والمحاسبية، فإن تحول حقول التكلفة أو المبيعات الشاغرة إلى أصفار عددية صريحة قد يُفسر خطأً بأن العمليات قد تمت بقيمة منعدمة، بدلاً من إدراكها كحالات تأخر في التسجيل أو عدم انطباق للشرط، الأمر الذي يترتب عليه تقويض موثوقية لوحات المؤشرات الإدارية وتقارير التدقيق المالي الموحدة.
2.2 آلية توليد الصفر الافتراضي في المصفوفات العمودية
تنبثق آلية توليد الأصفار من الطريقة التي يدير بها محرك الحساب الداخلي المؤشرات المرجعية للذاكرة؛ فعند استدعاء نطاق مفتوح مثل (A2:B100) وكان النطاق المأهول فعلياً بالبيانات يمتد فقط حتى الصف العشرين، فإن الدالة VSTACK تتعامل مع كامل النطاق الموجه كمدخلات نظامية. وخلال مرحلة بناء المصفوفة المتدفقة، تُترجم الروابط المرجعية التي لا تشير إلى قيمة مخزنة على أنها خلايا خالية ذات مؤشر منطقي فارغ.
وعند إخراج المصفوفة النهائية إلى خلايا الجدول، يجبر النظام هذه القيم الخالية على المرور عبر مرشح العرض القياسي لإكسيل، والذي يعيد القيمة الصفرية بدلاً من ترك الخلية خالية، لتفادي الانهيار في تناسق الشبكة البرمجية. هذا السلوك يضاعف حجم نطاق التدفق الديناميكي بمئات الصفوف غير المفيدة، مما يُثقل واجهة الاستخدام ويشوش القراءة البصرية للبيانات.

2.3 متطلبات التحليل المتقدم للبيانات المستخرجة
تتطلب البيئات المتقدمة للتحليل وإعداد النماذج المؤسسية خروج البيانات من مرحلة التجميع بحالة نقية تماماً وجاهزة للاستهلاك المباشر دون الحاجة إلى معالجات لاحقة. إن تدفق مصفوفات تتضمن أصفاراً زائفة أو صفوفاً شاغرة يعيق عمل أدوات ذكاء الأعمال المدمجة، ويمنع إنشاء مخططات بيانية تفاعلية دقيقة، إذ تسجل الرسوم البيانية هبوطاً مفاجئاً إلى مستوى الصفر يشوه المنحنيات الزمنية ويضلل صناع القرار.
علاوة على ذلك، فإن تنقية المخرجات التكديسية من الفراغات والأصفار تسهم بصورة جوهرية في تقليص استهلاك ذاكرة التخزين المؤقت، مما يحسن من سرعة استجابة الصيغ التابعة التي تعتمد على نتائج المصفوفة كمراجع لها، مثل دوال البحث والفرز والتلخيص الحسابي المتقدم.
3. الحل القياسي: دمج دالتي VSTACK وFILTER لمعالجة الفراغات
3.1 الأسس المنطقية لعمل دالة FILTER في المصفوفات
تُعد دالة FILTER إحدى الركائز الأكثر أهمية ضمن بيئة المصفوفات الديناميكية؛ حيث تختص باستخلاص مجموعة فرعية من مصفوفة معينة بناءً على استيفاء معايير بوليانية (Boolean Criteria) محددة مسبقاً. تأتي الدالة بالصيغة القياسية:
=FILTER(array, include, [if_empty])
ترتكز المعالجة المنطقية للدالة على تقييم الوسيطة الثانية (include)، والتي يجب أن تتكون من متجهة بوليانية تتطابق في بُعدها الرأسي مع عدد صفوف المصفوفة المراد تصفيتها. تستند هذه المتجهة إلى قيم الصواب والخطأ (TRUE / FALSE)، بحيث يحتفظ المحرك بالصفوف المقابلة للقيمة TRUE ويقتطع ويسقط بالكامل كافة الصفوف المقابلة للقيمة FALSE. وتوفر الوسيطة الاختيارية الثالثة (if_empty) أماناً تشغيلياً حاسماً عبر تحديد القيمة البديلة المرتجعة في حال لم يستوفِ أي سجل في المصفوفة المعايير المحددة، مما يقضي على ظهور خطأ الحساب الفراغي الشهير #CALC!.
3.2 بناء الصيغة المباشرة للتكديس مع الاستبعاد المنطقي
لمعالجة معضلة الفراغات المصاحبة للتكديس الرأسي، يتم تشكيل صياغة مدمجة تتداخل فيها دالة VSTACK داخل دالة FILTER. وتتمثل المقاربة الأساسية في جعل مصفوفة VSTACK هي الوسيطة المدخلة الأولى لـ FILTER، ثم إعادة استدعاء دالة VSTACK نفسها ضمن شرط التصفية (include) بالاقتران مع معامل عدم المساواة للسلاسل النصية الفارغة:
=FILTER(VSTACK(A2:B10, D2:E10), INDEX(VSTACK(A2:B10, D2:E10), , 1) <> "")
في هذه الصياغة المركبة، تقوم دالة INDEX باستخلاص العمود الأول تحديداً من المصفوفة المكدسة لاختبار ما إذا كان محتواه يخالف الفراغ النصي (<> “”). يسير مسار التنفيذ عبر تجميع النطاقين أولاً في الذاكرة، ثم تطبيق الفحص المنطقي سطراً بسطر على العمود الدليلي، لتعيد التصفية فقط السجلات التي تشتمل على بيانات فعلية، متجاهلة أي صف كانت فيه الخلية الدليلية فارغة، وبذلك تتلاشى الصفوف التي كانت ستتحول قسرياً إلى أصفار.
3.3 المآخذ التشغيلية للتكرار الحسابي في الصيغ المباشرة
على الرغم من فاعلية الصياغة المباشرة السابقة وقدرتها على استبعاد الفراغات بنجاح، إلا أنها تعاني من مثالب هيكلية بارزة تتعلق بهندسة الأداء. العيب الجوهري يكمن في الازدواج الحسابي الإجباري؛ إذ يُلزم المحرك بحساب وتقييم تركيبة VSTACK(A2:B10, D2:E10) مرتين كاملتين ومستقلتين: المرة الأولى لتوليد المصفوفة المصدر، والمرة الثانية داخل وسيطة التحقق المنطقي لتوليد متجهة الفرز.
في جداول البيانات الصغيرة، قد لا يظهر فارق ملحوظ في الأداء، ولكن عند التوسع وتطبيق الدالة على آلاف السجلات أو تضمين نطاقات متفرقة متعددة، يتضاعف استهلاك الذاكرة وتتراجع سرعة إعادة الحساب بشكل دراماتيكي. يُضاف إلى ذلك التعقيد البصري للصيغة وصعوبة قراءتها وصيانتها لاحقاً من قِبل مدققي النماذج المالية، حيث يفتح التكرار اليدوي للمجالات الباب واسعاً أمام الأخطاء التحريرية عند تحديث النطاقات المصدرية.
4. تحسين الكفاءة البرمجية عبر دالة LET المتقدمة
4.1 مفهوم المتغيرات المحلية في بيئة الجداول الحسابية
استجابةً لتحديات كفاءة المعالجة وإمكانية قراءة التعليمات البرمجية داخل بيئة الجداول الحسابية، طرحت مايكروسوفت دالة LET. تتيح هذه الدالة تعيين أسماء وتخصيص متغيرات محلية (Local Variables) لتخزين نواتج الحسابات الوسيطة واستدعائها لاحقاً داخل نطاق الصيغة الواحدة. تمثل دالة LET نقلة نوعية في فلسفة بناء الصيغ داخل إكسيل؛ إذ تستعير مفاهيم البرمجة الهيكلية لإنهاء عصر الصيغ المتكررة والمتداخلة بصورة عشوائية.
عبر تخزين نتائج العمليات الثقيلة لمرة واحدة في الذاكرة المؤقتة للخلية، يُلغى التكرار الحسابي تماماً، مما يقلل بشكل ملموس من استهلاك وحدة المعالجة المركزية، فضلاً عن تحويل الصيغ الرياضية الطويلة والمعقدة إلى سلاسل منطقية مبسطة يسهل فحصها وتعديلها واستكشاف أخطائها من جانب فرق العمل البرمجية والتحليلية.
4.2 التشريح الدقيق لصيغة التكديس والتنقية الشاملة
لتحقيق التنقية الكاملة للمصفوفة المكدسة مع ضمان أعلى درجات الكفاءة الحاسوبية، يتم دمج VSTACK مع FILTER تحت مظلة دالة LET وفق التركيب المعياري المتطور الآتي:
=LET(stacked, VSTACK(A2:B10, D2:E10), FILTER(stacked, INDEX(stacked, , 1) <> ""))
يتم تشريح هذه البنية التنفيذية وفق الخطوات المرحلية التالية:
- التعيين المصدري: تُسند نتيجة التكديس الرأسي
VSTACK(A2:B10, D2:E10)إلى الاسم المتغيرstackedككائن مصفوفي متكامل يُحسب لمرة واحدة فقط داخل الذاكرة المؤقتة. - الفرز الانتقائي: يتم تمرير المتغير
stackedبوصفه المصفوفة الأساسية للوسيطة الأولى في دالةFILTER. - المعايرة الشرطية: تستخرج الدالة
INDEX(stacked, , 1)العمود المرجعي الأول من المصفوفة المخزنة، وتقارن عناصره بمعامل النفي النصي<> "". - التوليد النهائي: تُسقط دالة FILTER كل صف يحمل فراغاً، وتدفق السجلات المكتملة فقط إلى ورقة العمل، متجاوزة مشكلة التحويل إلى أصفار بنجاح تام وسرعة معالجة قصوى.
4.3 المقارنة المعيارية في الأداء بين الصياغة التقليدية وصيغة LET
أظهرت الاختبارات المعيارية للأداء في معالجة قواعد البيانات الكبيرة تفوقاً حاسماً لصياغة LET على الصياغة التكرارية المباشرة. فعند اختبار مصفوفات تحوي عشرات الآلاف من السجلات عبر نطاقات موزعة، انخفض زمن المعالجة وإعادة التقييم (Calculation Latency) بنسبة تتراوح بين 40% إلى 50% عند استخدام المتغيرات المحلية، نظراً لأن المحرك لا يُضطر إلى تخصيص خيوط معالجة موازية لحساب بنية VSTACK مرتين.
علاوة على التوفير الحسابي في دورات المعالجة، توفر صياغة LET مستوى عالياً من متانة الحوكمة البرمجية؛ فإذا تطلب النموذج إضافة نطاق بيانات ثالث، كإدراج مبيعات فرع إضافي، فإن التعديل يُجرى لمرة واحدة حصراً داخل وسيطة المتغير الأولي دون الحاجة إلى مطابقة التعديل يدوياً في وسائط الشروط المنطقية، مما يلغي تماماً مخاطر تباين النطاقات أثناء الصيانة التشغيلية للنموذج.
5. تطبيق عملي: دمج بيانات المبيعات عبر الفروع المتعددة
5.1 إعداد بيئة البيانات وافتراض السيناريو الواقعي
لإيضاح الأثر التطبيقي لهذه المنهجيات، نفترض سيناريو واقعياً لمؤسسة تجارية تمتلك فرعين منفصلين: “فرع الرياض” و”فرع جدة”. يشتمل كل جدول على ثلاثة أعمدة رئيسية هي: [معرّف الموظف]، [اسم الموظف]، و[حجم المبيعات]. وبسبب طبيعة التسجيل اليدوي أو تأخر توريد الفواتير، تتضمن سجلات الفرعين صفوفاً متفرقة خالية بالكامل من البيانات، أو خلايا تتضمن فقط معرّف الموظف دون تسجيل مبيعات مقابلة.
يمتد جدول فرع الرياض عبر النطاق المادي (A2:C20)، بينما يمتد جدول فرع جدة عبر النطاق (E2:G20). ويتمثل الهدف التحليلي في بناء تقرير مالي موحد متدفق رأسياً في النطاق (I2:K)، بحيث تُدمج سجلات الفرعين في قائمة واحدة متصلة ومتماسكة تخلو كلياً من أي صفوف فارغة أو تشوهات صفرية قد تخل بالقوائم الختامية للشركة.

5.2 التنفيذ التدريجي للدالة الافتراضية ورصد الخلل
عند الشروع في تطبيق دالة التكديس الرأسي بصيغتها البدائية المباشرة بالخلية المستهدفة I2:
=VSTACK(A2:C20, E2:G20)
يقوم محرك إكسيل فوراً بسكب السجلات التسعة والثلاثين مجتمعة في النطاق المستهدف. ولكن عند المعاينة التفصيلية للمخرجات، تتكشف عيوب المعالجة الافتراضية؛ إذ تظهر الصفوف التي كانت شاغرة في الجداول الأصلية كصفوف تتألف بالكامل من أصفار (0 | 0 | 0).
يترتب على هذا التدفق تشوه إحصائي جسيم؛ فإذا استُخدمت دالة COUNTA لعد السجلات المدمجة، فستُدرج هذه الصفوف الصفرية تلقائياً ضمن إجمالي المعاملات، وإذا طُبقت دالة AVERAGE على عمود المبيعات المدمج، فستنحدر قيمة متوسط المبيعات انحداراً حاداً وغير واقعي نتيجة قسمة مجموع الإيرادات الفعلية على عدد سجلات متضخم بالأصفار المصطنعة، مما يعطي صورة مضللة تماماً لكفاءة أداء الفروع.
5.3 تطبيق الصيغة المعززة وتحقيق التنقية التامة
لتدارك هذا الخلل الجوهري، تُستبدل الصيغة السابقة بالصيغة المحسنة المعتمدة على LET والتصفية المنطقية بالخلية I2 على النحو التالي:
=LET(data, VSTACK(A2:C20, E2:G20), FILTER(data, INDEX(data, , 1) <> ""))
بمجرد تنفيذ هذه الصيغة، يُلاحظ انكماش نطاق التدفق الديناميكي فوراً ليتطابق حصرياً مع عدد السجلات المأهولة فعلياً بالبيانات. تتلاشى كافة الصفوف المحتوية على أصفار مستحدثة، ويعود التناسق الهيكلي لعمود المعرفات وأسماء الموظفين. وعند حساب المجموع التراكمي لعمود المبيعات ومقارنته بالمجاميع الفردية المستقلة للجداول المصدرية، يتطابق الإجمالي الحسابي تطابقاً تاماً مع ثبات المتوسط الحسابي الصحيح، مما يثبت نجاح عملية التنقية الحوسبية دون الإخلال بسلامة البيانات الأساسية.
6. معالجة الحالات الحدية والبيانات النصية الخاصة
6.1 تطهير الفراغات الناتجة عن المسافات غير المرئية
في بيئات العمل التشاركية وقواعد البيانات المصدرة من أنظمة تخطيط الموارد (ERP)، كثيراً ما تواجه النماذج الحسابية معضلة “الخلايا الفارغة ظاهرياً”؛ وهي خلايا لا تحتوي على نصوص مرئية، ولكنها تتضمن مسافات بيضاء غير مرئية (Spaces) ناتجة عن ضغطات عفوية على مفتاح المسافة أو بقايا تصدير نصوص غير منقاة. تفشل الصياغات القياسية التي تختبر الشرط <> "" في كشف هذه الحالات، لأن الخلية التي تحتوي على مسافة تعتبرها الخوارزمية سلسلة نصية غير فارغة طولها أكبر من الصفر.
ولمعالجة هذه الحالة الحدية بكفاءة، يتعين دمج دالتي TRIM وLEN ضمن شرط التصفية الداخلي. تقوم دالة TRIM بإزالة كافة المسافات البادئة واللاحقة، بينما تقيس LEN الطول الفعلي للأحرف المتبقية:
=LET(raw, VSTACK(A2:B10, D2:E10), FILTER(raw, LEN(TRIM(INDEX(raw, , 1))) > 0))
يضمن هذا الإجراء الصارم استبعاد أي سجل يعتمد على عمود دليل فارغ، حتى لو امتلأت خلاياه بمسافات خفية متكررة، مما يحمي النموذج من التمدد الزائف.
6.2 التمييز بين الأصفار الأصلية والأصفار الناتجة عن التكديس
من أدق التحديات التي تواجه محللي البيانات أثناء استخدام VSTACK ضرورة الفصل الحسابي بين “الصفر الرياضي الأصيل” و”الصفر المصطنع المتولد عن الفراغ”. ففي النماذج المحاسبية، قد تكون قيمة مبيعات صفقة معينة صفراً حقيقياً (كالمنح والعينات المجانية أو الخصومات الكاملة)، واستبعاد هذا السجل كلياً يعد تزييفاً للسجلات الرسمية. بينما في الوقت نفسه، يجب إسقاط السجلات التي نتجت عن خلايا كانت فارغة في الأصل وتلوثت بالصفر الافتراضي.
لا يمكن حل هذا اللبس بالاختبار المباشر للقيمة الصفرية <> 0، بل يجب أن يرتكز شرط التصفية دائماً على اختبار “حالة الفراغ النصي” في العمود المفتاحي أو دمج الأعمدة عبر التحقق المتبادل. إذا كانت الدالة تُعالج عموداً رقمياً وحيداً يحتوي على أصفار حقيقية وفراغات، يتم التمييز برمجياً عبر تحويل الخلية مؤقتاً إلى نص متصل بسلسلة خالية:
=LET(v, VSTACK(A2:A20, C2:C20), FILTER(v, (v <> "") * ISNUMBER(v) + (v <> "")))
أو بطريقة أكثر بساطة، جعل شرط الفلترة يستند دوماً إلى عمود معرّف فريد غير مالي (ككود العميل أو التاريخ) لا يحتوي بطبيعته على قيمة عددية صفرية، مما يضمن بقاء الأصفار الأصلية في أعمدة المبيعات مصانة دون بتر.
6.3 إدارة قيم الأخطاء المصاحبة لسلاسل البيانات
عند سحب البيانات من نطاقات متباعدة تخضع لعمليات حسابية نشطة، قد تحتوي الجداول المصدرية على قيم أخطاء برمجية مثل #DIV/0! أو #N/A أو #VALUE!. تمتلك دالة VSTACK حساسية فائقة لنقل هذه الأخطاء؛ إذ تنقلها كما هي إلى مصفوفة الخرج، والأخطر من ذلك أن وجود قيمة خطأ في العمود الدليلي المستخدم في شرط دالة FILTER يؤدي فوراً إلى انهيار صيغة الفلترة بالكامل وارتجاع الخطأ نفسه لكامل المصفوفة.
لتأمين تدفق المصفوفة ضد الأخطاء المصدرية، يُدمج فحص وقائي باستخدام دوال إدارة الاستثناءات مثل IFERROR أو IFNA؛ بحيث تُعالج الأخطاء في النطاقات المصدرية قبل اكتمال التحقق المنطقي، كاستبدال الخطأ بقيمة محايدة أو إسقاطه كلياً بالتزامن مع إسقاط الخلايا الفارغة، بما يضمن استمرارية انسياب البيانات حتى في حال تعثر بعض الخلايا المصدرية.
7. التكامل الوظيفي مع دوال التكديس والتنظيم المعاصرة
7.1 المقارنة بين VSTACK ودوال التجميع البديلة كدالة TOCOL
تتكامل دالة VSTACK في المنظومة المعاصرة مع دوال تجميع أخرى، وعلى رأسها دالة TOCOL التي تمثل حلاً استثنائياً في سيناريوهات دمج الأعمدة المفردة. تكمن الميزة التنافسية الكبرى لدالة TOCOL في امتلاكها وسيطة تحكم مدمجة لتجاهل الفراغات والأخطاء دون الحاجة إلى استخدام FILTER أو تشييد هياكل LET المعقدة.
تأتي دالة TOCOL بالصيغة:
=TOCOL(array, [ignore], [scan_by_column])
وعند ضبط الوسيطة الثانية (ignore) على القيمة (1)، تقوم الدالة تلقائياً ومباشرة باستبعاد كافة الخلايا الفارغة من المصفوفة الناتجة. ومن ثم، فإذا كان الهدف تجميع عدة نطاقات أحادية العمود في قائمة موحدة، فإن استخدام الصياغة الآتية:
=TOCOL(HSTACK(A2:A10, D2:D10), 1)
يعد خياراً متفوقاً هندسياً على صياغة VSTACK المقترنة بالفلترة، نظراً لأن TOCOL تتكفل بحذف الفراغات خوارزمياً من طبقة النواة الحسابية للدالة. ومع ذلك، تبقى VSTACK الخيار الوحيد الذي لا بديل عنه عند التعامل مع المصفوفات متعددة الأعمدة التي تتطلب الحفاظ على الترابط الأفقي للسجلات المتكاملة.

7.2 الاقتران مع دوال الترتيب والفرز المتقدم SORT وUNIQUE
تتجلى قوة محرك المصفوفات الديناميكية عند تكديس الدوال وتمرير المخرجات في مسارات معالجة متتالية (Pipelines). فبعد تنقية المصفوفة المكدسة عبر VSTACK وFILTER من الفراغات والأصفار، يمكن إحاطة الناتج بدوال التحليل والفرز المتقدمة دون أدنى عائق.
على سبيل المثال، لاستخراج قائمة موحدة من أسماء العملاء الفريدين من فروع متعددة مع ترتيبهم هجائياً وإسقاط الفراغات، تصاغ المعادلة كالتالي:
=SORT(UNIQUE(LET(c, VSTACK(A2:A20, E2:E20), FILTER(c, c <> ""))))
في هذه التركيبة، تتولى دالة LET تنقية القائمة أولاً، ثم تُسقط دالة UNIQUE أي تكرارات في الأسماء المجمعة، وأخيراً تتكفل دالة SORT بإعادة ترتيب السجلات تصاعدياً. يولد هذا الاقتران تقارير إدارية لحظية وفورية، يتم تحديثها تلقائياً بمجرد إدخال أي بيان جديد في الجداول المصدرية دون الحاجة إلى تشغيل ماكرو أو تحديث استعلامات Power Query.
7.3 التكامل مع دالة HSTACK للتجميع الأفقي المتطابق
تُمثل دالة HSTACK النظير الأفقي المباشر لدالة VSTACK؛ حيث تعمل على ضم النطاقات والمصفوفات جنباً إلى جنب على مستوى الأعمدة. وتخضع لنفس المحددات الرياضية المنظمة؛ فإذا اشتملت الأعمدة المضمومة على صفوف غير متناظرة الطول، فإن المحرك يُنشئ أخطاء أو أصفاراً في الفجوات السفلية للمصفوفة الأقصر.
يمكن سحب نفس المنهجية المعتمدة على الفلترة لتنقية النواتج الأفقية، مع ملاحظة أن التصفية في حالة HSTACK قد تتطلب قلب المصفوفة عبر دالة TRANSPOSE قبل التصفية ثم إعادتها إلى وضعها الأصلي إذا كان الهدف إسقاط أعمدة شاغرة بالكامل بدلاً من إسقاط الصفوف. يضمن هذا التوافق المنهجي بناء مكعبات بيانات ثنائية الأبعاد تتسم بالاتساق الهيكلي الكامل وخلوها من التشويه التوزيعي.
8. التأطير الرياضي للشروط المتعددة داخل مصفوفة VSTACK
8.1 تطبيق شروط الاستبعاد المنطقية المتعددة
في السيناريوهات المتقدمة، لا يقتصر متطلب التنقية على استبعاد الخلايا الفارغة فحسب، بل يمتد ليشمل شروطاً أعمال معقدة متزامنة، مثل استبعاد الفراغات وتصفية المعاملات التي تقل عن قيمة مالية معينة، أو حصر البيانات في نطاق زمني محدد. يُدار هذا التعدد المنطقي داخل وسيطة (include) في دالة FILTER عبر استخدام الجبر البولياني؛ وتحديداً عمليتي الضرب والجمع المنطقيين.
يمثل استخدام معامل الضرب (*) في مصفوفات إكسيل تطبيقاً لبوابة العطف المنطقية (AND)، مما يعني أن الصف لا يُدرج إلا إذا استوفى كافة الشروط المتزامنة معاً. في المقابل، يمثل معامل الجمع (+) بوابة الاختيار المنطقية (OR)، مما يتيح إدراج السجل إذا استوفى أحد الشروط.
تأخذ صيغة الاستبعاد المركب للشروط المتعددة داخل مصفوفة مكدسة الشكل الآتي:
=LET(data, VSTACK(A2:D20, F2:I20), FILTER(data, (INDEX(data, , 1) <> "") * (INDEX(data, , 4) >= 1000)))
في هذه الحالة، تضمن الصيغة استبعاد كافة السجلات التي يكون فيها الحقل الأول فارغاً، وتستبعد في الوقت ذاته أي سجل مبيعات في الحقل الرابع تقل قيمته عن 1000 وحدة نقدية، مما يفرز جدولاً موحداً فائق الدقة.
8.2 استخدام دالة ISBLANK ضمن المعالجة المصفوفية
يقع العديد من مستخدمي إكسيل في مصيدة تقنية عند محاولة استخدام دالة ISBLANK لاختبار فراغ الخلايا داخل مصفوفات VSTACK المفلترة. تكمن المعضلة التقنية في أن دالة ISBLANK صُممت بنيوياً لاختبار مراجع الخلايا المادية الصلبة (Physical Cell References) على ورقة العمل؛ وعند تطبيقها على مصفوفة افتراضية موجودة حصرياً داخل ذاكرة المعالج، فإنها غالباً ما تُرجع قيماً خاطئة أو تولد أخطاء عدم تطابق الأنماط (#VALUE!).
لذلك، يُوصى بالاعتماد الصارم على المقارنة النصية <> "" كمعيار قياسي لفحص الفراغ داخل المتغيرات المحلية لمصفوفات LET. فهذا المعامل يتعامل بسلاسة مع التدفقات الرقمية والنصية في الذاكرة على حد سواء، ولا يخلط بين مراجع الخلايا الفيزيائية وحالات البيانات العائمة في بيئة الحساب الديناميكي.
8.3 التحقق من تطابق أبعاد المصفوفات المجمعة
تتطلب السلامة الرياضية لعمليات التكديس الرأسي تناظر الأعمدة في كافة المصفوفات الموجهة إلى VSTACK. فإذا كانت المصفوفة الأولى تتكون من ثلاثة أعمدة بينما تتكون الثانية من أربعة، فسيقوم محرك الحساب بتوليد خطأ القيمة غير المتاحة (#N/A) في كامل العمود الرابع المقابل لسجلات المصفوفة الأولى لتعويض النقص الهندسي في الأبعاد.
وللحفاظ على اتساق السجلات وتفادي إفساد شروط التصفية اللاحقة، يتعين مواءمة المصفوفات مسبقاً قبل التكديس، إما باقتطاع الأعمدة الفائضة عبر دالة CHOOSECOLS أو إضافة أعمدة افتراضية متطابقة باستخدام دالة EXPAND. يضمن هذا الضبط المسبق للأبعاد تدفق بيانات متناسقة تخضع لشروط التصفية بسلاسة تامة وتمنع انهيار النموذج التجميعي.
9. التشخيص المنهجي للأخطاء الشائعة واستراتيجيات معالجتها
9.1 معالجة خطأ التمدد المصفوفي #SPILL!
يُعد خطأ التمدد #SPILL! الخطأ الأكثر شيوعاً عند التعامل مع المصفوفات الديناميكية بصفة عامة، ودالة VSTACK بصفة خاصة. يظهر هذا الخطأ الهندسي عندما يعجز محرك إكسيل عن سكب النتائج المصفوفية المتدفقة في ورقة العمل نتيجة وجود عائق مادي يعترض مسار النطاق المخصص للإخراج.
تتعدد الأسباب الكامنة وراء هذا الحجب، ويمكن تصنيفها وعلاجها منهجياً وفق الآتي:
- وجود بيانات حاجزة: احتواء أي خلية تقع ضمن مساحة التدفق المستهدفة على نص أو رقم أو مسافة خفية. يتطلب الحل مسح وتفريغ النطاق بالكامل أسفل وأسفل يسار خلية الصيغة.
- الخلايا المدمجة (Merged Cells): تتعارض بنية المصفوفات الديناميكية تعارضاً مطلقاً مع الخلايا المدمجة. يجب إلغاء دمج كافة الخلايا في منطقة التمدد لضمان انسياب المصفوفة.
- الجداول المهيكلة الرسمية (Excel Tables): لا تسمح الجداول المهيكلة بتدفق الصيغ المصفوفية داخل أعمدتها؛ لذا يجب إدخال صيغة VSTACK خارج نطاق الجداول المهيكلة الرسمية، على ورقة عمل قياسية مفتوحة.
- تمدد غير متناهٍ: قد يحدث الخطأ إذا أشارت الدالة إلى أعمدة كاملة (مثل A:A) دون تصفية محكمة، مما يجعل المصفوفة تحاول سكب أكثر من مليون صف، وهو ما يتجاوز السعة القصوى لورقة العمل.
9.2 معالجة خطأ الحساب الفراغي #CALC!
يظهر خطأ الحساب الفراغي #CALC! بصورة أساسية عندما تُطبق دالة FILTER على المصفوفة المكدسة وتؤدي شروط الاستبعاد المنطقية إلى حجب كافة السجلات المتاحة، بحيث لا يتبقى أي صف يستوفي المعايير المحددة (أي أن متجهة الشرط بالكامل أصبحت FALSE).
في بيئة الأعمال، يُعد انهيار الصيغة وظهور رمز الخطأ خللاً تصميمياً يربك المستخدم النهائي. ولتلافي هذا الانقطاع، توفر دالة FILTER وسيطتها الثالثة الإلزامية في التطبيقات الاحترافية [if_empty]. وتُصاغ الصيغة المحصنة برمجياً كالتالي:
=LET(st, VSTACK(A2:B10, D2:E10), FILTER(st, INDEX(st,,1)<>"", "لا توجد سجلات مطابقة"))
عند انعدام السجلات غير الفارغة، ستُرجع الصيغة العبارة التوضيحية المحددة بأمان ودون توقف المحرك الحسابي أو التأثير السلبي على سياق العمل العام.
9.3 مشكلات التوافقية والتحديث في الإصدارات المختلفة
ترتبط دالة VSTACK بالمعمارية البرمجية الحديثة لحزمة Microsoft 365 وإصدار Excel 2024 ونسخة الويب السحابية. لا تتوفر هذه الدالة إطلاقاً في الإصدارات الدائمة التقليدية مثل Excel 2016 أو Excel 2019 أو حتى الإصدار الاستهلاكي من Excel 2021 دون التحديثات الديناميكية الموسعة.
عند فتح مصنف عمل يحتوي على دالة VSTACK في إصدار غير مدعوم، يقوم البرنامج بتغليف اسم الدالة بعلامة خاصة فتظهر كـ =_xlfn.VSTACK(...)، وتتحول الخلية إلى حالة خطأ القيمة غير المعرّفة (#NAME?). ولضمان استمرارية الأعمال عند مشاركة المصنفات مع جهات خارجية لا تمتلك اشتراكات حديثة، يجب إما تحويل مخرجات المصفوفات المتدفقة إلى قيم نصية ورقمية ثابتة عبر أمر “نسخ ولصق كقيم”، أو اللجوء إلى حلول التجميع المؤسسية المتوافقة مع الإصدارات السابقة مثل أداة Power Query لتوحيد البيانات وتنقيتها خلفياً.
10. أفضل الممارسات لحوكمة النماذج الحسابية وتوثيقها
10.1 الاعتماد على الجداول الرسمية المهيكلة (Excel Tables)
من أبرز الأخطاء المنهجية في تصميم النماذج المحاسبية الاعتماد على نطاقات الخلايا المادية الصلبة والمفتوحة (مثل A2:C100) داخل دالة VSTACK؛ حيث يؤدي هذا التصميم إلى قراءة مئات الخلايا الفارغة افتراضياً، مما يُلزم المحلل بكتابة شروط تصفية مكثفة لعزلها. وتتمثل الممارسة القياسية الفضلى في تحويل كافة النطاقات المصدرية إلى “جداول مهيكلة رسمية” عبر الضغط على (Ctrl + T)، وتسمية الجداول بأسماء دلالية واضحة (مثل Table_Riyadh و Table_Jeddah).
تتميز المراجع المهيكلة بخاصية التوسع الديناميكي التلقائي؛ فعند إضافة صف جديد لأي فرع تجاري، يتمدد الجدول تلقائياً، وبالتالي تستدعي الدالة:
=LET(data, VSTACK(Table_Riyadh, Table_Jeddah), FILTER(data, INDEX(data, , 1) <> ""))
السجلات المضافة فورياً ودون أي حاجة لتعديل حدود النطاقات في الصيغة، مع الحفاظ التام على تنقية البيانات من أي فراغات وسيطة قد يتركها المستخدم أثناء التحرير.
10.2 التوثيق البرمجي والتعليق داخل الدوال المتقدمة
تقتضي قواعد الحوكمة المؤسسية لنماذج البيانات المالية توثيق الصيغ المركبة وتوضيح مساراتها المنطقية لضمان قابلية الصيانة وتسهيل مهمة المدققين والمطورين اللاحقين. يُنصح عند كتابة دوال LET الطويلة باختيار أسماء متغيرات ذات دلالة إنجليزية أو عربية معبرة تفصح عن دورها الوظيفي (مثل CombinedData أو NonBlankFilter) بدلاً من الحروف المفردة المبهمة.
كما يمكن استغلال إمكانية كسر الأسطر داخل شريط الصيغة بالضغط على (Alt + Enter) لتنسيق الدالة في صورة شبيهة بالشفرة البرمجية المنسقة، واستخدام المسافات لضبط المحاذاة البصرية للوسائط. يُضاف إلى ذلك إمكانية دمج تعليقات نصية غير مؤثرة على الحساب باستخدام الدالة النادرة N داخل الصيغة لتوثيق منطق التصفية والافتراضات المطبقة:
=LET(stacked, VSTACK(A2:B10, D2:E10), FILTER(stacked, INDEX(stacked,,1)<>"") + N("صيغة تكديس موحدة مع إسقاط الفراغات"))
10.3 إجراءات التدقيق والتحقق من سلامة المخرجات المدمجة
يختتم بناء النماذج الحسابية المحترفة بإرساء بروتوكولات التدقيق الآلي والتحقق من صحة المخرجات (Automated Reconciliation). لا يكفي الاعتماد على الملاحظة البصرية لنجاح التكديس والتنقية، بل يجب تخصيص خلايا رقابية إرشادية (Audit Check Cells) خارج نطاق التدفق.
تعتمد إحدى أقوى آليات التدقيق على مقارنة إجمالي عدد السجلات غير الفارغة في المصادر الأصلية بعدد صفوف المصفوفة الناتجة. فإذا كان التعبير التالي:
=ROWS(OutputRange#) = (COUNTA(Table1[ID]) + COUNTA(Table2[ID]))
يُرجع صواباً (TRUE)، يتيقن المحلل الرياضي من أن عملية التكديس عبر VSTACK والتنقية عبر FILTER قد تمت دون سقوط أي سجل أصيل أو إقحام أي فراغ مشوه. يُضفي هذا النهج الصارم ثقة مطلقة في مخرجات النماذج عند استخدامها في إعداد القوائم الختامية والموازنات التقديرية الحساسة.
خاتمة
يُمثل التوظيف المتقن لدالة VSTACK واقترانها التكاملي مع دالتي FILTER وLET قفزة نوعية في هندسة نماذج البيانات داخل برنامج مايكروسوفت إكسيل الحديث. لقد أثبتت التحليلات المفاهيمية والتطبيقية أن افتقار الدالة الأصلية لوسيطة استبعاد الفراغات لا يمثل عائقاً حاسوبياً، بل يتيح عبر منهجيات التصفية المنطقية المعاصرة سيطرة تامة للمحلل المالي على جودة ونزاهة المخرجات، بما يعزل الأصفار الزائفة ويحمي مقاييس النزعة المركزية والتشتت من التشوه الإحصائي.
إن التحول نحو استخدام المتغيرات المحلية المهيكلة واعتماد الجداول الديناميكية الرسمية يمثل معيار الحوكمة الأمثل لأي بيئة عمل تسعى إلى استدامة نماذجها ودقتها التشغيلية. ومن خلال الفهم المتعمق للأسس الرياضية للمصفوفات وتجنب مسببات أخطاء التمدد والحساب الفراغي، تصبح هذه المنظومة البرمجية المدمجة إحدى أقوى أدوات التحليل المؤسسي، مما يمنح متخذي القرار تقارير لحظية تتسم بأعلى درجات الرصانة والموثوقية.
المراجع
- Microsoft. (2022). VSTACK function. Microsoft Support. https://support.microsoft.com/en-us/office/vstack-function-a4b97550-ee23-48b4-9c81-16927eb008a3
- Microsoft. (2022). FILTER function. Microsoft Support. https://support.microsoft.com/en-us/office/filter-function-f4f7cb66-82eb-4767-8f7c-4877ad80c759
- Microsoft. (2020). LET function. Microsoft Support. https://support.microsoft.com/en-us/office/let-function-34842dd8-b92b-4d3f-b325-b8b8f9908999
- Microsoft. (2022). TOCOL function. Microsoft Support. https://support.microsoft.com/en-us/office/tocol-function-22839d9b-0b55-4fc1-b4e6-2761f8f122ed
- Microsoft. (2020). Dynamic array formulas and spilled array behavior. Microsoft Support. https://support.microsoft.com/en-us/office/dynamic-array-formulas-and-spilled-array-behavior-205c6b06-03ba-4151-8ab0-a1849348eed0