JWDStructure

دروس VBA Excel

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

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

  • مقدمة
  • ما هو التابع المخصص
  • إضافة تابع مخصص
  • تجريب التابع المخصص
  • خاتمة

مقدمة

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

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

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

ما هو التابع المخصص

كما قلنا فإن إكسل يحوي العديد من التوابع الجاهزة، كما أنه يؤمن لنا إمكانية كتابة التوابع ضمن الخلايا بأسلوب سهل وواضح.

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

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

لنفرض مثلاً أننا نريد إدخال التابع f وهو تابع إلى x و y ويأخذ القيم:

x<=100        => f(x,y)= x^2 + 2 * y          i.e.(x2 + 2y)
x>100, y<10   => f(x,y)= 6*x – 4 * x * y      i.e.(6x - 4x.y)
x>100, y>=10  => f(x,y)= x^3 + x * y^2        i.e.(x3 + x.y2)

ملاحظة: الرمز ^ يعني الرفع إلى قوة، والرمز * يعني إشارة الضرب.

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

ولكن ماذا لو كان لدينا تابعاً في إكسل اسمه f(x,y) ونستخدمه كما نستخدم التابع Sin أو Max مثلاً.

يمكننا ذلك باستخدام VBA ببساطة.

إضافة تابع مخصص

سنقوم بإضافة التابع السابق.

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

الشكل (4-1)
الشكل (4-1): إضافة وحدة برمجية جديدة

في صفحة الوحدة البرمجية التي قمنا بإضافتها أضف تابعاً اسمه f (الاسم اختياري) وله مدخلين هما x و y كما يلي:

10 Public Function f(x As Single, y As Single) As Single

90 End Function

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

عند كتابة السطر رقم 10 وضغط Enter يقوم VBA بإضافة السطر 90 تلقائياً.

قمنا في السطر 10 بتعريف تابع (Function) اسمه f على أنه عام (Public) أي يمكن الوصول إليه من أي مكان في البرنامج ومن إكسل أيضاً، وقمنا بتعريف المدخلات (أو البارامترات Parameters) وهي x و y على أنها أعداد حقيقة (Single)، كما أن التابع يعيد قيمة حقيقية (Single) كما هو واضح في نهاية السطر 10.

نضيف الأسطر التالية بين السطرين 10 و 90:

20 If x <= 100 Then
30     f = x ^ 2 + 2 * y
40 ElseIf x > 100 And y < 10 Then
50     f = 6 * x - 4 * x * y
60 ElseIf x > 100 And y >= 10 Then
70     f = x ^ 3 + x * y ^ 2
80 End If

في السطر 20 أضفنا أول شرط وهو حالة كون x<=100، فإذا تحقق هذا الشرط يقوم البرنامج بتنفيذ السطر الذي يليه مباشرة (السطر 30) حتى يصل إلى عبارة Else أو ElseIf أو End If التابعتين لنفس العبارة الشرطية فينتقل بعدها إلى السطر الذي يلي End If التابعة إلى نفس الشرط وهي هنا في السطر 80.

أما إذا لم يتحقق الشرط ينتقل البرنامج إلى أول عبارة Else أو ElseIf تابعة لنفس الجملة الشرطية وهي هنا في السطر 40، فإن تحققت نفذ ما فيها ثم ينتقل إلى End If وإلا ينتقل إلى عبارة Else أو ElseIf التي تليها وهكذا.

يمكننا اختصار الأسطر السابقة بالتفكير التالي:

نلاحظ من الشرطين في السطرين 20 و 40 أن تحقق الشرط في 60 هو حتمي في حال عدم تحقق الشرطين السابقين لذلك يمكننا استبدال السطر 60 السابق بالسطر التالي:

60 Else

وبما أننا لم نضع شرطاً بعد Else فهذا يعني أنه إن لم يتحقق أي شرط مما سبق نفذ العبارات التي تلي Else هذه.

أو يمكننا تغيير كتابة الشروط إلى الشكل التالي:

20 If x <= 100 Then
30     f = x ^ 2 + 2 * y
40 Else
50     If y < 10 Then
60         f = 6 * x - 4 * x * y
65     Else
70         f = x ^ 3 + x * y ^ 2
75     End If
80 End If

ونلاحظ هنا تداخل عبارتين شرطيتين معاً، وأترك لكم دراستهما.

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

تجريب التابع المخصص

الآن بعد أن قمنا بتعريف التابع يمكننا استخدامه ببساطة في إكسل كما نستخدم أي تابع آخر، كما هو موضح في الشكل:

الشكل (4-2)
الشكل (4-2): إضافة التابع المخصص

تفيدنا هذه الطريقة كما قلنا سابقاً بتسهيل إدخال التابع، وتسهيل تعديله وتسهيل قراءته، فإذا اكتشفنا وجود خطأ في التابع نعود إلى بيئة VBA ونقوم بتعديل التابع ثم نطلب من إكسل أن يعيد الحساب، كما هو موضح في الشكل (4-3):

الشكل (4-3)
الشكل (4-3): بعد تعديل التابع يجب أن نطلب من إكسل أن يعيد الحساب

إذن الأمر بهذه البساطة، ولنفرض مثلاً أننا نريد كتابة تابع لحساب تسليح مقطع مستطيل تسليحاً أحادياً، يمكن أن يكون من الشكل:

10 Public Function RectAs(Moment As Single, Width As Single, Depth As Single, Cover As Single, fy As Single, fc As Single) As Single

20 End Function

ملاحظة: عبارة تعريف التابع السابقة تكتب على سطر واحد.

ثم نكتب البرنامج بين السطرين السابقين، ويمكننا استخدام التابع كمثال كما يلي، فضمن إحدى الخلايا نكتب العبارة:

=RectAs(B5;A1;A2;A3;A4;A5)

بدلاً من كتابة عدة معادلات في عدة خلايا.

كما أننا يمكننا إدخال شرط التسليح الأصغري والأعظمي ضمن البرنامج، وكل ذلك في VBA وليس في إكسل نفسه.

ملاحظة: التطبيق الأول القادم سيكون عن إضافة هذا التابع إن شاء الله.

خاتمة

تعلمت في هذا الدرس معنى التابع المخصص وكيفية الاستفادة منه وكيفية إضافته واستخدامه.

تحميل