TOP

VBA الدرس 13.2. استخدام المصفوفات (Arrays) (تابع)


من أجل تخزين أكثر من عمود واحد من البيانات ، نحتاج إلى بُعد مختلف للصفيف. مثال:

حفظ البيانات في مصفوفة ثنائية الأبعاد:

 'تصريح
 Dim array_example(10, 2) 'مجموعة 11 × 3 "محددة"

 'حفظ البيانات في مصفوفة
 For i = 0 To 10
     array_example(i, 0) = Range("A" & i + 2)
     array_example(i, 1) = Range("B" & i + 2)
     array_example(i, 2) = Range("C" & i + 2)
 Next

فيما يلي بعض الأمثلة على العمل بهذه القيم:

MsgBox array_example(0, 0)  '=> العوائد: 03.11.2026
MsgBox array_example(0, 1)  '=> العوائد: 24
MsgBox array_example(9, 2)  '=> العوائد: NO
MsgBox array_example(10, 2) '=> العوائد: YES

مجموعة ديناميكية

دعنا نتخيل للحظة أننا بحاجة إلى تحديث البيانات في المصفوفة الخاصة بنا على أساس منتظم ، وبالتالي لا يمكننا تعيين قيم ثابتة في وقت الإعلان ...

لمعرفة رقم صف آخر خلية غير فارغة ، أو بعبارة أخرى ، الصف الأخير من قاعدة البيانات الخاصة بنا ، سنستخدم الصيغة التالية:

last_row = Range("A1").End(xlDown).Row

Excel لا يقبل المتغيرات في التصريح.

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

Dim array_example()
ReDim array_example(last_row - 2, 2)

باستخدام الإجراء التالي ، يمكنك تخزين جميع صفوف مجموعة البيانات (الجدول) في صفيفنا:

Dim array_example()
ReDim array_example(last_row - 2, 2)

أوبوند

في المثال السابق ، كان الرقم الأخير في المصفوفة هو last_row - 2:

For i = 0 To last_row - 2

هناك طريقة أخرى لتحديد الرقم الأخير في المصفوفة الخاصة بنا وهي استخدام Ubound:

For i = 0 To UBound(array_example)

ترجع هذه الدالة أكبر رقم في المصفوفة للبعد المحدد (البعد الأول هو الافتراضي).

فيما يلي بعض الأمثلة التي ستوضح ذلك بشكل أكبر:

Sub example()
     Dim array_example(10, 2)
     
     MsgBox UBound(array_example)    '=> العوائد: 10
     MsgBox UBound(array_example, 1) '=> العوائد: 10
     MsgBox UBound(array_example, 2) '=> العوائد: 2
End Sub

حفظ البيانات في مجموعة من عناصر المصفوفة

من الممكن تعبئة صفيف بقيم من نطاق من الخلايا في ورقة عمل دون استخدام حلقة:

 'تصريح
 Dim array_example(10, 2) 'مجموعة 11 × 3 "محددة"

 'حفظ البيانات في مصفوفة
 For i = 0 To 10
     array_example(i, 0) = Range("A" & i + 2)
     array_example(i, 1) = Range("B" & i + 2)
     array_example(i, 2) = Range("C" & i + 2)
 Next

يمكن استبدال الكود السابق بشكل فعال بهذا:

 'تصريح
 Dim array_example()

 'حفظ البيانات في مصفوفة
 array_example = Range("A2: C12").Value

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

إذا قمت بتخزين البيانات في المصفوفة الخاصة بك بهذه الطريقة ، فسيكون الرقم الأول 1 بدلاً من 0 ، مما قد يتسبب في حدوث ارتباك ...

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

لكن هذه الطريقة الثانية مفيدة جدًا إذا كنت بحاجة إلى حفظ المحتويات الكاملة لمجموعة بيانات كبيرة ، لأنها أسرع من التكرار (توفير حوالي 0.2 ثانية لكل 15000 سجل).

صفيف (Array)

ولكن إذا كنت بحاجة إلى إنشاء مصفوفة تحتوي على محتويات "ثابتة".

قد يكون أحد الحلول هو تسجيل القيم شريطًا بشريط:

Dim en(5)

en(0) = "IF"
en(1) = "VLOOKUP"
en(2) = "SUM"
en(3) = "COUNT"
en(4) = "هو رقم"
en(5) = "MID"

لحسن الحظ ، يمكنك تبسيط هذا الرمز باستخدام مصفوفة ( Array):

en = Array("IF", "VLOOKUP", "SUM", "COUNT", "هو رقم", "MID")

إليك عرض توضيحي لاستخدام الوظيفة Replace (سيساعدك هذا على فهم المثال التالي):

Sub replace_example()
     Dim var_translate As String

     'شريط نصي لهذا المثال
     var_translate = "Hello World !"
     
     'استبدل "World" بكلمة "you" في شريط النص
     var_translate = Replace(var_translate, "World", "you")

     'الشريط بعد الاستبدال
     MsgBox var_translate '=> تسترجع "Hello you!"
End Sub

الآن ، إذا أردنا استبدال سلسلة من القيم بمجموعة أخرى من البيانات ، فإن استخدام المصفوفات والدالة Array ستكون مفيدة للغاية:

Sub translate() 'مثال مبسط لترجمة الصيغ من الإنجليزية إلى الفرنسية
     Dim var_translate As String

     'شريط نصي لهذا المثال
     var_translate = "Formula to translate : SUM(IF(ISNUMBER(A1:E1),A1:E1,0))"
     
     'مجموعتين من القيم
     en = Array("IF", "VLOOKUP", "SUM", "COUNT", "هو رقم", "MID")
     fr = Array("SI", "ريتشرشيف", "سوم", "NB", "ESTNUM", "STXT")
     
     'استبدل "SI" بـ "IF" و "RECHERVEV" بـ "VLOOKUP" وما إلى ذلك.
     For i = 0 To UBound(en)
         var_translate = Replace(var_translate, en(i), fr(i))
     Next

     'الشريط بعد الاستبدال
     MsgBox var_translate '=> تعرض "Formula للترجمة: SOMME (SI (ESTNUM (A1: E1)، A1: E1،0))"
End Sub

تحويل نص إلى مصفوفة (VBA Split)

تسمح لنا الوظيفة Split بتقسيم سلسلة الأحرف إلى أجزاء وكتابة القيم الناتجة في مصفوفة.

لتحويل شريط إلى صفيف ، قم بما يلي:

variable = "IF / VLOOKUP / SUM / COUNT / ISNUMBER / MID"

استخدم VBA function Split وحدد الفاصل:

en = Split(variable, "/")

ستعيد المصفوفة "en" القيم التالية:

MsgBox en(0) '=> العوائد: IF
MsgBox en(1) '=> العوائد: VLOOKUP
MsgBox en(2) '=> العوائد: SUM
MsgBox en(3) '=> العوائد: COUNT
MsgBox en(4) '=> العوائد: ISNUMBER
MsgBox en(5) '=> العوائد: MID

ستُرجع المصفوفات الثلاثة التالية أيضًا نفس القيم:

en = Array("IF", "VLOOKUP", "SUM", "COUNT", "هو رقم", "MID")
en = Split("IF ، VLOOKUP ، SUM ، COUNT ، ISNUMBER ، MID", ",")
en = Split("IF VLOOKUP SUM COUNT ISNUMBER MID", " ")

يُرجع المثال التالي القيمة الثالثة في السلسلة:

MsgBox Split("IF ، VLOOKUP ، SUM ، COUNT ، ISNUMBER ، MID", ",")(2) '=> العوائد: SUM

معكوس Split هو VBA function Join.

تجمع هذه الوظيفة قيم المصفوفة في سلسلة.

MsgBox Join(Array(1, 2, 3, 4, 5), "") '=> إرجاع: 12345