VBA: كيفية عد الصفوف في التحديد

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

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

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

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

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

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

1. مقدمة تأصيلية لمفهوم كائن التحديد (Selection Object) في بيئة VBA

1.1 ماهية كائن التحديد وموقعه في النموذج الكائني لإكسل

يمثل كائن التحديد في بيئة Visual Basic for Applications كينونة برمجية ديناميكية فائقة الحساسية، حيث يرتبط ارتباطاً وثيقاً بالحالة اللحظية لما تم تمييزه بصرياً بواسطة المستخدم أو عبر تعليمة تنشيطية سابقة داخل واجهة التطبيق. وفي سياق التسلسل الهرمي لنموذج كائنات إكسل، يقع التحديد كتابع مباشر لكائن التطبيق Application، ويندرج تحت كائن النافذة النشطة Window أو ورقة العمل النشطة Worksheet. وتكمن الميزة البنيوية الأهم لكائن Selection في قدرته على تغيير هويته البرمجية استناداً إلى طبيعة العنصر المحدد؛ فقد يشير إلى نطاق من الخلايا (Range)، أو كائن رسومي (Shape)، أو رسم بياني (ChartObject)، أو حتى مربع نصي. غير أن السياق الغالب والمحوري في معالجة البيانات المحاسبية والإحصائية يتمثل في التحديد الذي يؤول نوعياً إلى كائن Range، مما يستوجب فهماً بنيوياً للاختلافات بين الإشارة المباشرة إلى النطاق Range(“A1:B10”) والإشارة غير المباشرة المرتهنة بالتفاعل اللحظي Selection.

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

1.2 البنية الهيكلية لخاصية Rows وتفرعاتها البرمجية

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

تتم آلية تمرير الأوامر البرمجية عبر مسار هرمي صارم ينطلق من الكائن الأب الأعلى نزولاً إلى الخاصية النهائية؛ فعند تحرير التعليمة Selection.Rows.Count، يقوم محرك VBA باستجواب كائن التحديد أولاً للتأكد من قدرته على تمثيل أبعاد خلوية، ثم يستخلص المجموعة Rows المرتبطة بهندسة التحديد، ليوجه في النهاية طلباً داخلياً إلى دالة التعداد التابعة للمجموعة من أجل قياس المسافة الرأسية بين الحد العلوي والحد السفلي للتحديد. وتتطلب هذه العملية فهماً عميقاً لطبيعة المجموعات في لغات البرمجة المعتمدة على COM، حيث لا تقتصر المجموعة على التخزين السلبي للعناصر، بل تتيح واجهات برمجية ديناميكية تمكن المطور من التكرار، والفرز، والاستعلام الحسابي الفوري بدقة بالغة وسرعة تنفيذ عالية.

1.3 الأهمية المنهجية لمعرفة عدد الصفوف في التحليل الآلي للبيانات

تتجاوز الحاجة لمعرفة عدد الصفوف المحددة إطار الاستعلام البصري البسيط، لتشكل ركيزة منهجية في بناء خوارزميات المعالجة التكرارية وتصميم هياكل البيانات في الذاكرة. فعند بناء مصفوفات البيانات المؤتمتة، يتوجب على المطور حجز أبعاد المصفوفة في الذاكرة العشوائية بصورة دقيقة باستخدام التعليمات التوسيعية مثل ReDim Preserve، وتعد معرفة عدد الصفوف المحددة المدخل الرياضي الأساسي لتحديد البعد الأول للمصفوفة، مما يحول دون إهدار موارد الجهاز أو وقوع أخطاء الخروج عن نطاق الفهرسة (Subscript out of range). وتماثل هذه الدقة الهيكلية في إدارة البيانات ما يطرحه الباحثون في النماذج المعرفية الصارمة لتصنيف البيانات والتعامل مع الأنماط الهيكلية (Jagadish et al., 2024).

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

2. التحليل النحوي لخاصية Selection.Rows.Count وسلوكها البرمجي

2.1 التشريح الدلالي للتعليمة البرمجية Selection.Rows.Count

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

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

2.2 أنواع البيانات وحدود سعة الذاكرة الحسابية

تعد مسألة اختيار نوع البيانات المناسب لتخزين ناتج تعداد الصفوف نقطة حرجة يقع فيها الكثير من المبرمجين المبتدئين. في الإصدارات القديمة من إكسل (Excel 97-2003)، كان عدد الصفوف في ورقة العمل لا يتجاوز 65,536 صفاً، وكان استخدام نوع البيانات Integer، الذي يتسع للقيم المحصورة بين -32,768 و 32,767، يؤدي حتماً إلى حدوث خطأ التدفق الزائد الشهير Error 6 Overflow بمجرد تجاوز التحديد لهذا الرقم الحرج. ومع ظهور إصدار Excel 2007 وما تلاه، اتسع نطاق ورقة العمل الواحدة ليصل إلى 1,048,576 صفاً، مما جعل استخدام نوع البيانات Long، وهو عدد صحيح بحجم 32 بت يتسع لقيم تصل إلى أكثر من 2.14 مليار، واجباً برمجياً إلزامياً غير قابل للتفاوض.

تتجسد أفضل الممارسات الإعلانية للمتغيرات (Variable Declaration) في تخصيص مساحة الذاكرة بدقة باستخدام العبارة الصريحة، مثل:

Dim TotalRowCount As Long

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

  • نوع البيانات Integer: الحجم في الذاكرة 2 بايت (16 بت)، الحد الأقصى للقيمة 32,767، النتيجة مع التحديدات الكبرى: خطأ تجاوز سعة الذاكرة (Runtime Error 6: Overflow).
  • نوع البيانات Long: الحجم في الذاكرة 4 بايت (32 بت)، الحد الأقصى للقيمة 2,147,483,647، النتيجة مع التحديدات الكبرى: استقرار تام وتغطية كاملة لسعة ورقة العمل البالغة 1,048,576 صفاً.

2.3 السلوك الافتراضي للخاصية في النطاقات المصمتة والمفردة

تُظهر خاصية Selection.Rows.Count سلوكاً افتراضياً يمكن التنبؤ به هندسياً عند تطبيقها على النطاقات المصمتة والمتصلة؛ فعندما يقتصر تحديد المستخدم على خلية مفردة واحدة (Single Cell)، مثل النقر العفوي على الخلية B4، فإن المحرك البرمجي يعامل هذه الخلية بصفتها مصفوفة ذات بعد واحد يتكون من صف واحد وعمود واحد، ومن ثم ترجع الخاصية القيمة 1 دون أدنى تعقيد. ويعد هذا السلوك متسقاً مع المنطق الرياضي للنموذج الكائني، حيث لا توجد خلايا منعزلة خارج إطار مفهوم الصف والعمود.

أما في حالات المصفوفات المتصلة مستطيلة الشكل (Rectangular Contiguous Ranges)، مثل تحديد النطاق الممتد من B2 إلى F10، فإن الخاصية تقيس المسافة الرأسية حصراً، مرجعة العدد 9 (وهو ناتج طرح رقم صف البداية من صف النهاية مضافاً إليه واحد)، متجاهلة تماماً وجود خمسة أعمدة أفقية. غير أن السلوك الحرج الذي يستوجب الحذر الشديد يبرز عند قيام المستخدم بتحديد عمود كامل (Entire Column) كالنقر على رأس العمود A؛ في هذه الحالة، ستُرجع الخاصية الرقم الأقصى للصفوف في الورقة فوراً (1,048,576)، وإذا كان الكود البرمجي يعتمد على هذه القيمة لبدء حلقة تكرارية، فإن ذلك سيقود التطبيق حتماً نحو التوقف المؤقت غير المستجيب، مما يؤكد ضرورة اقتران الخاصية بضوابط تحقق مسبقة تحول دون الوقوع في مآزق الحسابات غير المقصودة.

3. الطريقة الأولى: احتساب عدد الصفوف وعرض النتائج في صندوق رسائل (MsgBox)

3.1 بناء وتطبيق الإجراء الفرعي الأساسي CountRowsInSelection

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

Sub CountRowsInSelection()
    MsgBox Selection.Rows.Count
End Sub

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

3.2 دراسة حالة تطبيقية: فحص النطاق الممتد من A1 إلى C17

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

يكشف هذا المثال التطبيقي تجريداً هاماً في آلية عمل الخاصية؛ فعلى الرغم من أن النطاق المختار يضم ثلاثة أعمدة كاملة (A و B و C)، وأن العدد الإجمالي للخلايا النشطة يبلغ 51 خلية (17 مضروبة في 3)، فإن تعليمة Selection.Rows.Count تتجاهل البعد الأفقي والتفاصيل الداخلية للخلايا، محتسبة فقط المتجه الرأسي. ويثبت هذا السلوك أن الخاصية لا تهدر موارد المعالجة في إحصاء الخلايا الفردية داخل الصف، بل تعتمد على حساب الفرق الطوبولوجي الرأسي لحدود النطاق، وهو ما يجعل أداءها البرمجي فائق السرعة حتى في النطاقات التي تتضمن آلاف الأعمدة.

3.3 تطوير واجهة التنبيه وإثراء المخرجات النصية

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

Sub DetailedSelectionReport()
    Dim rowTotal As Long
    Dim colTotal As Long
    rowTotal = Selection.Rows.Count
    colTotal = Selection.Columns.Count
    MsgBox "تقرير أبعاد النطاق المحدد حالياً:" & vbCrLf & _
           "عدد الصفوف: " & rowTotal & vbCrLf & _
           "عدد الأعمدة: " & colTotal, _
           vbInformation + vbOKOnly, "أبعاد التحديد البرمجي"
End Sub

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

VBA count rows in current selection
VBA count rows in current selection

4. الطريقة الثانية: كتابة عدد الصفوف وتوثيقه داخل خلية محددة

4.1 التطبيق البرمجي للتعليمة Range(“E1”).Value = Selection.Rows.Count

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

Range("E1").Value = Selection.Rows.Count

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

4.2 دراسة حالة تطبيقية: معالجة النطاق A4:D9 وتخزين المخرجات

لتوضيح أبعاد هذه العملية في بيئة عمل نموذجية، نفترض سيناريو يقوم فيه المستخدم بتحديد كتلة بيانات محصورة بين الخلايا A4 و D9 بهدف استخلاص حجم العينة المسجلة في هذا النطاق وتدوينها تلقائياً في الخلية E1. عند قراءة هذا النطاق، نجد أنه يبدأ من الصف 4 وينتهي عند الصف 9، مما يجعله مكوناً من 6 صفوف كاملة. ينفذ المطور الإجراء التالي لتحقيق التكامل التلقائي:

Sub RecordSelectionRowCount()
    Dim selectedRows As Long
    selectedRows = Selection.Rows.Count
    ThisWorkbook.ActiveSheet.Range("E1").Value = selectedRows
End Sub

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

4.3 التوجيه الديناميكي لموضع حفظ النتائج في ورقة العمل

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

Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Value = Selection.Rows.Count

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

5. التحدي التقني: معالجة التحديدات المتقطعة وغير المتجاورة (Non-Contiguous Selections)

5.1 القصور الهيكلي لخاصية Selection.Rows.Count مع النطاقات المتعددة

يعد القصور في التعامل مع النطاقات المتقطعة أحد أبرز المزالق البرمجية التي يقع فيها المطورون في لغة VBA؛ فعندما يضغط المستخدم على مفتاح Ctrl ويقوم باختيار نطاقات متعددة متباعدة في أماكن متفرقة من ورقة العمل (كأن يحدد A1:A5 ثم C10:C15)، فإن تعليمة Selection.Rows.Count لا تحتسب إلا صفوف المنطقة الأولى فقط (Selection.Areas(1))، متجاهلة تماماً باقي المناطق الأخرى المحددة. ينتج عن هذا السلوك قصور كارثي في الحسابات التراكمية، حيث ستُرجع الخاصية في المثال السابق الرقم 5 بدلاً من 11، مما يقود بالضرورة إلى اتخاذ قرارات خاطئة أو تشغيل حلقات تكرارية مبتورة.

يرجع التفسير العلمي لهذا القصور إلى بنية النموذج الكائني ذاته؛ فكائن Range يمثل في أصله مساحة مصمتة متصلة، وعند إنشاء تحديد متقطع، يقوم إكسل بتجميع هذه النطاقات المجزأة داخل كائن فرعي يُدعى مجموعة المناطق (Areas Collection). وعند طلب الخاصية Selection.Rows مباشرة، فإن المحرك يفترض افتراضياً التعامل مع العنصر الأول في هذه المجموعة دون تنبيه المطور لوجود مناطق إضافية. يتشابه هذا القصور مع الأخطاء النحوية والتركيبية التي ترصدها النظم الحاسوبية المتخصصة في تحليل الأخطاء البنيوية (Alfaifi, 2015)، حيث يتطلب الأمر تدخلاً صريحاً لتفكيك البنية وفهم مكوناتها الفرعية بصورة شاملة.

5.2 بناء خوارزمية التكرار الحلقي عبر كائن Areas

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

Sub CountAllDiscontinuousRows()
    Dim currentArea As Range
    Dim totalAccumulatedRows As Long
    totalAccumulatedRows = 0
    If TypeName(Selection) = "Range" Then
        For Each currentArea In Selection.Areas
            totalAccumulatedRows = totalAccumulatedRows + currentArea.Rows.Count
        Next currentArea
        MsgBox "إجمالي عدد الصفوف عبر كافة المناطق: " & totalAccumulatedRows, _
               vbInformation, "حساب النطاقات المتعددة"
    End If
End Sub

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

5.3 معالجة إشكالية التداخل والتكرار في الصفوف المشتركة

رغم كفاءة خوارزمية التكرار عبر مجموعة Areas، إلا أنها تواجه تحدياً رياضياً بالغ التعقيد يظهر عند تداخل الصفوف أفقياً؛ كأن يحدد المستخدم النطاق A1:B5 ثم يحدد في نفس الوقت النطاق D3:E8. ففي هذه الحالة، يمتد النطاق الأول على الصفوف (1 إلى 5) ويمتد الثاني على الصفوف (3 إلى 8)، مما يعني أن الصفوف 3 و 4 و 5 قد تم احتسابها مرتين؛ الأولى كجزء من المنطقة الأولى، والثانية كجزء من المنطقة الثانية، مما يجعل حاصل الجمع التراكمي البسيط يعطي 11 صفاً، بينما العدد الفعلي للصفوف المستهدفة فيزيائياً هو 8 صفوف فقط (الصفوف من 1 إلى 8).

لحل هذه المعضلة الحسابية واستبعاد التكرارات الناتجة عن التقاطعات الأفقية، يتم توظيف كائن القاموس البرمجي (Scripting.Dictionary) لتخزين أرقام الصفوف الفريدة، حيث يعمل القاموس على منع تكرار المفاتيح تلقائياً وفق الكود التالي:

Sub CountUniqueRowsStrict()
    Dim rowDict As Object
    Dim myArea As Range
    Dim myRow As Range
    Set rowDict = CreateObject("Scripting.Dictionary")
    If TypeName(Selection) = "Range" Then
        For Each myArea In Selection.Areas
            For Each myRow In myArea.Rows
                If Not rowDict.Exists(myRow.Row) Then
                    rowDict.Add myRow.Row, True
                End If
            Next myRow
        Next myArea
        MsgBox "عدد الصفوف الفريدة غير المكررة: " & rowDict.Count, vbInformation
    End If
End Sub

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

6. التحقق المسبق من صحة الكائنات ومعالجة الأخطاء الاستثنائية

6.1 التأكد من طبيعة الكائن المحدد (Range Validation)

تعتبر الحماية البرمجية المسبقة ركناً أساسياً في كتابة الشيفرات الآمنة والمستقرة؛ فالمستخدم النهائي قد يطلق الماكرو البرمجي المخصص لاحتساب الصفوف في لحظة يكون فيها الكائن المحدد ليس خلية أو نطاقاً من الخلايا، بل شكلاً هندسياً تم النقر عليه بطريق الخطأ، أو رسماً بيانياً، أو زراً برمجياً. فإذا تم تنفيذ التعليمة Selection.Rows.Count مباشرة في هذا السياق، سيتوقف الماكرو فوراً ويسجل النظام خطأ فادحاً يتمثل في عدم دعم الكائن لهذه الخاصية (Runtime Error 438: Object doesn’t support this property or method).

لتفادي هذا الإخفاق البرمجي، يُلزم المطور بالتحقق الصارم من نوع الكائن باستخدام الدالة القياسية TypeName أو مشغل التحقق الهيكلي TypeOf Is قبل محاولة استدعاء أي خاصية مصفوفية، كما هو موضح في البناء الشرطي التالي:

If TypeName(Selection) <> "Range" Then
    MsgBox "خطأ في نوع التحديد: يرجى تحديد خلايا صالحة في ورقة العمل قبل تشغيل الماكرو.", _
           vbCritical, "تنبيه التحقق البرمجي"
    Exit Sub
End If

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

6.2 إدارة الأخطاء البرمجية الشائعة باستخدام On Error

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

Sub RobustCountProcedure()
    On Error GoTo ErrorHandler
    Dim evaluatedRows As Long
    If TypeOf Selection Is Range Then
        evaluatedRows = Selection.Rows.Count
        MsgBox "العدد الإجمالي للصفوف: " & evaluatedRows, vbInformation
    End If
    Exit Sub
ErrorHandler:
    MsgBox "حدث استثناء برمجي غير متوقع!" & vbCrLf & _
           "رمز الخطأ: " & Err.Number & vbCrLf & _
           "الوصف: " & Err.Description, vbCritical, "معالج الأخطاء النظامي"
    Err.Clear
End Sub

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

6.3 حماية أوراق العمل المقفلة وتأثيرها على كتابة النتائج

تمثل حماية أوراق العمل (Worksheet Protection) بُعداً أمنياً لا غنى عنه في بيئات المؤسسات لمنع التلاعب غير المصرح به بالبيانات والمعادلات؛ غير أن هذا القفل الأمني ينعكس سلباً على أكواد الماكرو التي تحاول كتابة ناتج عدد الصفوف في خلايا تقع ضمن الورقة المحمية، مثل تعليمة Range(“E1”).Value = Selection.Rows.Count. ففي حال كانت الخلية E1 مقفلة والورقة محمية، سيتوقف الماكرو مسجلاً خطأ فادحاً يمنع الكتابة.

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

If ActiveSheet.ProtectContents = True Then
    ActiveSheet.Unprotect Password:="SecurePass123"
    Range("E1").Value = Selection.Rows.Count
    ActiveSheet.Protect Password:="SecurePass123"
Else
    Range("E1").Value = Selection.Rows.Count
End If

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

7. التطبيقات المتقدمة: استثناء الصفوف المخفية والمفلترة في التحديد

7.1 تأثير الفلاتر اليدوية والآلية على نتائج الحساب الافتراضية

يعد سلوك التصفية (Filtering) وإخفاء الصفوف يدوياً من أكثر العوامل التي تتسبب في تضليل نتائج التحليل الآلي للبيانات؛ حيث إن خاصية Selection.Rows.Count الافتراضية مصممة لاحتساب الصفوف وفقاً للمدى الهندسي المطلق للنطاق بصرف النظر عن حالة الظهور البصري لتلك الصفوف. فإذا قام محلل بيانات بتطبيق تصفية تلقائية على جدول يحتوي على 1000 صف، وأسفرت التصفية عن إظهار 20 صفاً فقط تستوفي معيار البحث، فإن تحديد هذا النطاق كاملاً وتشغيل Selection.Rows.Count سيُرجع الرقم 1000 كاملاً، متجاهلاً حقيقة أن 980 صفاً منها مخفية تماماً عن الأنظار.

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

7.2 استخدام SpecialCells(xlCellTypeVisible) لعزل الصفوف المرئية

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

Sub CountVisibleRowsOnly()
    Dim visibleRange As Range
    Dim subArea As Range
    Dim visibleRowCount As Long
    visibleRowCount = 0
    If TypeName(Selection) = "Range" Then
        On Error Resume Next
        Set visibleRange = Selection.SpecialCells(xlCellTypeVisible)
        On Error GoTo 0
        If Not visibleRange Is Nothing Then
            For Each subArea In visibleRange.Areas
                visibleRowCount = visibleRowCount + subArea.Rows.Count
            Next subArea
            MsgBox "عدد الصفوف الظاهرة فقط: " & visibleRowCount, vbInformation
        Else
            MsgBox "لا توجد خلايا ظاهرة ضمن التحديد المعني.", vbExclamation
        End If
    End If
End Sub

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

7.3 المقارنة الرياضية والعملية بين التحديد الإجمالي والظاهري

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

Sub ComparativeRowAudit()
    Dim totalR As Long
    Dim visR As Long
    Dim visPart As Range
    totalR = Selection.Rows.Count
    visR = 0
    On Error Resume Next
    For Each visPart In Selection.SpecialCells(xlCellTypeVisible).Areas
        visR = visR + visPart.Rows.Count
    Next visPart
    On Error GoTo 0
    MsgBox "تقرير الفحص والتدقيق:" & vbCrLf & _
           "إجمالي الصفوف الهندسية: " & totalR & vbCrLf & _
           "الصفوف الظاهرة الفعلية: " & visR & vbCrLf & _
           "الصفوف المخفية / المستبعدة: " & (totalR - visR), _
           vbInformation, "المقارنة المعيارية للبيانات"
End Sub

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

8. بناء دوال مخصصة (User Defined Functions – UDF) لحساب الصفوف ديناميكياً

8.1 هندسة دالة مخصصة بديلة لحساب صفوف التحديد

بينما تقتصر الإجراءات الفرعية من النوع Sub على تنفيذ الأوامر التفاعلية أو كتابة القيم عبر الماكرو، توفر الدوال المخصصة (User Defined Functions – UDF) إمكانية دمج الأكواد البرمجية مباشرة داخل واجهة خلايا إكسل لاستخدامها تماماً كالدوال المدمجة القياسية مثل SUM و COUNT. تمكن هذه التقنية المحلل من استدعاء دالة تحسب عدد الصفوف لنطاق محدد بصيغة مرنة وتلقائية دون الحاجة لتشغيل ماكرو مستقل في كل مرة، وفق الصياغة الهندسية التالية:

Function CalculateRowsCount(Optional targetRange As Range) As Long
    If targetRange Is Nothing Then
        Set targetRange = Selection
    End If
    CalculateRowsCount = targetRange.Rows.Count
End Function

تتميز هذه الدالة بقبولها لوسيط اختياري (Optional targetRange)، فإذا مرر المستخدم نطاقاً صريحاً مثل CalculateRowsCount(A1:C10) قامت بحساب صفوفه، وإذا استدعى الدالة دون وسيط قامت باحتساب صفوف التحديد الحالي Selection. تفتح هذه البنية آفاقاً واسعة لأتمتة الحسابات الإحصائية في أوراق العمل وتسهيل استخدام الأدوات البرمجية المعقدة من قبل المستخدمين غير المتمرسين في كتابة الأكواد.

8.2 إدارة خاصية التطاير (Application.Volatile) وإعادة الحساب

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

Application.Volatile True

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

8.3 إتاحة الدالة عبر مصنف الماكرو الشخصي (Personal Macro Workbook)

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

علاوة على ذلك، يمكن ربط هذه الدوال والإجراءات باختصارات لوحة مفاتيح مخصصة (مثل Ctrl + Shift + R) أو تثبيتها كأزرار أنيقة داخل شريط أدوات الوصول السريع (Quick Access Toolbar) أو ضمن شريط الأوامر المخصص (Ribbon). يتيح هذا الدمج المتكامل للمحللين والمطورين استدعاء كود حساب الصفوف بنقرة زر واحدة أو ضغطة مفتاح عابرة، مما يرفع الكفاءة التشغيلية اليومية للمؤسسة ويوحد المعايير البرمجية المستخدمة في تحليل ومعالجة البيانات المالية والإدارية.

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

9.1 تقليل الاعتماد على كائن Selection لصالح التحديد المباشر

تجمع أدبيات هندسة البرمجيات المتقدمة في بيئة Excel VBA على أن الاعتماد المكثف على كائنات التنشيط والتحديد البصري (Select و Selection) يمثل أحد أكبر مصادر الهدر الحوسبي وبطء التنفيذ في معالجة البيانات الضخمة. فعندما ينفذ المحرك أمراً مثل Range(“A1:C10000”).Select تتبعه تعليمة Selection.Rows.Count، يضطر النظام لإشعار الواجهة الرسومية وتحديث طبقات العرض البصري وتغيير حالة المؤشر في الذاكرة الرسومية، مما يستغرق وقتاً يناهز مئات الأضعاف مقارنة بالتعامل البرمجي المباشر مع النطاق دون عرضه أو تحديده.

تتمثل القاعدة الذهبية لكتابة أكواد فائقة السرعة في الإشارة المباشرة إلى كائن النطاق الصامت (Direct Range Referencing) كالتالي:

Dim rawRowsCount As Long
rawRowsCount = Worksheets("Data").Range("A1:C50000").Rows.Count

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

9.2 استخدام تقنيات تحسين البيئة البرمجية أثناء الحساب

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

Sub OptimizedEnvironmentExecution()
    On Error GoTo ResetSettings
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    Application.EnableEvents = False

    ' العمليات البرمجية لاحتساب الصفوف والتنفيذ التكراري
    Dim activeCount As Long
    activeCount = Selection.Rows.Count

ResetSettings:
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    Application.EnableEvents = True
End Sub

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

9.3 المقارنة المعيارية للأداء بين Selection و Range و UsedRange

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

  • خاصية Selection.Rows.Count: مرتهنة كلياً بالتحديد اللحظي للمستخدم؛ سرعتها تعتمد على حجم التحديد، ومستوى المخاطرة فيها مرتفع نظراً لاحتمال تحديد عمود كامل أو كائن رسومي بطريق الخطأ.
  • خاصية Range(“…”).Rows.Count: نطاق صلب ومحدد مسبقاً في الشيفرة؛ فائقة السرعة وثابتة ومحصنة تماماً ضد أخطاء المستخدم العرضية، لكنها تفتقر للمرونة في التعامل مع المتغيرات اللحظية.
  • خاصية ActiveSheet.UsedRange.Rows.Count: أداة استعلام شاملة تغطي كافة الخلايا المأهولة بالبيانات أو التنسيقات في ورقة العمل بأكملها؛ مفيدة جداً لمعالجة الملفات الكاملة، لكنها قد تكون مضللة إذا تضمنت خلايا سفلية فارغة تحتوي على تنسيقات قديمة غير ممسوحة.

يستنتج مهندس النظم من هذه المقارنة أن لكل خاصية سياقها الهندسي الأمثل؛ حيث يفضل Selection في أدوات التفاعل والتشخيص اللحظي، و Range في العمليات الحسابية القياسية الثابتة، و UsedRange في أتمتة مهام النسخ الاحتياطي ومسح الجداول الشاملة في بيئات المؤسسات.

10. خاتمة استرشادية ودليل استكشاف الأخطاء وتصحيحها (Troubleshooting)

10.1 فهرس الأخطاء التشغيلية الأكثر شيوعاً وكيفية معالجتها

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

  • خطأ التجاوز الحسابي (Runtime Error 6: Overflow): ينجم حصراً عن استخدام نوع البيانات Integer لاستقبال عدد صفوف يتجاوز 32,767 صفاً. يكمن الحل الجذري في تغيير تصريح المتغير ليكون من النوع Long بصورة صريحة.
  • خطأ عدم تعيين متغير الكائن (Runtime Error 91: Object variable or With block variable not set): يظهر عند محاولة التعامل مع نطاق تم إعلانه ولم يتم إسناده باستخدام الكلمة المحجوزة Set (مثل Dim rng As Range متبوعة باستدعاء rng.Rows.Count دون Set rng = Selection). التصحيح يتمثل في استخدام تعليمة الإسناد الصحيحة Set.
  • الحسابات المشوهة بسبب دمج الخلايا (Merged Cells): عند احتواء التحديد على خلايا مدمجة عبر عدة صفوف، قد تؤدي خاصية Rows.Count إلى قراءات غير متوقعة للأبعاد، حيث يتم احتساب الصفوف الموسعة بشكل قد يربك الخوارزميات. يوصى مؤسسياً بإلغاء دمج الخلايا واستبدالها بتنسيق “محاذاة عبر التحديد” (Center Across Selection) للحفاظ على البنية الهندسية السليمة للنطاق.

10.2 قائمة التحقق المنهجية (Checklist) لكتابة كود نظيف ومستدام

لضمان استدامة البرمجيات المكتوبة بلغة VBA وقابليتها للصيانة والتطوير ضمن فرق العمل المؤسسية، يجدر بالمطور اتباع قائمة التحقق المنهجية التالية قبل إطلاق أي كود يعتمد على حساب صفوف التحديد:

  • التأكد من تضمين العبارة الإلزامية Option Explicit في صدارة كل وحدة برمجية لإجبار الإعلان الصريح عن كافة المتغيرات.
  • فحص نوع الكائن المحدد باستخدام TypeName(Selection) = "Range" قبل استدعاء خاصية Rows.
  • استخدام نوع البيانات Long لكافة المتغيرات المخصصة لحفظ أعداد الصفوف وفهارس الحلقات التكرارية.
  • التحقق من احتمالية وجود تحديدات متقطعة ومعالجتها عبر حلقة التكرار في كائن Areas.
  • التأكد من مراعاة حالة التصفية التلقائية والصفوف المخفية عبر استخدام SpecialCells(xlCellTypeVisible) عند الحاجة للبيانات المرئية فقط.
  • تضمين بنية متكاملة لمعالجة الأخطاء الاستثنائية باستخدام On Error GoTo لحماية التطبيق من الانهيار المفاجئ.
  • توثيق الكود البرمجي بالتعليقات التوضيحية الدقيقة باللغة الفصحى أو المصطلحات المعيارية لتيسير عمليات المراجعة والتدقيق المستقبلي.

10.3 الآفاق المستقبلية لتطوير الأتمتة البرمجية في جداول البيانات

تشهد بيئة حوسبة جداول البيانات تحولات تقنية عميقة مع الدمج المتسارع للتقنيات السحابية والذكاء الاصطناعي التوليدي. وبينما تشق لغات حديثة مثل TypeScript عبر برمجيات Office Scripts ولغة Python المدمجة مباشرة داخل منصة Excel طريقها نحو الصدارة في مجالات التحليل الإحصائي السحابي المتقدم، تظل لغة Visual Basic for Applications ركيزة صلبة لا غنى عنها في بيئات الأعمال المكتبية لسرعتها في التفاعل مع التطبيقات المحلية دون الحاجة لاتصال بالإنترنت أو خوادم سحابية.

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

المراجع

  • Alfaifi, A. Y. G. (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
  • Jagadish, A. K., Coda-Forno, J., Thalmann, M., Schulz, E., & Binz, M. (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
  • Richards, R., Spence, P. R., & Edwards, C. C. (2022). Human-machine communication scholarship trends: An examination of research from 2011 to 2021 in communication journals. Human-Machine Communication, 4, 3. https://doi.org/10.30658/hmc.4.3
  • Rohe, T., Hesse, K., Ehlis, A.‐C., & Noppeney, U. (2024). Multisensory perceptual and causal inference is largely preserved in medicated post-acute individuals with schizophrenia. PLoS Biology, 22(8), e3002790. https://doi.org/10.1371/journal.pbio.3002790
★

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

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

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

looti, M. (2026, أكتوبر 23). VBA: كيفية عد الصفوف في التحديد. عرب سايكلوجي. https://arabpsychology.com/statistics/vba-how-to-count-rows-in-selection/
looti, Mohammed. “VBA: كيفية عد الصفوف في التحديد.” عرب سايكلوجي, 23 أكتوبر 2026, https://arabpsychology.com/statistics/vba-how-to-count-rows-in-selection/.
looti, Mohammed. “VBA: كيفية عد الصفوف في التحديد.” عرب سايكلوجي. أكتوبر 23, 2026. https://arabpsychology.com/statistics/vba-how-to-count-rows-in-selection/.