JWDStructure

دروس VBA Excel

برمجة إكسل - الدرس الخامس - إضافة تابع مخصص 2

النقاط الأساسية

  • مقدمة
  • ما المقصود بتابع يعيد أكثر من قيمة؟
  • مثال فيديو يوضح استخدام توابع تعيد أكثر من قيمة (حل مجموعة معادلات خطية)
  • كتابة تابع يعيد أكثر من قيمة
  • خاتمة

مقدمة

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

ما المقصود بتابع يعيد أكثر من قيمة؟

قبل البدء ولفهم النقطة سأشير إلى بعض توابع إكسل الأصلية.

التابع Sin: هو تابع يعيد جيب الزاوية، عدد المدخلات 1، ويعيد قيمة واحدة فقط.

التابع Max: عدد المدخلات (غير محدد)، ويعيد قيمة واحدة فقط هي الأكبر بين هذه المدخلات.

بعض التوابع تعيد مصفوفة بدلاً من قيمة واحدة فمثلاً:

التابع Transpose: عدد المدخلات (1) ولكنه من النوع Array أي مصفوفة، ويعيد أيضاً مصفوفة هي منقول تلك المصفوفة.

إن التعامل مع التوابع التي تعيد مصفوفات يختلف قليلاً عن التعامل مع التوابع التي تعيد قيمة واحدة فقط.

فمثلاً لإدخال التابع Sin نكتب في إحدى الخلايا:

=Sin(A1)

ثم نضغط Enter فيتبدل محتوى الخلية إلى قيمة جيب الزاوية التي قيمتها هي القيمة الموجودة في الخلية A1 بالراديان.

لكن إذا أردنا أن نقوم بحساب منقول مصفوفة ولتكن محصورة في المجال A1:D2 وأردنا أن نضع هذا المنقول في المجال A4:B7 نقوم بما يلي:

نختار المجال الهدف A4:B7 ثم نكتب في إحدى الخلايا العبارة التالية:

=TRANSPOSE(A1:D2)

حيث A1:D2 في العلاقة هو المجال الذي يعبر عن دخل التابع Transpose وهو المصفوفة التي نريد إيجاد منقولها، وهو مبين في الشكل (5-1).

ثم نضغط Ctrl+Shift+Enter فنحصل على المنقول كما هو موضح في اللوحات التالية:

الشكل (5-1)
الشكل (5-1): اختيار المجال الهدف وكتابة المعادلة في الخلية الأولى منه
الشكل (5-2)
الشكل (5-2): بعد الضغط على Ctrl+Shift+Enter نكون قد أدخلنا التابع بشكل صحيح

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

مثال فيديو يوضح استخدام توابع تعيد أكثر من قيمة (حل مجموعة معادلات خطية)

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

من المعلوم أن جملة معادلات خطية تكتب بشكل مصفوفي بالشكل التالي:

A.x=b

حيث A هي مصفوفة الأمثال، و b هو شعاع الطرف الثاني، و x هو شعاع المجاهيل.

إن حل المعادلة السابقة جبرياً هو بالشكل:

x=A-1.b

وتوابع إكسل المستخدمة هي:

MMULT: وهذا التابع يعيد جداء مصفوفتين، هما في حالتنا مقلوب المصفوفة A والشعاع b.

MINVERSE: وهذا التابع يعيد مقلوب مصفوفة ما، وفي حالتنا هي المصفوفة A.

والمعادلة في إكسل تكتب بالشكل التالي:

=MMULT(MINVERSE(matrix_A);matrix_b)

حيث أن matrix_A هو المجال الذي سنخزن فيه المصفوفة A، أما matrix_b فهو المجال الذي سنخزن فيه شعاع الطرف الثاني، والفيديو التالي يوضح كل العملية.


فيديو: طريقة حل عدة معادلات بعدة مجاهيل، قد تحتاج إلى تثبيت مشغل فلاش Adobe Flash Player

كتابة تابع يعيد أكثر من قيمة

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

افتح بيئة برمجة VBA وأضف وحدة برمجية جديدة إن لم يكن يوجد واحدة، وذلك كما تعلمت في الدروس السابقة.

نعرف التابع كما يلي:

Public Function ReturnTwoValues(A As Single, B As Single) As Single()

End Function

نلاحظ هنا وضع قوسين بعد كلمة Single الخاصة بالتابع في نهاية السطر الأول، وهذا يعني أن التابع سيعيد مصفوفة قيم هي أعداد حقيقية Single، وهذه هي النقطة الأساسية في درسنا هذا.

نضيف بين السطرين السابقين ما يلي:

Dim result(1, 0) As Single
result(0, 0) = A + B
result(1, 0) = A * B
ReturnTwoValues = result

قمنا بتعريف مصفوفة اسمها result مكونة من سطرين (أرقامهما 0 و 1) وعمود واحد (رقمه 0)

لاحظ أن ترقيم الأسطر والأعمدة يبدأ بصفر.

ثم قمنا بحساب A+B وتخزينه في السطر الأول من العمود الأول من المصفوفة، ثم حساب A*B وتخزينه في السطر الثاني من العمود الأول.

ثم أسندنا هذه المصفوفة result إلى التابع.

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

Dim A(3,1) As Single

التابع كاملاً:

Public Function ReturnTwoValues(A As Single, B As Single) As Single()
    Dim result(1, 0) As Single
    result(0, 0) = A + B
    result(1, 0) = A * B
    ReturnTwoValues = result
End Function

لاستخدام هذا التابع، لنفرض أن القيمتين A و B موجودتان في الخليتين A1 و B1 كما هو موضح في الشكل:

الشكل (5-3)
الشكل (5-3): توضيح المثال

ونريد أن نحسب جمعهما وضربهما باستخدام التابع السابق ووضع النتيجة في المجال A3:A4

نختار المجال A3:A4 ثم نكتب المعادلة التالية كما هو موضح في الشكل السابق:

=ReturnTwoValues(A1;B1)

ثم نضغط Ctrl+Shift+Enter فنحصل على النتيجة المبينة في الشكل التالي:

الشكل (5-4)
الشكل (5-4): النتيجة المطلوبة

قم بتغيير القيم السابقة في الخليتين A1 و B1 ولاحظ تغير النتيجة.

أرجو أن تكون هذه النقطة واضحة.

خاتمة

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

تحميل