TOP

VBA-الدرس 13.1. استخدام المصفوفات (Arrays)

غالبًا ما تستخدم المصفوفات (Arrays) في البرمجة ، بما في ذلك في Excel VBA.

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

يمكن الوصول إلى المصفوفة ككل إذا كنت تريد الرجوع إلى جميع القيم التي تحتوي عليها ، أو يمكنك الرجوع إلى عناصرها الفردية.

يمكنك التصريح عن مصفوفة للعمل مع مجموعة من القيم من نفس نوع البيانات. لقد غطينا هذا بالفعل في VBA-Lesson 6.2. Datatypes لكن دعونا نتعمق أكثر الآن ...

لماذا تستخدم المصفوفات؟

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

السبب الثاني لاستخدام المصفوفات هو سرعتها. تستغرق قراءة البيانات من المصفوفات وقتًا أقل بكثير من قراءة الجداول (المكونة من خلايا) في ورقة العمل Excel.


مثال على استخدام المصفوفات

هذا مثال سيُظهر الميزة الواضحة لاستخدام المصفوفات VBA في Excel.

تحتوي ورقة العمل الأولى ("DS") على مجموعة بيانات: 5000 صف في 3 أعمدة:

في الورقة الثانية ، ستجد جدولًا ملخصًا يأخذ في الاعتبار جميع إجابات "نعم" ("YES") حسب السنة والعميل:

في هذه الحالة ، سيستخدم الإجراء حلقة لمعالجة مجموعة البيانات وتسجيل عدد الردود بـ "نعم" لكل عام وكل رقم عميل ، ثم إدخال تلك البيانات في الخلايا المناسبة.

بدون استخدام المصفوفات ، قد يستغرق تنفيذ هذا الإجراء Excel 131.44 ثانية:

ولكن لحفظ البيانات أولاً في مصفوفة (من ورقة عمل "DS") ثم إجراء نفس العمليات الحسابية (باستخدام المصفوفات بدلاً من مجموعة بيانات ورقة العمل "DS") سيستغرق 1.74 ثانية فقط:

إذا قررنا تحسين إجراءاتنا من خلال تخزين البيانات التي تحتوي فقط على استجابات "YES" في المصفوفة (والتي تمثل حوالي 3/4 من إجمالي البيانات) ، فسيستغرق الأمر 1.02 ثانية فقط:

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

سنعود إلى تفاصيل مثالنا في نهاية الدرس.

التصريح عن المصفوفات

فيما يلي بعض الأمثلة لتصريح المصفوفات في VBA (إذا لم يكن المثالان الأولان واضحين لك ، اقرأ it):

 'مثال على إعلان مصفوفة أحادية البعد
 Dim array1(4)

 'مثال على إعلان مصفوفة ثنائية الأبعاد
 Dim array2(6, 1)

 'مثال على إعلان مصفوفة ديناميكية
 Dim array3()

إذا لم تتمكن من إدخال قيم ثابتة عند التصريح عن المصفوفات (لأنها تعتمد ، على سبيل المثال ، على حجم مجموعة البيانات) ، فاترك الأقواس فارغة.

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

تخزين البيانات في صفيف

دعنا نحاول تخزين بعض البيانات في مصفوفة:

نريد تخزين قيم 11x1 في هذه الحالة ، لذلك نحتاج إلى إنشاء مصفوفة أحادية البعد:

 'تصريح
 Dim array_example(10)

لا تنس أن ترقيم العناصر في المصفوفة يبدأ بالرقم 0 (هذا أمر قياسي في البرمجة ، لذا فإن الأمر يستحق الدخول في هذه العادة على الفور ، على الرغم من أنه ، في الواقع ، يمكنك تغيير هذا الأسلوب في VBA).

سيحصل كل عنصر في المصفوفة الآن على قيمته:

 'حفظ القيم في المصفوفة
 array_example(0)  = Range("A2")
 array_example(1)  = Range("A3")
 array_example(2)  = Range("A4")
 array_example(3)  = Range("A5")
 array_example(4)  = Range("A6")
 array_example(5)  = Range("A7")
 array_example(6)  = Range("A8")
 array_example(7)  = Range("A9")
 array_example(8)  = Range("A10")
 array_example(9)  = Range("A11")
 array_example(10) = Range("A12")

يمكنك العمل على كل عنصر من عناصر المصفوفة أو تعديله كما لو كان متغيرًا عاديًا.

التالي مثال حيث نستخدم array_example (8):

Sub example()
     'تصريح
     Dim array_example(10)
     
     'حفظ القيم في المصفوفة
     array_example(0)  = Range("A2")
     array_example(1)  = Range("A3")
     array_example(2)  = Range("A4")
     array_example(3)  = Range("A5")
     array_example(4)  = Range("A6")
     array_example(5)  = Range("A7")
     array_example(6)  = Range("A8")
     array_example(7)  = Range("A9")
     array_example(8)  = Range("A10")
     array_example(9)  = Range("A11")
     array_example(10) = Range("A12")
     
     'اختبار 1
     MsgBox array_example(8) '=> العوائد: 04/02/2016
    
     'تغيير إحدى القيم
     array_example(8) = Year(array_example(8))
     
     'اختبار 2
     MsgBox array_example(8) '=> العوائد: 2016
End Sub

ستكون حلقة For خيارًا أفضل لحفظ المصفوفة بشكل أسرع:

 'تصريح
 Dim array_example(10)

 'حفظ القيم في المصفوفة
 For i = 0 To 10
    array_example(i) = Range("A" & i + 2)
 Next