قد يسهل علينا أثناء كتابة الشيفرة في برمجة 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.
الرمز | القيمة | الاتجاه |
---|---|---|
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
اقتباسملاحظة: الاتجاهان xlToRight و xlToLeft نسبةً للاتجاه الافتراضي لورقة العمل في إكسل الذي هو من اليسار إلى اليمين، فإذا عكسنا اتجاه الورقة من Page Layout \< Sheet Right-to-Left فأصبح من اليمين إلى اليسار، أصبحت الرموز تعطي مدلولًا معاكسًا: xlToRight إلى اليسار و xlToLeft إلى اليمين وفقًا لاتجاه الصفحة الجديد، فالمقصود بـ xlToRight بالاتجاه الذي يزداد فيه ترتيب الأعمدة، ويقصد بـ xlToLeft بالاتجاه الذي يتناقص فيه ترتيب الأعمدة، بشكل مشابه لاتجاه محور الإحداثيات.
ملاحظة: يجب أن تكون المنطقة من الخلية المصدر وفق الاتجاه المذكور عبارة عن خلايا متجاورة مليئة لا يفصل بينها خلايا فارغة. فإذا فصلت بينها خلايا فارغة انتهى المرجع إلى أول خلية مليئة تليها خلية فارغة. كما أن مدى المنطقة يتعلق فقط بصف وعمود الخلية المرجع وقد يكون أطول أو أقصر من مدى الأعمدة أو الصفوف المجاورة.
مثال: نطبق الشيفرة السابقة على نهايات المجالات التي تمر من 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
الخاتمة
تعد الإشارة إلى المراجع ضمن مجال في ورقة العمل من الأساليب المهمة للإشارة إلى المجالات وتستخدم مختلف الصيغ لتختصر الوقت والجهد أثناء كتابة الشيفرات المتعلقة بالمجالات المكتوبة. وينبغي أن ننوه أنه على المبرمج حين يستخدم أية تابع أو صيغة برمجية أن يعرف كل تفاصيلها في جميع حالاتها تجنبًا لوقوعه في الأخطاء أولًا، وحتى يكتسب مهارات دقيقة تمكنه من حل المشاكل البرمجية بأقصر وأدق الأساليب.
أفضل التعليقات
لا توجد أية تعليقات بعد
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.