اذهب إلى المحتوى

Siba Abo Aloioon

الأعضاء
  • المساهمات

    7
  • تاريخ الانضمام

  • تاريخ آخر زيارة

آخر الزوار

828 زيارة للملف الشخصي

إنجازات Siba Abo Aloioon

عضو مبتدئ

عضو مبتدئ (1/3)

1

السمعة بالموقع

  1. يحتاج تدقيق البرنامج عند كتابته باستخدام VBA في إكسل إلى إيقاف البرنامج مؤقتًا في نقاط محددة للتعديل والتدقيق ثم إعادة تشغيله عددًا من المرات، مما يحتاج إيجاد أنسب وأسرع الوسائل للإيقاف المؤقت والتشغيل والمراقبة سنستعرض بعضًا منها. تشغيل الشيفرة أو واجهة المستخدم UserForm في VBA Exel يمكن تشغيل الشيفرة في إكسل VBA بثلاث طرائق نختار الأسرع منها أثناء مراقبة سير عمل البرنامج وتتبع الأخطاء: من علامة التبويب Run > Run Sub/UserForm. الضغط على مفتاح الاختصار F5 من لوحة المفاتيح. النقر على زر Run Sub/UserForm من شريط الأدوات. إدراج أو إزالة نقاط توقف مؤقت Toggle Breakpoint في VBA Exel قد نحتاج إلى إيقاف تنفيذ الشيفرة البرمجية مؤقتًا في VBA عند نقطة معينة في البرنامج من أجل ملاحظة النتائج المرحلية عند تلك النقطة وتدقيق عمل البرنامج لإجراء أي تعديلات لازمة. يمكن إدراج نقطة التوقف المؤقت عند سطر برمجي معين لإعطاء الأمر Toggle Breakpoint بخمسة طرائق: نضع المؤشر عند السطر المطلوب، ثم نذهب إلى علامة التبويب Debug > Toggle Breakpoint. النقر بزر الفأرة الأيمن على السطر الذي نريد إدراج نقطة التوقف عنده فتظهر قائمة منسدلة نختار منها Toggle فتظهر قائمة منسدلة جديدة نختار منها Breakpoint. نضع المؤشر عند السطر المطلوب ثم نضغط الزر F9 اختصارًا للخطوة السابقة. ننقر بالمؤشر على الهامش الذي إلى يسار السطر المطلوب. لإدراج نقطة توقف من داخل الشيفرة البرمجية يمكن كتابة الكلمة المفتاحية Stop في السطر الذي يسبق السطر البرمجي الذي نريد إيقاف تنفيذ البرنامج عنده. تؤدي أي من الطرائق السابقة إلى ظهور إشارة مستديرة لونها أحمر داكن أو بني إلى جوار السطر المطلوب في الهامش الرمادي مما يعني أنه تم تعيين نقطة توقف مؤقت عند هذا السطر، ويُميَّز السطر بنفس اللون. إعطاء نفس الأمر مرة ثانية في VBA بأي من الطرائق السابقة يؤدي إلى إزالة نقطة التوقف المؤقت وإزالة الإشارة المستديرة والتمييز من ذلك السطر البرمجي. إن إعطاء الأمر Run لأول مرة في اكسل VBA بوجود نقطة توقف ينفذ الشيفرة البرمجية من بداية البرنامج إلى السطر السابق لنقطة التوقف ليتوقف تنفيذ البرنامج مؤقتًا عند السطر البرمجي الذي وضعنا عنده هذه النقطة ويميز السطر بالأصفر وتظهر إشارة سهم أصفر في الهامش الرمادي إلى يسار ذلك السطر، ويدخل البرنامج في طور الإيقاف المؤقت Break Mode. وفي حال وجود نقاط توقف أخرى فإن تشغيل الشيفرة مرة جديدة يجعل البرنامج يتابع التنفيذ بين نقطتي توقف متتاليتين ابتداءً من نقطة التوقف الأخيرة التي وقف عندها وميزها بالأصفر. مثال: يكتب المثال التالي أرقام الصفوف في المجال C2:F4 بالدخول في حلقتين متداخلتين في الإجراء الأصلي Sub1Write الحلقة i لتحديد رقم الصف والحلقة j لتحديد رقم العمود، بعد إنهاء الحلقتين والخروج منهما يستدعي الإجراء الثاني Sub2Format الذي يلون الخط في خلايا السطر الواحد بنفس اللون بالدخول أيضًا في حلقتين متداخلتين i و j مشابهتين للحلقتين السابقتين. Sub Sub1Write() For i = 2 To 4 For j = 3 To 6 Worksheets("Sheet1").Cells(i, j) = i Next j Next i Call Sub2Format End Sub Sub Sub2Format() For i = 2 To 4 For j = 3 To 6 Worksheets("Sheet1").Cells(i, j).Font.ColorIndex = i + 1 Next j Next i End Sub يمكن إضافة أكثر من نقطة توقف مؤقت لمراقبة سير البرنامج في مراحل مختلفة تكون مفصلية في عمل الشيفرة. ويمكن إدراج نقاط التوقف في أكثر من إجراء لمقاطعة التنفيذ عند الانتقال بين الإجراءات الأصلية والإجراءات المستدعاة. تساعد هذه النقاط في فهم آلية عمل البرنامج بشكل أفضل. حيث يتوقف تنفيذ الإجراء مؤقتًا كلما وصل إلى إحدى تلك النقاط مما يسمح بملاحظة التغييرات الحاصلة. وبتكرار إعطاء الأمر بالتشغيل يدويًا بالضغط على زر F5 أو النقر على زر Run، يتابع البرنامج التنفيذ من نقطة التوقف الحالية حتى نقطة التوقف التالية أو إلى نهاية الشيفرة إن لم توجد نقاط توقف تالية. يمكن إعطاء الأمر بمتابعة تنفيذ خطوة واحدة في VBA فقط بدءًا من نقطة التوقف الحالية بإعطاء الأمر Step Into أو Step Over، أو متابعة التنفيذ من نقطة التوقف الحالية حتى مكان المؤشر باستخدام الأمر Run To Cursor، أو متابعة التنفيذ من نقطة التوقف الحالية إلى نهاية الإجراء باستخدام الأمر Step Out. أو تحديد الخطوة التالية بإعطاء الأمر Set Next Statement ثم نقر الزر Run. غير أن نقاط التوقف المدرجة تستطيع أن تقاطع جميع أوامر التشغيل والخطو السابقة وتوقف التنفيذ عندها. ملاحظة: لا يوجد أي ارتباط بين المتغيرين i و j في الحلقة الأولى في الإجراء الأصلي والمتغيرين i و j في الحلقة الثانية في الإجراء الفرعي، فقد انتهت الحلقتين الأولين في الإجراء الأصلي تمامًا لتبدأ الحلقتين الأخريين في الإجراء الفرعي بقيم i و j جديدة. كما أنه لم يتم تعريف أي من المتغيرين كمتغير عام لذا تمسح قيم كل منهما بمجرد الانتقال بين الحلقتين، باختصار يمكن أن نعتبر المتغيرات i و j في الإجراء الثاني متغيرات جديدة تمامًا كما لو كانا باسمين جديدين k و F. إزالة جميع نقاط التوقف Clear All Breakpoints في VBA Exel عند إضافة عدد كبير من نقاط التوقف في VBA، قد نحتاج إلى إزالتها كلها، ولكن البحث عن كل نقطة توقف وتكرار الأمر Toggle Breakpoint لإزالتها يدويًا واحدة تلو الأخرى يحتاج بعض الوقت. يمكن إزالة جميع نقاط التوقف من علامة التبويب Debug > Clear All Breakpoints أو بالضغط على أزرار الاختصارCtrl+Shift+F9. انظر مجددًا إلى المثال الأول: تشغيل الشيفرة حتى المؤشر Run to Cursor يعمل الأمرRun to Cursor بطريقة مشابهة لنقاط التوقف فيجري تنفيذ الشيفرة أو متابعة تنفيذها حتى يتوقف موضع المؤشر، ولكن لا تبقى نقطة التوقف البنية المستديرة والتمييز البني موجودين هنا كما في الأمر Toggle BreakPoint كما أن تأثيرها يزول بعد انتهاء الأمر Run to Cursor. لتنفيذ الشيفرة حتى مكان المؤشر، نضع المؤشر على السطر الذي نريد إيقاف تنفيذ التعليمات البرمجية مؤقتا فيه ثم نذهب إلى شريط القوائم Debug > Run to Cursor، كما يمكن الضغط على أزرار الاختصار CTRL + F8. تعمل Run to Cursor عندما يكون التطبيق في وضع التصميم، يمكن أن تفيد لتنفيذ عدد كبير من الخطوات البرمجية لا نحتاج إلى مراقبة تفاصيلها كالحلقات الكبيرة مثلًا. كما يمكن استخدام الأمر Run to Cursor للانتقال في تنفيذ الأوامر البرمجية بين نقاط في الإجراءات الأصلية والفرعية المستدعاة. مثال: نطبق الأمر Step into لتنفيذ خطوة واحدة من الشيفرة السابقة من شريط القوائم أو بضغط زر الاختصار F8 ولتجنب الخطوات الكثيرة في الحلقات في كلي الإجراءين نضع المؤشر في المكان الذي نريد التنفيذ عنده ثم نطلب الأمر Run to Cursor من شريط القوائم أو بالضغط على أزرار الاختصار CTRL + F8. تعيين السطر التالي في التنفيذ Set Next Statement في VBA Exel عندما ننتقل في الشيفرة خطوة خطوة نلاحظ أن السطر البرمجي الذي سينفَّذ في الخطوة التالية يميَّز باللون الأصفر مع ظهور سهم أصفر يشير إليه في منطقة الهامش إلى يسار ذلك السطر. يمكن تغيير السطر التالي الذي سينفذ فينتقل التمييز والسهم الأصفر إليه بأحد الطرق الثلاثة التالية: من علامة التبويب Debug > Set Next Statement. نضع المؤشر عند السطر المطلوب ثم نضغط أزرار الاختصار Ctrl +F9 اختصارًا للخطوة السابقة. النقر على السهم الأصفر بزر الفأرة الأيسر وسحبه إلى أي سطر نريد. يؤدي استعمال أي من الأساليب السابقة طبعًا إلى تغيير ترتيب تنفيذ أوامر الشيفرة البرمجية. يفيد هذا بشكل خاص عندما نجري تعديلًا ما في أحد الأسطر بعد أن تم تنفيذه، ونريد إعادة متابعة التنفيذ ابتداءً من هذا السطر. مثال: نشغل الشيفرة السابقة حتى سطر الاستدعاء في الإجراء الأول بإدراج إشارة إيقاف مؤقت Breakpoint عند السطر Call Sub2Format فتُملأ الخلايا بأرقام الأسطر، ثم نكمل التشغيل حتى نهاية الإجراء الثاني المستدعى فيلوَّن الخط بلونٍ دليلُه يساوي رقم الصف +1، نغير الرقم المضاف إلى رقم الصف i والذي يمثل دليل اللون ونعيد تشغيل الحلقة في الإجراء الثاني من بدايتها لنلاحظ تغير لون الخط. ملاحظة: يمكن تطبيق Set Next Statement فقط على الأسطر القابلة للتنفيذ ضمن نفس الإجراء الذي يجري التنفيذ فيه، فلا يمكن الانتقال بين الإجراءات المستدعاة والإجراءات الأصلية. لا يكون الأمر Set Next Statement فعالًا إلا في وضع الإيقاف المؤقت Break Mode بعد أن نكون قد نفذنا جزءًا من الشيفرة. إظهار العبارة البرمجية التالية Show Next Statement في VBA Exel عند استخدام الأمر Show Next Statement في VBA ينتقل مؤشر الكتابة إلى بداية السطر التالي في التنفيذ والذي يكون مميزًا بالأصفر بشكل آلي. يكون هذا الأمر مُفَعَّلًا في وضع الإيقاف المؤقت Break Mode فقط. خاتمة إن مهارة المبرمج في اختيار أماكن الإيقاف المؤقت ومرونته في التشغيل والإيقاف وتحديد نقطة التنفيذ التالية بأكثر من طريقة يسهل عليه معرفة الخلل في الشيفرة في VBA، وذلك من خلال إيقاف البرنامج مؤقتًا في النقاط التي يتوقع أن الخلل فيها أو التي تحوي متغيرات أو تعبيرات برمجية تؤثر على عمل الشيفرة ومن ثم مراقبة قيمها في تلك المرحلة. اقرأ أيضًا التعامل مع الأخطاء في VBA ضمن مايكروسوفت إكسل تصحيح الأخطاء في VBA: الخطأ في الشيفرة صناعة الدوال الخاصة والتعامل مع الأحداث في مايكروسوفت إكسل VBA العمليات الشرطية في مايكروسوفت إكسل باستخدام VBA
  2. أثناء كتابة شيفرة برمجية باستخدام VBA أو بأية لغة أخرى لابد أن نواجه بعض الأخطاء في كتابة البرنامج، فنادرًا ما نتم كتابة برنامج دون أن نحتاج إلى تصحيح الأخطاء أو التأكد من سلامة سير البرنامج. وتزداد صعوبة اكتشاف مكان الخطأ كلما كانت الشيفرة أطول وأكثر تعقيدًا. يؤمن VBA Excel بعض الأدوات التي تساعد على اكتشاف أماكن الأخطاء وتتبع النتائج. كما تساعد هذه الأدوات على فهم الشيفرات البرمجية التي كتبناها فهمًا أفضل، بالإضافة إلى أهميتها في المساعدة في فهم الشيفرات المكتوبة من قبل مبرمجين آخرين. يمكن استعراض أهم هذه الأدوات من القائمة المنسدلة من شريط القوائم Debug، نلاحظ أن معظم هذه الأدوات لها اختصارات في لوحة المفاتيح مما يساعد على المتابعة والتدقيق بسرعة أكبر. تنفيذ خطوة واحدة من الشيفرة Step Into في VBA Exel يمكن إعطاء أمرٍ بتنفيذ خطوة واحد من الشيفرة البرمجية في VBA بالنقر على علامة التبويب Debug من شريط القوائم Step Into، ولتنفيذ خطوة جديدة واحدة نكرر العملية لمراقبة التغيرات وإجراء أي تعديلات، يمكن الضغط على زر F8 في كل مرة اختصارًا لأمر Step Into فيُنفذ السطر المميز بالأصفر فقط، ونراقب التغييرات الحاصلة بنتيجة تنفيذ هذا السطر لإجراء التعديلات اللازمة. عند تنفيذ السطر البرمجي بالأمر Step Into يُميَّز السطر الذي سينفَّذ في الخطوة التالية باللون الأصفر مع سهم أصفر يشير إلى السطر. يمكن معرفة قيمة أي متغير بتقريب مؤشر الفأرة عليه في زمن التصميم في فترة الإيقاف المؤقت، فتظهر قيمته اللحظية في تلك الخطوة أسفل المؤشر. ملاحظة: قد تكون الخطوة سطرًا برمجيًا واحدًا إلى الأمام أو قد تكون خطوة تعود إلى بداية الحلقة عند التعليمة Next مثلًا أو إلى سطر معين عند التعليمة GoTo. كما أن التصريح عن المتغيرات لا يعتبر من الخطوات البرمجية فلا يقف عندها البرنامج. مثال: في الإجراء التالي ينتقل التحديد بين خلايا الجدول B3:D5، وتتلون الخلية بحسب رقم الصف. يحدث الانتقال بين الخلايا عبر حلقتين تكراريتين: الحلقة الأولى ذات المتغير i ينتقل فيها عبر الصفوف، والحلقة الثانية بمتغير j ينتقل بواسطتها عبر الأعمدة. سنستخدم التعليمة Step Into لمراقبة انتقال الأوامر التنفيذية خطوةً خطوة: Sub CellsLoop() For i = 3 To 5 For j = 2 To 4 Cells(i, j).Select Cells(i, j).Interior.ColorIndex = i Next j Next i End Sub بدأنا بإعطاء الأمر Step Into من القائمة المنسدلة لتنفيذ خطوة واحدة عدة مرات، ثم تابعنا تنفيذ الخطوات التالية واحدة تلو الأخرى بإعطاء نفس الأمر بالضغط على المفتاح F8، إلى أن تنتهي الشيفرة. لاحظ دوران خطوات التنفيذ ضمن الحلقة حتى نهايتها لينتقل التنفيذ بعدها إلى التعليمة التالية. ملاحظة: إذا كانت الشيفرة البرمجية تحوي استدعاءً لإجراءٍ آخر، فإن إعطاء الأمر Step Into عند سطر الاستدعاء يسبب الدخول في الإجراء المستدعى لتنفيذ خطوة واحدة فيه، وبتكرار الأمر يستمر تنفيذ الإجراء المستدعى خطوة واحدة عند كل أمر Step Into إلى أن ينتهي تنفيذ الإجراء المستدعى فيخرج منه ليعود ويتابع تنفيذ الإجراء الأصلي. مثال: ينتقل الإجراء التالي الذي اسمه CellsLoop بين الصفوف من 3 إلى 5 ضمن الحلقة الأولى i، كلما وصل إلى صف رقمه i يدخل حلقة جديدة j يتنقل فيها في خلايا ذلك الصف بين العمود B والعمود D بتغيير رقم العمود j ليلون خلاياها واحدة تلو الأخرى، ينتهي تلوين خلايا الصف بانتهاء الحلقة j والخروج منها وهو لايزال في نفس الحلقة i وقيمة i لم تتغير بعد، ثم يستدعي إجراءً فرعيًا اسمه Sub Values ولا تزال قيمة i نفسها أي أن الصف لم يتغير، فيدخل حلقة جديدة j يتنقل فيها بين خلايا الصف i نفسه بتغيير رقم العمود j ليملأ خلاياه خلية تلو الأخرى بثنائيات القيم إلى أن ينتهي من ملء خلايا الصف بانتهاء الحلقة j وخروجه منها وهو لايزال في نفس الحلقة i حيث أن قيمة i لم تتغير بعد فيملأ خلاياه بثنائيات من القيم تمثل رقم الصف ورقم العمود. إن عدم تعريفنا للمتغير j يعني أنه متغير على مستوى الإجراء فقط، وعند الانتقال من إجراء لآخر أثناء الاستدعاء يُفَرَّغ المتغير j من قيمته ليبدأ كمتغير جديد. نعرف بدايةً متغيرًا عامًّا i، ويكون التعريف خارج الإجراءات لتكون المتغيرات عامة على مستوى الوحدة البرمجية Module فيكون i صالحًا للاستخدام في كافة الإجراءات في تلك الوحدة البرمجية عند استدعاء أكثر من إجراء في تلك الوحدة يتضمن ذلك المتغير. ثم نكتب الإجراء الأول CellsLoop وبداخله استدعاء للإجراء الثاني Sub Values الذي يكتب بعده. Public i As Integer Sub CellsLoop() For i = 3 To 5 For j = 2 To 4 Worksheets("Sheet1").Cells(i, j).Interior.ColorIndex = i + 2 Next j Call SubValues Next i End Sub Sub SubValues() For j = 2 To 4 Worksheets("Sheet1").Cells(i, j) = i & "," & j Next j End Sub تنفيذ خطوة واحدة من الإجراء الأصلي أو كامل الإجراء الفرعي Step Over في VBA Exel إذا كانت الشيفرة في VBA تستدعي إجراءً آخر ، فقد لا نرغب في التنقل عبر كل سطر من التعليمات البرمجية في الإجراء الفرعي الذي نستدعيه. فيمكن استدعاء الإجراء الفرعي ككتلة واحدة باستخدام Step Over والاستمرار فورا في الخطوة التالية في تنفيذ الشيفرة في الإجراء الأصلي. تشبه Step Over الأمر Step Into من حيث تنفيذ خطوة واحد من الشيفرة البرمجية، غير أنها حين تصل إلى عبارة برمجية تحوي استدعاء إجراء فرعي تنفذه كوحدة كاملة دون الدخول في تفاصيله البرمجية خطوة خطوة. وينتقل مباشرة إلى السطر البرمجي الذي يلي الاستدعاء ضمن نفس الإجراء الأساسي دون أن يدخل في تفاصيل الإجراء الفرعي خطوة خطوة. لتنفيذ خطوة برمجية واحدة ضمن الإجراء الأساسي ننقر على علامة التبويب Debug من شريط القوائم Step Over، ولتنفيذ خطوة جديدة واحدة نكرر العملية لمراقبة التغيرات وإجراء أي تعديلات، يمكن الضغط على زري SHIFT + F8 معًا اختصارًا لـ Step Over في كل مرة نريد فيها تنفيذ خطوة برمجية واحدة داخل الإجراء لمراقبة التغييرات الحاصلة. ملاحظة: يجدر الإشارة أن Step Over لا تكون مفعلة إلا في وضع الإيقاف المؤقت لذلك لتنفيذ خطوة احدة أول مرة نبدأ بالأمر Step Into أول مرة ثم نستطيع أن نكمل بالأمر Step Over. وكما في الأمر Step Into، يُميَّز سطر الخطوة التالية باللون الأصفر مع سهم أصفر يشير إلى السطر عند تنفيذ السطر البرمجي بالأمر Step Over. مثال: بتطبيق الأمر Step Over على الشيفرة في المثال السابق: لاحظ كيف تنفذ Step Over السطر Call Sub Values كوحدة واحدة لتكتب الثنائيات في السطر i دون أن تدخل في تفاصيل الإجراء الفرعي. الخروج من الشيفرة Step Out في VBA Exel ينفذ الأمر Step Out في اكسل VBA الأسطر البرمجية المتبقية من الإجراء ويخرج منه، فإذا كان الإجراء أساسيًا أكمل تنفيذ الشيفرة كاملة بما تحويه من استدعاءات للإجراءات الفرعية، أما إن كان الإجراء فرعيًا فيُتم تنفيذ كل التعليمات البرمجية بين نقطة التنفيذ الحالية ونهاية الإجراء الفرعي لينهيه، وينتقل إلى الإجراء الأصلي Sub 1 عند العبارة البرمجية التي تلي استدعاء الإجراء الفرعي Call Sub 2 ليلونها بالأصفر. لإكمال تنفيذ كامل الإجراء الحالي ننقر على علامة التبويب Debug من شريط القوائم Step Over، أو اختصارًا نضغط على الأزرار CTRL + SHIFT + F8. كما في Step Over نلاحظ أن الخيار Step Out متوفر في وضع الإيقاف المؤقت break mode فقط. مثال: لتنفيذ الشيفرة السابقة حتى النقطة التي تسبق سطر الاستدعاء نضع المؤشر عند السطر الذي يحوي الاستدعاء ونعطي الأمر Run to Cursor بالنقر عليه من قائمة Debug من شريط القوائم. وبإعطاء الأمر Step Out من نفس القائمة نلاحظ أن البرنامج يتابع تنفيذ الشيفرة إلى نهايتها بما فيها استدعاء الإجراء الفرعي Sub Values. نمسح النتائج في إكسل ونعيد تنفيذ الشيفرة حتى النقطة التي تسبق سطر الاستدعاء بوضع المؤشر عند سطر الاستدعاء وإعطاء الأمر Run to Cursor بالضغط على مفاتيح الاختصار CTRL + F8، ثم نضغط F8 مرة أو مرتين لتنفيذ خطوة برمجية واحدة في كل مرة بحيث نصبح داخل الإجراء الفرعي Sub Values، ثم نعطي الأمر Step Out بالضغط على مفاتيح الاختصار CTRL + SHIFT + F8، نلاحظ البرنامج ينفذ الإجراء الفرعي Sub Values كاملًا ويخرج منه ثم يعود إلى السطر الذي يلي سطر الاستدعاء في الإجراء الأصلي CellsLoop، وبضغط مفاتيح الاختصار CTRL + SHIFT + F8 مرة ثانية ينهي الأمر Step Out تنفيذ الإجراء الأصلي أيضًا ويخرج منه. ملاحظة: يجب الانتباه عند تنفيذ الإجراءات المرتبطة في VBA، حيث أن تشغيل الإجراء الفرعي فقط دون استدعائه من الإجراء الأساسي يؤدي إلى خطأ في حال كان الإجراء الفرعي يحوي متغيرًا تنتج قيمته في الإجراء الأساسي. فإذا تم تشغيل الإجراء الأساسي بالكامل وخرج منه، تحتفظ المتغيرات على مستوى الوحدة البرمجية Module بآخر قيمة مخزنة فيها لتُستخدم تلك القيمة في الإجراءات الفرعية التي تشغل بعدها. أما إذا لم يشغَّل الإجراء الأساسي أولًا، أو إذا أعدنا تهيئة المتغيرات بالنقر على زر Reset، تبقى قيم جميع المتغيرات فارغة حتى تعطى قيمة داخل الإجراء. مثال: بتنفيذ الإجراء CellsLoop كاملًا في الشيفرة السابقة مع إجرائه الفرعي يخزِّن آخر قيمة فرضها للمتغير i ضمن الحلقة (تتراوح قيم المتغير i في الحلقة بين 3 و 5، فتتوقف الحلقة عن الدوران عندما i=6 لأنها تجاوزت المجال المعطى، وتبقى قيمة i=6 مخزنة حتى بعد إنهاء الإجراء والخروج منه لأنه متغير على مستوى الوحدة النمطية Module)، فإذا نفذنا الإجراء الفرعي وحده Sub Values بعد اكتمال تنفيذ الإجراء الأساسي، ينفذ الإجراء الفرعي باعتماد قيمة i المخزنة التي تساوي 6. ننقر على زر Reset لتفريغ المتغيرات من قيمها المخزنة لنبدأ من جديد وكأننا لم نشغل أي إجراء من قبل، ثم نشغل الإجراء الفرعي فتظهر رسالة خطأ فيها خيار Debug ننقر عليه فيتوقف البرنامج مؤقتًا في مكان الخطأ ويميَّز بالأصفر. نمرر مؤشر الفأرة فوق المتغيرات ببطء فتظهر قيمها أسفل المؤشر، فنلاحظ أن قيمة المتغير i تساوي الصفر الأمر الذي سبب الخطأ. خاتمة يُسهِّل الخطو في الشيفرة في VBA باستخدام الأدوات السابقة متابعة وتدقيق الشيفرة المكتوبة. وكلما كان المبرمج أكثر احترافًا ومرونة باستخدام هذه الأدوات ومعرفة تفاصيلها ومعرفة تفاصيلها الدقيقة، سهل عليه الإحاطة بنقاط الضعف أو الخلل في البرنامج لتصحيح الأخطاء وتصويب المسار. اقرأ أيضًا التعامل مع الأخطاء في VBA ضمن مايكروسوفت إكسل برمجة واجهات إدخال البيانات باستخدام مايكروسوفت إكسل VBA المتغيرات وأهم الكائنات في برمجة VBA في مايكروسوفت إكسل العمليات الشرطية في مايكروسوفت إكسل باستخدام VBA صناعة الدوال الخاصة والتعامل مع الأحداث في مايكروسوفت إكسل VBA التعامل مع الأخطاء في VBA ضمن مايكروسوفت إكسل
  3. قد يسهل علينا أثناء كتابة الشيفرة في برمجة VBA ضمن إكسل الإشارة إلى المراجع نسبة إلى الجدول أو المجال الموجودة فيه بدلًا من نسبته إلى ورقة العمل كاملة. سنستعرض أهم الأدوات التي تساعدنا في الإشارة إلى المراجع ضمن مجال في ورقة العمل في VBA Excel. يكون ذلك بالتعامل مع المجال ككائن وإضافة خاصية الصفوف Rows أو الأعمدة Columns أو المجال Range إليه. الإشارة إلى صفوف في مجال Range.Rows في VBA Exel يشار إلى الصفوف داخل مجال في إكسل VBA بالصيغة التالية: Range.Rows وترجع كائن مجال يمثل الصفوف الموجودة في المجال. حيث أن الخاصية Rows تعمل نسبةً للكائن Range المذكور قبلها في الشيفرة، وليس نسبةً لجدول البيانات بأكمله. مثال: الإجراء التالي يحدد الصف الثاني في المجال C3:I9 Worksheets("Sheet1").Range("C3:I9").Rows(2).Select الإشارة إلى أعمدة في مجال في VBA Exel يشار إلى الصفوف داخل مجال بالصيغة التالية: Range.Columns ترجع كائن مجال يمثل الأعمدة الموجودة في المجال. حيث أن الخاصية Columns تعمل نسبةً للكائن Range المذكور قبلها في الشيفرة، وليس نسبةً لجدول البيانات بأكمله. مثال: الإجراء التالي يحدد العمود الثالث في المجال C3:I9 Worksheets("Sheet1").Range("C3:I9").Columns(3).Select مثال: يلون الإجراء التالي الصف الثاني ثم يلون العمود الثالث في المجال C3:I9 باللون الزهري: Sub RangeRowsColumns() Worksheets("Sheet1").Range("C3:I9").Rows(2).Select Worksheets("Sheet1").Range("C3:I9").Columns(3).Select End Sub ملاحظة: عندما تطبق هاتان الخاصيتان على كائن مجال متعدد التحديد، ترجعان الصفوف والأعمدة في المنطقة الأولى فقط للمجال متعدد المناطق. مثال: يلون الإجراء التالي الصف الثاني ثم يلون العمود الثالث في التحديد باللون الزهري، فإذا حددنا أكثر من مجال طبق الإجراء على المجال الذي حددناه أولًا فقط. Sub RangeRowColٍSelection() Application.Selection.Rows(2).Interior.ColorIndex = 7 Application.Selection.Columns(3).Interior.ColorIndex = 7 End Sub ملاحظة: إذا نسبنا الصفوف أو الأعمدة إلى كائن ورقة العمل بشكل مباشر أشارت إلى صفوف وأعمدة في ورقة العمل عمومًا، ويعتبر هذا هو الخيار الافتراضي لكائني الصف والعمود، فإذا لم ننسب الصف أو العمود إلى كائن أشارا إلى صف أو عمود في كامل رقة العمل. مثال: فلتحديد الصف الثالث من الورقة Sheet1 يمكن استخدام أي من الشيفرتين التاليتين: Rows(3).Select Worksheets("Sheet1").Rows(3).Select الإشارة إلى الصف أو العمود الأخير في مجال معين في إكسل VBA إذا كان عدد الصفوف متغيرًا وفقًا للإدخالات اليدوية يمكن الإشارة إلى المجال لتنسيقه مثلًا أو إجراء عمليات حسابية أو منطقية عليه. يشار إلى ترتيب الصف الأخير في ورقة العمل باستخدام الخاصية Range.Rows.Count والتي ترجع عدد الصفوف في المجال. ويشار إلى ترتيب العمود الأخير في ورقة العمل باستخدام الخاصية Range.Columns.Count والتي ترجع عدد الأعمدة في المجال. يرجع الإجراء التالي عدد صفوف المجال C2:I9 في الخلية A1. ويرجع عدد أعمدته في الخلية في الخلية A2، ثم يكتب 7 في آخر خلية في المجال ثم يحددها. Sub LastRangeCell() Worksheets("Sheet1").Cells(1, 1) = Range("C2:I9").Rows.Count Worksheets("Sheet1").Cells(2, 1) = Range("C2:I9").Columns.Count Cells(Range("C2:I9").Rows.Count, Range("C2:I9").Columns.Count) = 7 Cells(Range("C2:I9").Rows.Count, Range("C2:I9").Columns.Count).Select End Sub الإشارة إلى مجال ضمن مجال آخر Range.Range في VBA Exel يشار إلى مجال داخل مجال آخر باستخدام الخاصية Range المتعلقة بالكائن Range: Range.Range ملاحظة: يمكن تطبيق الخاصية Range على نوعين من الكائنات: كائنات ورقة العمل أو كائنات المجال. فتطبيق خاصية المجال على كائن المجال Range.Range يشير إلى مجال داخل مجال آخر. في حين أن تطبيق خاصية المجال على كائن ورقة العمل Worksheets.Range يشير إلى مجال يتعلق بورقة العمل بأكملها. باستخدام الخاصية Range يمكن تغيير خصائص كامل المجال أو تطبيق تابع على جميع خلاياه مرة واحدة. حيث يجري التعامل مع المجال ككائن، واي خاصية تأتي بعده تطبق على هذا الكائن. مثال: يعرف الإجراء التالي متغيرًا يسميه OriginalRange ككائن مجال. Dim OriginalRange As Range ثم يسند إليه المجال C3:I9 من الورقة Sheet1. Set OriginalRange = Worksheets("Sheet1").Range("C3:I9") ثم ينسق خلاياه بإحاطتها بحدود ذات خط مستمر OriginalRange.Borders.LineStyle = xlContinuous هنا الخاصية Range تتبع ورقة العمل بأكملها حيث أنها أسندت إلى كائن ورقة العمل، نريد الآن تحديد المجال الذي يمتد بدءًا من الخلية الواقعة في الصف الثاني والعمود الثاني من المجال OriginalRange (الخلية D4) إلى الخلية الواقعة في الصف الرابع والعمود الخامس منه (الخلية G6). يمكن أن نسمي الخلية التي اسمها D4 نسبة لورقة العمل بالاسم B2 نسبة للمجال OriginalRange حيث أنها تقع في الصف الثاني والعمود الثاني منه. و نسمي الخلية التي اسمها G6 نسبة لورقة العمل بالاسم E4 نسبة للمجال OriginalRange حيث أنها تقع في الصف الرابع والعمود الخامس منه. فلتحديد المجال D4:G6 يمكن استخدام الشيفرة التالية: OriginalRange.Range("B2:E4").Select فتكون كامل الشيفرة: Sub RangeRange() Dim OriginalRange As Range Set OriginalRange = Worksheets("Sheet1").Range("C3:I9") OriginalRange.Borders.LineStyle = xlContinuous OriginalRange.Range("B2:E4").Select End Sub ملاحظة: لقد استخدمنا في المثال السابق اسم المجال OriginalRange عوضًا عن عنوانه في ورقة العمل Worksheets("Sheet1").Range("C3:I9") ومع ذلك، فعند استخدام أي منهما يعطي نفس النتيجة. الإشارة إلى المجال المستخدم في ورقة العمل في إكسل VBA يشار إلى المجال المستخدم في ورقة العمل باستخدام الخاصية Worksheets("اسم ورقة العمل").UsedRange كما يمكن استخدامها كخاصية تابعة لورقة العمل النشطة: ActiveSheet.UsedRange وترجع كائن مجال يمثل المجال الذي استُخدم في ورقة العمل. مثال: يحدد الإجراء التالي المجال المستخدم في ورقة العمل. نلاحظ أن المجال المشار إليه يتضمن جميع الخلايا بين أول وآخر خلية تحوي قيمةً أو تنسيقًا بما في ذلك كافة الفراغات التي بينهما. Sub MyUsedRange1() ActiveSheet.UsedRange.Select End Sub الإشارة إلى أطراف المجال في VBA Exel يشار إلى أطراف المجال باستخدام الخاصية End التي تنسب إلى المجال المصدر قبلها، ويأتي بعدها الاتجاه الذي يحدد منه طرف المجال. تكتب بالصيغة: Range(المجال الصدر).End(الاتجاه) المجال المصدر هو خلية مفردة يتحدد من صفها أو عمودها طرف المجال المطلوب، فإذا كان المجال المصدر مكونًا من أكثر من خلية اعتمدت الشيفرة على أول خلية فيه لتحديد طرف المجال. تنطلق الشيفرة من الخلية المصدر إلى الاتجاه المذكور لتقف عند أول خلية مليئة تصادفها تليها خلية فارغة. تُرجع الخاصية End كائن مجال يمثل الخلية الموجودة في نهاية المنطقة التي تحوي المجال المصدر وفق الاتجاه المذكور. تماثل في إكسل الضغط على زر END مع أزرار أسهم الاتجاهات الأربعة في لوحة المفاتيح. يبين الجدول التالي رموز الاتجاهات في VBA. table { width: 100%; } thead { vertical-align: middle; text-align: center; } td, th { border: 1px solid #dddddd; text-align: right; padding: 8px; text-align: inherit; } tr:nth-child(even) { background-color: #dddddd; } الرمز القيمة الاتجاه xlUp -4162 أعلى xlDown -4121 أسفل xlToRight -4161 إلى اليمين xlToLeft -4159 إلى اليسار يمكن كتابة الاتجاه بين قوسين في صيغة الشيفرة برمزه المبين في الجدول أو بقيمته الرقمية المبينة. مثال: يحدد الإجراء التالي أطراف المجال المكتوب انطلاقًا من الخلية المصدر H6 وفق الاتجاهات الأربعة على التوالي، طرف المجال هو نهاية الصف أو العمود الذي يمر من الخلية المصدر التي بداخله على أن تكون الخلايا بين الخلية المصدر وطرف المجال كلها مليئة ليس بينها خلايا فارغة: Sub RangeEnd() Range("H6").End(xlUp).Select Range("H6").End(xlDown).Select Range("H6").End(xlToRight).Select Range("H6").End(xlToLeft).Select End Sub كما يمكن كتابة الشيفرة بالرموز الرقمية للاتجاهات وتعطي نفس النتيجة: Sub RangeEnd2() Range("H6").End(-4162).Select Range("H6").End(-4121).Select Range("H6").End(-4161).Select Range("H6").End(-4159).Select End Sub ملاحظة: يجب أن تكون المنطقة من الخلية المصدر وفق الاتجاه المذكور عبارة عن خلايا متجاورة مليئة لا يفصل بينها خلايا فارغة. فإذا فصلت بينها خلايا فارغة انتهى المرجع إلى أول خلية مليئة تليها خلية فارغة. كما أن مدى المنطقة يتعلق فقط بصف وعمود الخلية المرجع وقد يكون أطول أو أقصر من مدى الأعمدة أو الصفوف المجاورة. مثال: نطبق الشيفرة السابقة على نهايات المجالات التي تمر من H6 في حالتين: الأولى المجالات أطول من مجاوراتها، والثانية نقطع مجالات الصفوف والأعمدة التي تمر من H6 بمسح محتويات أحد الخلايا من كل جانب ثم نقوم بتمييز الخلايا الفارغة لملاحظة التحديد الذي ينفذه الإجراء بعد التغيير: ملاحظة: إذا كانت الخلايا من المجال المصدر إلى الاتجاه المذكور عبارة عن خلايا فارغة، عندها تشير الشيفرة إلى نهايات ورقة الإكسل كاملة وفق تلك الاتجاهات. مثال: إذا طبقنا الإجراء السابق على نفس الجدول ومسحنا صف الخلية المصدر H6 وعمودها كاملين يحدد Range("H6").End(xlToRight).Select الخلية XFD6 الموجودة في الصف 6 نفسه والعمود XFD الذي هو آخر عمود في إكسل، كما يحدد Range("H6").End(xlDown).Select الخلية H1048576 المجودة في الصف رقم 1048576 الذي هو آخر صف في إكسل والعمود H. ملاحظة: إذا كانت المنطقة المحيطة بالخلية المصدر خلايا فارغة يليها خلايا مليئة انتقل التحديد إلى أقرب خلية مليئة من الخلية المصدر. مثال: نطبق الشيفرة السابقة على مجال يحوي خلية مصدر محاطة بخلايا فارغة يليها خلايا مليئة: يمكن استخدام الصيغة Range.End للإشارة إلى خلية البداية أو خلية النهاية لمجال. مثال: يحدد المثال التالي المجال من الخلية G9 إلى خلية النهاية العليا للمجال المكتوب انطلاقًا من الخلية المصدر H6 والتي تمثلها الصيغة Range("H6").End(xlUp)، ثم يحدد المجال من الخلية G9 إلى خلية النهاية اليسرى للمجال المكتوب انطلاقًا من الخلية المصدر H6 والتي تمثلها الصيغة Range("H6").End(xlToTeft): Sub RangEndSelect() Range("G9", Range("H6").End(xlUp)).Select Range(Range("H6").End(xlToTeft) ,"G9").Select End Sub مثال: يحدد المثال التالي المجالات انطلاقاً من الخلية المصدر إلى أطراف المجال الأربعة على التوالي: Sub Rang4EndSelect() Range("H6", Range("H6").End(xlUp)).Select Range(Range("H6").End(xlDown), "H6").Select Range(Range("H6").End(xlToRight), "H6").Select Range(Range("H6").End(xlToLeft), "H6").Select End Sub الخاتمة تعد الإشارة إلى المراجع ضمن مجال في ورقة العمل من الأساليب المهمة للإشارة إلى المجالات وتستخدم مختلف الصيغ لتختصر الوقت والجهد أثناء كتابة الشيفرات المتعلقة بالمجالات المكتوبة. وينبغي أن ننوه أنه على المبرمج حين يستخدم أية تابع أو صيغة برمجية أن يعرف كل تفاصيلها في جميع حالاتها تجنبًا لوقوعه في الأخطاء أولًا، وحتى يكتسب مهارات دقيقة تمكنه من حل المشاكل البرمجية بأقصر وأدق الأساليب. اقرأ أيضًا برمجة واجهات إدخال البيانات باستخدام مايكروسوفت إكسل VBA المتغيرات وأهم الكائنات في برمجة VBA في مايكروسوفت إكسل العمليات الشرطية في مايكروسوفت إكسل باستخدام VBA صناعة الدوال الخاصة والتعامل مع الأحداث في مايكروسوفت إكسل VBA التعامل مع الأخطاء في VBA ضمن مايكروسوفت إكسل
  4. ذكرنا في مقال أساسيات الإشارة إلى المراجع References في VBA Excel بعض الطرائق الأساسية للإشارة إلى المراجع، كما ذكرنا بعض أساليب الإشارة إلى المراجع ضمن مجال معين. لكن خلال سير البرنامج قد نحتاج طرائق أخرى تتعلق بأساليب متقدمة في الإشارة إلى المراجع في ورقة العمل على إكسل VBA، سنستعرض بعضًا منها. الإشارة إلى مرجع من عدة مجالات غير متجاورة في VBA Excel نشير في VBA Excel إلى عدة مجالات باستخدام تابع المجال Range أو تابع الدمج Union، كما نستخدم خاصية المناطق Areas للإشارة إلى مجموعة مجالات محددة في ورقة العمل. باستخدام الخاصية Range ونمط الترميز A1 يمكن الإشارة إلى أكثر من مجال باستخدام الخاصية Range في اكسل VBA بكتابة أسماء المجالات وفق نمط الترميز A1 بين علامتي اقتباس، حيث يشير الترميز A1 إلى أكثر من مجال بوضع علامة الفاصلة بين كل مجالين منفصلين أو أكثر. يحدد المثال التالي ثلاث مجالات في الورقة Sheet1 في نفس الوقت: Sub MultiRange() Worksheets("Sheet1").Range("C2:D4,G4:H7,B7:D9").Select End Sub باستخدام الخاصية Range مع المجالات المسماة يمكن تسمية المجال في VBA Excel قبل التعامل معه إما باستخدام الشيفرة أو بتسميته من صفحة الإكسل مباشرةً مما يُسهّل التعامل مع خصائص المجالات المتعددة. مثال: يسمي الإجراء التالي ثلاثة مجالات بالأسماء التالية: MyRange1 و MyRange2 و MyRange3 ثم يحددهم معًا باستخدام الشيفرة التالية: Sub NamedRangesSelect() ThisWorkbook.Names.Add Name:="MyRange1", RefersTo:=Worksheets("Sheet1").Range("C2:D4") ThisWorkbook.Names.Add Name:="MyRange2", RefersTo:=Worksheets("Sheet1").Range("G4:H7") ThisWorkbook.Names.Add Name:="MyRange3", RefersTo:=Worksheets("Sheet1").Range("B7:D9") Range("MyRange1,MyRange2,MyRange3").Select End Sub ملاحظة: يمكن الإشارة إلى المجالات المسماة مسبقًا في إكسل دون استخدام الكود وذلك بتحديد كل مجال ثم كتابة اسمه في حقل Name Box. باستخدام تابع الدمج Union يستخدم تابع الدمج Union في اكسل VBA لدمج عدة مجالات إلى كائن مجال واحد. مثال: ينشئ المثال التالي كائن مجال اسمه MyUniounRange يدمج فيه ثلاث مجالات منفصلة A1:B5 و D3:F4 و G5:I5 في كائن واحد. ثم يجعل خلاياه محاطةً بحدود من كافة الاتجاهات ومحتويات جميع الخلايا تساوي 10. تتميز هذه العملية بالسرعة في التنفيذ لكامل كائن المجال المدمج في نفس الوقت. Sub UniounRange() Dim Rg1 As Range, Rg2 As Range, Rg3 As Range, myUniounRange As Range Set Rg1 = Worksheets("Sheet1").Range("A1:B5") Set Rg2 = Worksheets ("Sheet1").Range("D3:F4") Set Rg3 = Worksheets ("Sheet1").Range("G5:I5") Set myUniounRange = Union(Rg1, Rg2, Rg3) myUniounRange.Value = 10 myUniounRange.HorizontalAlignment = xlHAlignCenter myUniounRange.Borders.LineStyle = xlContinuous End Sub باستخدام خاصية المناطق Area تستخدم خاصية المناطق Areas في اكسل VBA للإشارة إلى المجال المحدد في الورقة أو إلى مجموعة مجالات محددة معًا في الورقة. يحسب الإجراء التالي عدد المناطق في التحديد ويكتب النتيجة في الخلية C2. Sub RangeAreas() Worksheets ("Sheet1").Cells(2, 3) = Selection.Areas.Count End Sub الإشارة إلى جميع الخلايا في ورقة العمل في اكسل VBA نشير إلى جميع خلايا ورقة العمل في اكسل VBA بتطبيق الخاصية Cells عليها دون كتابة دليلي الصف والعمود. Worksheets("اسم ورقة العمل").Cells قد نحتاج للإشارة إلى جميع الخلايا في ورقة العمل لتنسيقها أو نسخها أو حذفها أو غير ذلك. مثال: يحدد الإجراء التالي جميع خلايا ورقة العمل في الصفحة Sheet1 في المصنف الحالي ويمسح محتوياتها: Sub SelectAllCels() Worksheets("Sheet1").Cells.ClearContents End Sub الإشارة إلى خلايا أو مجالات متعلقة بخلايا أخرى في اكسل VBA نشير للخلايا أو المجالات المتعلقة بخلايا أخرى في اكسل VBA باستخدام خاصية الإزاحة Offset. تستخدم عندما نحتاج إلى التعامل مع خلايا أو مجالات على بعد محدد من الخلايا التي نتعامل معها أثناء تنفيذ البرنامج. مثال: لإعطاء الأمر بتحديد الخلية التي على بعد صفين وعمودين من الخلية B3 التي تمثل الخلية Cells(3, 2). Sub offsetRanges() Worksheets("Sheet1").Cells(3, 2).Offset(2, 2).Select End Sub مثال: لإعطاء الأمر بجعل قيم المجال B1:B5 مساوية لقيم المجال H1:H5 (الذي يقع بانزياح أفقي 6 خلايا من العمود B1:B5 وعلى نفس البعد شاقولي بانزياح 0 خلية) ثم الأمر بتحديد المجال H1:H5. نلاحظ سرعة تطبيق الأوامر على كافة خلايا كائن المجال المدمج دفعة واحدة، بخلاف الطريقة التي تستخدم الخاصية Cells والتي تحتاج الدخول في حلقة تكرارية وتطبيق الأوامر على الخلايا واحدة تلو الأخرى. Sub offsetFill() Worksheets("Sheet1").Range("B1:B5").Value = Range("B1:E5").Offset(0, 6).Value End Sub الأمر بتحديد الخلايا في إكسل VBA تعطي الصيغة Select الأمر بالتحديد وتستخدم مع أوراق العمل والمجالات: فلتحديد مجال معين في ورقة معينة نحدد الورقة أولا بالصيغة: Worksheets("اسم ورقة العمل").Select ثم نحدد المجال في الورقة بالصيغة: Worksheets("اسم ورقة العمل").Range("عنوان أو اسم المجال").Select مثال: يحدد الإجراء التالي المجال B2:D4 في الورقة Sheet1: Sub ObjectSelect() Worksheets("Sheet1").Select Worksheets("Sheet1").Range("B2:D4").Select End Sub مثال: يرجع الإجراء التالي رسالة خطأ إذا كان الورقة الفعالة هي ورقة أخرى غير Sheet1 Sub ObjectSelect() Worksheets("Sheet1").Range("B2:D4").Select End Sub الإشارة إلى الخلايا المحددة في إكسل VBA نشير إلى الخلايا المحددة في ورقة العمل في VBA باستخدام كائن التحديد Selection وهو من كائنات التطبيق. ونعبر عنه بالصيغة: Application.Selection مثال: يضع الإجراء التالي حدودًا للمجال المحدد في ورقة العمل النشطة بالأزرق الفاتح ويكتب عنوان التحديد في الخلية B2: Sub SelectionRange() Application.Selection.Interior.ColorIndex = 20 Worksheets("Sheet1").Cells(2, 2) = Selection.Address End Sub يمكن أن يشير كائن التحديد Selection في إكسل VBA إلى أي كائن محدد في ورقة العمل النشطة في التطبيق، فإذا كان التحديد مجالًا فهو يرجع كائن مجال، وإذا كان مخططًا أو صورة أو كائنًا آخر فهو يرجع هذا الكائن، فإن لم يكن هناك أي تحديد فلا يرجع شيئًا. مثال: يبين الإجراء التالي نوع الكائن المحدد ويكتب النتيجة في الخلية B3: Worksheets("Sheet1").Cells(2, 3) = TypeName(Selection) فإذا كان الكائن شكلًا مستطيلً يرجع Rectangle، وإذا كان خطًا أو سهمًا يرجع Line، وإذا حددنا صورةً يرجع Picture، وإذا حددنا مربع نص مُدرج يرجع TextBox، وإذا حددنا مخططًا يرجع ChartObject، وإذا حددنا منطقة الرسم منه يرجع PlotArea، فإذا حددنا المخطط يرجع Series، وهكذا. الإشارة إلى الخلايا النشطة Active Cell في إكسل VBA الخلية النشطة Active Cell في إكسل VBA هي الخلية الفعالة في إكسل والتي يُكتب اسمها أو عنوانها في مربع الاسم. وهي خاصية من خصائص كائن التطبيق Application object، يعبر عنها بالصيغة التالية: Application.ActiveCell وترجع كائن مجال يمثل خلية واحدة Cell Object هي الخلية النشطة، ولا توجد خاصية ترجع كائن خلية إلا من خلال خاصية ActiveCell. مثال: الإجراء التالي يمسح كل محتوى ورقة العمل النشطة وتنسيقاتها ويكتب "الأهداف الذكية" في الخلية النشطة وحولها معاييرها الخمسة (محددة، قابلة للقياس، قابلة للتحقيق، ذات صلة، محددة زمنيًا) في خلايا تقع على تباعدات محددة من الخلية النشطة باستخدام التابع Offset K، كما يلون الخلية النشطة بالأخضر الفاتح. نسند الشيفرة البرمجية إلى الحدث Worksheet_SelectionChange، ليعاد تنفيذ الشيفرة كلما غيرنا التحديد في ورقة العمل النشطة. Private Sub Worksheet_SelectionChange(ByVal Target As Range) Worksheets("Sheet1").Cells.Clear Application.ActiveCell.Value = "الأهداف الذكية" Application.ActiveCell.Interior.ColorIndex = 4 Application.ActiveCell.Offset(-1, -2) = "قابلة للتحقيق" Application.ActiveCell.Offset(-1, 2) = "قابلة للقياس" Application.ActiveCell.Offset(-2, 0) = "محددة" Application.ActiveCell.Offset(2, -1) = "ذات صلة" Application.ActiveCell.Offset(2, 1) = "محدة زمنيًا" End Sub الإشارة إلى مجال في ورقة العمل النشطة في إكسل VBA نشير إلى مجال معين في ورقة العمل النشطة في إكسل VBA بالصيغة التالية: ActiveSheet.Range("اسم أو عنوان المجال المطلوب") وترجع مجالًا في ورقة العمل VBA النشطة في المصنف النشط. وفي حال عدم وجود ورقة عمل نشطة فلا تستجيب الخاصية ولا ترجع شيئًا. مثال: يحدد الإجراء التالي المجال A2:F3 في ورقة العمل النشطة أيًأ كانت، وكلما فعلنا ورقة جديدة يحدد الإجراء نفس المجال في الورقة الجديدة المفعلة. فإذا لم تكن هناك أية ورقة عمل مفعلة فلا يتغير التحديد. Sub MyActivesheet() Activesheet.Range("A2:F3").Select End Sub الإشارة إلى كامل الصفوف أو الأعمدة التي تحوي مجال محدد في VBA تشير الصيغة التالية إلى كامل الصف أو الصفوف التي تحوي مجال محدد: Range.EntireRow وتشير الصيغة التالية إلى كامل العمود أو الأعمدة التي تحوي مجال محدد: Range.EntireColumn ترجع كل من الصيغتين السابقتين كائن مجال Range object يمثل كامل الصفوف أو الأعمدة التي تحوي مجالًا محددًا. مثال: المثال التالي يمسح كل محتويات ورقة العمل ثم يرسم حدودًا حول كامل الصفوف والأعمدة التي تتضمن المجال الذي نحدده، وبإسناد الشيفرة إلى حدث تغيير التحديد، يعاد تنفيذ الشيفرة كلما غيرنا التحديد. Private Sub Worksheet_SelectionChange(ByVal Target As Range) Worksheets("Sheet1").Cells.Clear Application.Selection.EntireRow.Borders.LineStyle = xlContinuous Application.Selection.EntireColumn.Borders.LineStyle = xlContinuous End Sub الإشارة إلى الصف أو العمود الأخير في ورقة العمل في إكسل VBA نشير إلى ترتيب الصف الأخير في ورقة العمل VBA باستخدام الخاصية Rows.Count والتي ترجع عدد الصفوف في ورقة العمل 1048576. ونشير إلى ترتيب العمود الأخير في ورقة العمل باستخدام الخاصية Columns.Count والتي ترجع عدد الأعمدة في ورقة العمل 16384. يرجع الإجراء التالي عدد الصفوف في ورقة العمل 1048576 في الخلية A1. ويرجع عدد الأعمدة في ورقة العمل 16384 في الخلية A2، ثم يكتب الرقم 7 في آخر خلية في ورقة العمل ثم يحددها. Sub LastCell() Worksheets("Sheet1").Cells(1, 1) = Rows.Count Worksheets("Sheet1").Cells(2, 1) = Columns.Count Cells(Rows.Count, Columns.Count) = 7 Cells(Rows.Count, Columns.Count).Select End Sub ملاحظة: هذه الصيغ أكثر استخدامًا مع الكائن Range والكائن UsedRange والكائن Selection لترجع الصف الأخير Range.Rows.Count والعمود الأخير Range.Columns.Count من تلك المجالات. خاتمة استعرضنا أهم الأساليب المتقدمة التي تشير إلى الخلايا والمجالات في ورقة العمل في إكسل VBA والتي لا تقل أهمية عن الطرائق الأساسية التي تشير إلى المجالات المذكورة في مقال الإشارة إلى المراجع ضمن مجال في ورقة العمل حيث لكل طريقة مميزاتها التي تلبي حاجة معينة أثناء كتابة شيفرة معينة قد لا يستطيع غيرها من الطرائق تلبيتها بنفس السرعة والجودة أو حتى قد تكون هي الطريقة الوحيدة التي تحل المشكلة وفقًا لآلية سير عمل الشيفرة. اقرأ أيضًا برمجة واجهات إدخال البيانات باستخدام مايكروسوفت إكسل VBA المتغيرات وأهم الكائنات في برمجة VBA في مايكروسوفت إكسل العمليات الشرطية في مايكروسوفت إكسل باستخدام VBA صناعة الدوال الخاصة والتعامل مع الأحداث في مايكروسوفت إكسل VBA التعامل مع الأخطاء في VBA ضمن مايكروسوفت إكسل
  5. نحتاج في كثير من الأحيان عند تنفيذ برنامج باستخدام برمجة VBA ضمن إكسل إلى الإشارة إلى مراجع References معينة في VBA Excel بأسلوب معين تفرضه معطيات البرنامج. يمكن أن يكون المرجع واحدًا أو أكثر من العناصر التالية: الخلايا الصفوف الأعمدة كتل الخلايا المتجاورة أو غير المتجاورة في ورقة عمل واحدة. مجال ثلاثي الأبعاد (3D Range) المجال ثلاثي الأبعاد هو المجال الذي يشير ضمنه إلى مجالات في أكثر من ورقة. الإشارة إلى مرجع من خلية واحدة في VBA باستخدام برمجة VBA في إكسل يمكن الإشارة إلى مرجع مؤلف من خلية واحدة بأكثر من طريقة قد يلزم استخدام إحداها دون أخرى أثناء تنفيذ البرنامج، سنذكر بعض هذه الطرائق. باستخدام الخاصية Cells ترجع هذه الخاصية كائن مجال يمثل خلية واحدة. وتستخدم للإشارة إلى خلية مفردة بدلالة الرقمين الذين يدلان على ترتيب الصف والعمود في ورقة العمل بين هلالين تفصل بينهما علامة الفاصلة "," كما يلي: Worksheets("Sheet1").Cells(دليل الصف, رقم العمود) يمكن أن يكون دليل العمود الرقم الذي يدل على ترتيبه بين الأعمدة ابتداءً من العمود A. أو أن يكون دليل العمود هو الحرف اللاتيني الذي يمثل اسم العمود بين علامتي اقتباس: مثال: تنفيذ أمر تحديد الخلية B3 باستخدام دليل اسم العمود: Worksheets("Sheet1").Cells(3, "B").Select ولتنفيذ نفس الأمر باستخدام دليل ترتيب العمود (2): Worksheets("Sheet1").Cells(3, 2).Select تفيد الخاصية Cells خصوصًا في الحلقات التي يكون فيها دليل الصف أو العمود متغيرًا، إذ يمكن كتابة الدليلين باستخدام متغير: Cells(i, j).Select مثال: في الإجراء التالي ينتقل التحديد إلى كل خلية في الجدول A1:F5 باستخدام حلقة تكرارية، وتتلون الخلية بحسب رقم الصف. لاحظ الوقت الطويل الذي يستغرقه البرنامج للانتقال والتنسيق، سنستعرض لاحقًا أساليب أكثر سرعة في التنفيذ. يمكن مراجعة المقال استخدام أدوات مايكروسوفت إكسل لتنسيق الخلايا عن طريق الشيفرات VBA والمقال الحلقات التكرارية في مايكروسوفت إكسل باستخدام VBA. Sub CellsLoop() أضفنا إشارة Breakpoint إلى بعض اﻷسطر، ومهمة هذه اﻹشارة هي إيقاف تنفيذ الشيفرة البرمجية VBA مؤقتًا إلى حين إعطاء الأمر يدويًا بمتابعة تنفيذ البرنامج من حيث توقف. تستخدم هذه اﻹشارة لمتابعة أداء البرنامج خطوة بخطوة عند السطر المحدد للتحقق من صحة سير عمل البرنامج، وفي هذه الحالة هنا وضعنا إشارة Breakpoint في نهاية كلا الحلقتين For ليتوقف البرنامج مؤقتًا بعد إكمال دورة حلقة واحدة، إذ نلاحظ أننا حددنا السطر المطلوب ثم ذهبنا إلى القائمة Debug > ToggleBreakpoint، ونستطيع إضافة أي نقاط توقف أخرى بالنقر بجانب الأسطر المطلوب التوقف عندها كما هو موضح بالصورة السابقة. ولمتابعة تنفيذ البرنامج يلزم إما الضغط على الزر F5 أو النقر على زر Run لمتابعة تنفيذ الإجراء. لفهم الأساسيات أكثر اقرأ المقال مدخل إلى البرمجة باستخدام VBA في مايكروسوفت إكسل. كما يمكن وضع إشارة Breakpoint بمجرد النقر في المنطقة الرمادية في المكان الذي تظهر فيه إشارة الدائرة بجوار السطر الذي سيتوقف تنفيذ البرنامج عنده. باستخدام الخاصية Range في نمط المرجع A1 ويكون ذلك بكتابة اسم الخلية وفق النمط A1 بين علامتي اقتباس في الخاصية Range. Worksheets("Sheet1").Range("اسم الخلية وفق النمط A1") مثال: تنفيذ أمر تحديد الخلية B3 باستخدام الخاصية Range وفق نمط المرجع A1: Worksheets("Sheet1").Range("B3").Select ملاحظة: يستخدم الإكسل افتراضيًا نمط المرجع A1، والذي يشير إلى الأعمدة بواسطة أحرف (من A إلى XFD) وإلى الصفوف بواسطة أرقام (من 1 إلى 1048576) . حيث يشار إلى خلية ما في VBA Excel بإدخال حرف العمود متبوعًا برقم الصف بين علامتي اقتباس. باستخدام الخاصية Range والخاصية Cells يجب كتابة خلية البداية وخلية النهاية للمجال المطلوب بين هلالين باستخدام الخاصية Cells يفصل بينها فاصلة ","، فإذا كان المجال خلية واحدة، كانت خلية البداية هي نفسها خلية النهاية. Worksheets("Sheet1").Range(Cells(رقم صف خلية البداية, رقم عمود خلية البداية), Cells(رقم صف خلية البداية, رقم عمود خلية البداية)) قد يكون المجال متغير الطول أثناء تنفيذ الإجراء ويصادف أن تكون خلية البداية هي نفسها خلية النهاية فيشير المجال حينها إلى خلية واحدة. مثال: لتنفيذ أمر بتحديد الخلية B3 في ورقة العمل الحالية باستخدام الخاصية Range والخاصية Cells: Worksheets("Sheet1").Range(Cells(3, 2), Cells(3, 2)).Select الإشارة إلى الأسطر والأعمدة سوف نذكر طريقتين للإشارة إلى الأسطر والأعمدة لكل طريقة استخدامها بحسب الخصائص التي توفرها كل طريقة: باستخدام الخاصية Range يشار إلى كامل الأسطر المتجاورة بكتابة رقم سطر البداية ورقم سطر النهاية مفصولين بعلامة النقطتين ":"، فلتحديد الأسطر من 2 إلى 5: Worksheets("Sheet1").Range("2:5").select ولتحديد الصف الرابع فقط: Worksheets("Sheet1").Range("4:4").select يشار إلى كامل الأعمدة المتجاورة بكتابة اسم الحرف اللاتيني الذي يمثل عمود البداية واسم عمود النهاية مفصولين بعلامة النقطتين ":"، فلتحديد الأعمدة من B إلى E: Worksheets("Sheet1").Range("B:E").select لتحديد العمود F فقط: Worksheets("Sheet1").Range("F:F").select باستخدام الخاصيتين Rows و Columns يشار إلى كامل الصف باستخدام الخاصية Rows وترتيب الصف في ورقة العمل بين قوسين: Worksheets("Sheet1").Rows(ترتيب الصف) يشار إلى كامل العمود باستخدام الخاصية Columns وترتيب العمود في ورقة العمل بين قوسين: Worksheets("Sheet1"). Columns(ترتيب العمود) يمكن الإشارة إلى العمود بكتابة دليل اسم العمود بدلًا من ترتيبه في الورقة: Worksheets("Sheet1"). Columns(اسم العمود) مثال: الإجراء التالي يلون كامل الصف الثاني بالأخضر وكامل العمود الثالث (العمود C) بالأزرق وكامل العمود "E" بالأحمر. Sub RowsColumnsColor() إذا لم يحدَّد دليل الصف أو العمود دلت الشيفرة على كافة الأسطر أو الأعمدة. مثال: يعطي الإجراء التالي أمرًا بتحديد ارتفاع جميع صفوف الورقة إلى 20 وتحديد عرض جميع أعمدة الورقة إلى 20. Sub allRowsColumns() الإشارة إلى مرجع من الخلايا المتجاورة يشار إلى المرجع المؤلف من خلايا متجاورة باستخدام الخاصية Range بطريقتين: باستخدام الخاصية Range في نمط المرجع A1 يمكن الإشارة إلى مجال من الخلايا المتجاورة كمرجع VBA بكتابة المجال بين هلالين وفق النمط A1 بين علامتي اقتباس بعد الخاصية Range بكتابة خلية البداية وخلية النهاية للمجال تفصل بينهما علامة النقطتين (:). Worksheets("Sheet1").Range("عنوان المجال وفق النمط A1") المثال التالي يحدد الخلايا منA1 إلى B5. Worksheets("Sheet1").Range("A1:B5").select باستخدام الخاصية Range والخاصية Cells بكتابة خلية البداية وخلية النهاية للمجال المطلوب باستخدام الخاصية Cells تفصل بينهما علامة الفاصلة (,). Worksheets("Sheet1").Range(Cells(خلية البداية), Cells(خلية النهاية)) مثال: يزيد الإجراء التالي طول التحديد بدءًا من الخلية B1 إلى الخلية B10 أثناء التنفيذ وإعطاء كل تحديد لونًا جديدًا. Sub ChangeColorSelection() فللإشارة إلى مجال يجب الكتابة وفق السلسلة الهرمية التالية حيث يفصل بين الكائن والكائن الذي يليه في التسلسل الهرمي بنقطة (.). Application.workbook ("اسم مصنف الإكسل"). worksheets("اسم ورقة العمل").Range("المجال المطلوب") يلزم ذكر المسار الهرمي كاملًا إذا كان التعامل مع أكثر مصنف أو أكثر من ورقة عمل، أما في حال كان العمل ضمن نفس المصنف فيمكن استثناء الإشارة إلى كائن مصنف الإكسل، وإذا كان العمل في نفس الورقة النشطة يمكن استثناء الإشارة إلى كائن ورقة العمل، ويشار إلى المجال بالشكل: . Range("المجال المطلوب") يجب الانتباه إلى أنه لا يجوز إهمال ذكر اسم الورقة خصوصًا إذا كان البرنامج يتعامل مع أكثر من ورقة عمل أو أن الإجراء يقصد به ورقة عمل بعينها. فيكتب المجال غالبا بالشكل: worksheets("اسم ورقة العمل").Range("المجال المطلوب") الإشارة إلى الخلايا المتجاورة باستخدام الترميز المختصر يُكتب المجال وفق نمط المرجع A1 في VBA داخل أقواس مربعة اختصارًا دون الحاجة لكتابة كلمة Range أو استخدام علامات الاقتباس، كما يمكن كتابة اسم المجال المسمى داخل أقواس مربعة. فمثلًا لتحديد المجال B2:C4 باستخدام الاختصار والنمط A1: Worksheets("Sheet1").[B2:C4].select مثال: ينشئ الإجراء التالي كائن مجال وتسميته A2:F5 ثم يحدده باستخدام الترميز المختصر. Sub ShortcutRangeName() خاتمة قد تكون الشيفرة البرمجية طويلة ومعقدة، وقد تفرض علينا المعطيات أسلوبًا معينًا للإشارة إلى المراجع دون غيره، ذكرنا في هذا المقال الأساليب الأساسية للإشارة إلى المرجع في VBA، إذ تأتي مهارة المبرمج بمعرفته لهذه الأساليب، ومتى يستخدم كل أسلوب بطريقة صحيحة. اقرأ أيضًا برمجة واجهات إدخال البيانات باستخدام مايكروسوفت إكسل VBA المتغيرات وأهم الكائنات في برمجة VBA في مايكروسوفت إكسل العمليات الشرطية في مايكروسوفت إكسل باستخدام VBA صناعة الدوال الخاصة والتعامل مع الأحداث في مايكروسوفت إكسل VBA التعامل مع الأخطاء في VBA ضمن مايكروسوفت إكسل
  6. عندما تنزل إلى نهاية الصفحة الحالية او اية صفحة من اي تطبيق من تطبيقات حسوب ستجد روابط جميع تطبيقات حسوب وعلى راسها "أنا" . لن تندم ابدا ان تجولت فيها.
×
×
  • أضف...