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

الإشارة إلى المراجع ضمن مجال في ورقة العمل في VBA Excel


Siba Abo Aloioon

قد يسهل علينا أثناء كتابة الشيفرة في برمجة 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

001-تلوين-صف-أو-عمود-ضمن-مجال.png

ملاحظة: عندما تطبق هاتان الخاصيتان على كائن مجال متعدد التحديد، ترجعان الصفوف والأعمدة في المنطقة الأولى فقط للمجال متعدد المناطق.

مثال: يلون الإجراء التالي الصف الثاني ثم يلون العمود الثالث في التحديد باللون الزهري، فإذا حددنا أكثر من مجال طبق الإجراء على المجال الذي حددناه أولًا فقط.

Sub RangeRowColٍSelection()
    Application.Selection.Rows(2).Interior.ColorIndex = 7 
    Application.Selection.Columns(3).Interior.ColorIndex = 7    
End Sub

تلوين صف وعمود في التحديد في اكسل vba

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

مثال: فلتحديد الصف الثالث من الورقة 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

الإشارة-إلى-مجال-ضمن-مجال في اكسل vba

ملاحظة: لقد استخدمنا في المثال السابق اسم المجال OriginalRange عوضًا عن عنوانه في ورقة العمل Worksheets("Sheet1").Range("C3:I9") ومع ذلك، فعند استخدام أي منهما يعطي نفس النتيجة.

الإشارة إلى المجال المستخدم في ورقة العمل في إكسل VBA

يشار إلى المجال المستخدم في ورقة العمل باستخدام الخاصية

Worksheets("اسم ورقة العمل").UsedRange

كما يمكن استخدامها كخاصية تابعة لورقة العمل النشطة:

    ActiveSheet.UsedRange

وترجع كائن مجال يمثل المجال الذي استُخدم في ورقة العمل.

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

Sub MyUsedRange1()
    ActiveSheet.UsedRange.Select
End Sub

Used-Range-Select

الإشارة إلى أطراف المجال في 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 بالاتجاه الذي يتناقص فيه ترتيب الأعمدة، بشكل مشابه لاتجاه محور الإحداثيات.

Range-End.gif

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

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

RangeBlanks-End

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

مثال: إذا طبقنا الإجراء السابق على نفس الجدول ومسحنا صف الخلية المصدر H6 وعمودها كاملين يحدد Range("H6").End(xlToRight).Select الخلية XFD6 الموجودة في الصف 6 نفسه والعمود XFD الذي هو آخر عمود في إكسل، كما يحدد Range("H6").End(xlDown).Select الخلية H1048576 المجودة في الصف رقم 1048576 الذي هو آخر صف في إكسل والعمود H.

008-RangeAllBlanks-End.gif

ملاحظة: إذا كانت المنطقة المحيطة بالخلية المصدر خلايا فارغة يليها خلايا مليئة انتقل التحديد إلى أقرب خلية مليئة من الخلية المصدر.

مثال: نطبق الشيفرة السابقة على مجال يحوي خلية مصدر محاطة بخلايا فارغة يليها خلايا مليئة:

تطبيق شيفرة على مجال يحوي خلية مصدر محاطة بخلايا فارغة تليها خلايا مليئة

يمكن استخدام الصيغة 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

End

مثال: يحدد المثال التالي المجالات انطلاقاً من الخلية المصدر إلى أطراف المجال الأربعة على التوالي:

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

End

الخاتمة

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

اقرأ أيضًا


تفاعل الأعضاء

أفضل التعليقات

لا توجد أية تعليقات بعد



انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أضف تعليق

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • أضف...