JWDStructure

دروس VBA Excel

تطبيقات برمجة إكسل - التطبيق الأول - إضافة تابع حساب تسليح مقطع 1

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

الموضوع على هذا الرابط:

http://www.arab-eng.org/vb/t257318.html

المستوى

  • مبتدئ

مقدمة

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

في هذا الموضوع سأقوم بشرح كتابة هذا التابع، ولكن قبل متابعة القراءة أرجو مراجعة ذلك الدرس.

المهارات المطلوبة:

  • معرفة بسيطة بلغة Visual Basic أي (VB).
  • معرفة باستخدام أوامر إكسل الأساسية.
  • يفضل أن تكون مهندساً مدنياً أو طالباً في الهندسة المدنية لفهم العلاقات المستخدمة.
  • قراءة الدرس الرابع وما سبقه.

النقاط الرئيسية:

سأقوم بتقسيم هذا الموضوع إلى أربعة أقسام رئيسية وهي:

1- مراجعة علاقات تصميم مقطع مستطيل خاضع لعزم بالطريقة الحدية حسب الكود السوري (تسليح أحادي وتسليح ثنائي أي مع تسليح ضغط).

2- إضافة تابع إلى إكسل يقوم بحساب التسليح الأحادي فقط.

3- شرح كيفية الحصول على أكثر من قيمة من تابع واحد.

4- تعديل التابع السابق ليقوم بحساب التسليح الثنائي عند الحاجة، وفي هذه الحالة سنحصل على قيمتين هما تسليح الشد وتسليح الضغط إن وجد.

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

مراجعة علاقات تصميم مقطع مستطيل بالطريقة الحدية حسب الكود السوري (تسليح أحادي وتسليح ثنائي أي مع تسليح ضغط):

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

لنفرض أنه لدينا مقطع مستطيل عرضه b وارتفاعه h وارتفاعه الفعال d وبعد مركز ثقل حديد الضغط عن أبعد ليف مضغوط هو d'.

ولنفرض أن إجهاد خضوع الفولاذ fy والمقاومة المميزة للخرسانة f'c.

الواحدات المستخدمة هي الواحدات الدولية أي أن واحدة العزم هي N.mm والأبعاد mm والإجهادات Mpa أي N/mm2.

المقطع معرض لعزم حدي مصعد Mu، والمطلوب حساب تسليح المقطع حسب الطريقة الحدية للكود السوري.

- نقوم أولاً بحساب نسب ومساحات التسليح الأصغري والأعظمي:

Equation 01-01

- نقوم بحساب التسليح على فرض أنه أحادي من العلاقات التالية:

Equation 01-02

ثم نقارن هذه القيمة As مع التسليح الأصغري، فإن كانت أصغر نعتمد الأصغري وإلا نقارنها مع الأعظمي فإن كانت أصغر منها أو تساويها نعتمدها ونتوقف عند هذه النقطة، وإلا ننتقل إلى مرحلة التسليح الثنائي وهي المرحلة التالية.

- مرحلة التسليح الثنائي:

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

المقطع الأول تسليحه هو As1 = Asmax الذي تم حسابه أعلاه وهو يتحمل عزماً Mu1 يحسب كما يلي:

Equation 01-03

أما المقطع الثاني فهو يتحمل عزماً يساوي فرق العزمين أي Mu2 = Mu – Mu1 ويكون تسليح الضغط والشد المقابل له:

Equation 01-04

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

بعد حساب التسليحين يكون تسليح الشد النهائي للمقطع هو As=As1+As2 أما تسليح الضغط فهو As'.

قبل قبول النتيجة نتحقق إن كان As النهائي أكبر من مرة ونصف Asmax فإن كان كذلك نرفض النتيجة ويجب تغيير أبعاد المقطع.

في صفحة التحميل ملف فيه أمثلة محلولة توضح هذه الطريقة بشكل أكبر لمن أراد مزيداً من الإيضاح.

هذه الخطوات باختصار وسننتقل إلى البرنامج.

إضافة تابع إلى إكسل يقوم بحساب التسليح الأحادي

سنقوم الآن بإضافة تابع اسمه RectMomentLimit1 إلى وحدة برمجية جديدة (راجع الدرس الرابع).

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

نقوم بتعريف التابع مع مدخلاته كما يلي:

Public Function RectMomentLimit1(Mu As Single, B As Single, d As Single, _
    d1 As Single, fy As Single, fc As Single) As Single

End Function

ملاحظة: الرمز ( _ ) في نهاية السطر الأول يستخدم لتجزيء سطر (طويل) إلى سطرين، أي يمكن إلغاء ذلك الرمز بشرط جعل السطرين الأولين في سطر واحد.

أما المدخلات فهي:

  • Mu: العزم الحدي المصعد المعرض له المقطع.
  • B: عرض المقطع.
  • d: الارتفاع الفعال للمقطع.
  • d1: بعد مركز ثقل حديد الضغط عن أبعد ليف مضغوط.
  • fy: إجهاد الخضوع للفولاذ.
  • fc: المقاومة المميزة للخرسانة.

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

سنعتبر أن الواحدات المستخدمة هي الواحدات الدولية (N,mm).

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

Dim OMEGA As Single: OMEGA = 0.9

Dim mu_min As Single, mu_max As Single
Dim As_min As Single, As_max As Single

mu_min = 0.9 / fy
mu_max = 0.5 * 455 / (630 + fy) * fc / fy

As_min = mu_min * B * d: As_max = mu_max * B * d

ملاحظة: أسماء المتحولات تعبر عن استخدامها.

بعد الأسطر السابقة نكتب أسطر حساب التسليح الأحادي وهي:

Dim A0 As Single, alpha As Single, gamma As Single
Dim tAs As Single

A0 = Mu / (OMEGA * B * d ^ 2 * 0.85 * fc)
alpha = 1 - Sqr(1 - 2 * A0)
gamma = 1 - alpha / 2
tAs = Mu / (OMEGA * gamma * d * fy)

ملاحظة: إن المتحول tAs يعبر عن قيمة تسليح الشد.

بعد حساب تسليح الشد يجب أن نتحقق إن كان أصغر من التسليح الأصغري أو أكبر من الأعظمي.

في هذا التابع إن كان تسليح الشد أكبر من الأعظمي سيعيد التابع القيمة -1 وهي ستدلنا على أن أبعاد المقطع غير كافية أو أنه بحاجة إلى تسليح ضغط.

If tAs < As_min Then
    tAs = As_min
ElseIf tAs > As_max Then
    tAs = -1
End If

بعدها نقوم بإسناد قيمة tAs إلى التابع كما يلي:

RectMomentLimit1 = tAs

أصبح التابع كاملاً كما يلي:

Public Function RectMomentLimit1(Mu As Single, B As Single, d As Single, _
    d1 As Single, fy As Single, fc As Single) As Single

    Dim OMEGA As Single: OMEGA = 0.9

    Dim mu_min As Single, mu_max As Single
    Dim As_min As Single, As_max As Single

    mu_min = 0.9 / fy
    mu_max = 0.5 * 455 / (630 + fy) * fc / fy

    As_min = mu_min * B * d: As_max = mu_max * B * d

    Dim A0 As Single, alpha As Single, gamma As Single
    Dim tAs As Single

    A0 = Mu / (OMEGA * B * d ^ 2 * 0.85 * fc)
    alpha = 1 - Sqr(1 - 2 * A0)
    gamma = 1 - alpha / 2
    tAs = Mu / (OMEGA * gamma * d * fy)

    If tAs < As_min Then
        tAs = As_min
    ElseIf tAs > As_max Then
        tAs = -1
    End If

    RectMomentLimit1 = tAs
End Function

لاستخدام هذا التابع نقوم بتصميم صفحة إكسل كما في الشكل:

الشكل (1)
الشكل (1): تصميم صفحة الإكسل التي سنقوم باختبار التابع عليها

ملاحظة: يتم إدخال العزم في هذه الصفحة في العمود A بواحدة KN.m ونضع معادلة في العمود B لتحويلها إلى N.mm، لأن الواحدة الأولى هي الأكثر استخداماً والعلاقات تستخدم الواحدة الثانية.
أما الأبعاد فواحدتها mm والإجهادات Mpa.

ثم نقوم بوضع المعادلة التالية في الخلية C7:

=RectMomentLimit1(B7;$B$2;$D$2;$B$3;$B$1;$D$1)

ملاحظة: إن علامات $ تساعدنا في تثبيت رقم العمود أو السطر الذي يأتي بعدها عند نسخ هذه المعادلة من خلية إلى أخرى، وبما أن خلايا أبعاد المقطع والمقاومات ثابتة فإننا استخدمنا الرمز $ مع عناوينها.
بينما عنوان الخلية B7 لم نقم بوضع إشارة $ معه لأننا نريد عند نسخ هذه المعادلة إلى خلية أخرى أن يقوم بتعديل عنوان الخلية B7 (خلية العزم) إلى عنوان آخر يقوم إكسل بمعرفته تلقائياً (عنوان نسبي).
هذا الأمر (أي العناوين المطلقة والنسبية) من أساسيات إكسل ولا علاقة له بالبرمجة.

بعدها نقوم بنسخ الخلية C7 إلى الخلايا C8 و C9 و C10 كما في الشكل:

الشكل (2)
الشكل (2): الصفحة بعد إدراج التابع في عدة خلايا

إن تسليح العزم 13 كن.م هو تسليح أصغري، أما العزم 60 كن.م فتسليحه حسابي.

نلاحظ أن هذا المقطع لا يمكنه تحمل العزم 128 كن.م أو العزم 200 كن.م باستخدام تسليح أحادي، لأن التابع أعاد القيمة (-1) كما صممناه.

إن أي تعديل على قيم العزوم الآن سيؤدي إلى إعادة حساب التسليح. جرب تعديل العزم في الخلية A7 من 13 كن.م إلى 50 كن.م.

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

لاستعراض الكود البرمجي بعد فتح الملف وتفعيل خيار استخدام أكواد VBA يمكنك الضغط على Alt+F11 أو كما تعلمت في الدروس السابقة.

خاتمة

قمنا في هذا التطبيق بشرح طريقة الكود العربي السوري في تصميم (حساب تسليح) مقطع خرساني مستطيل خاضع لعزم انعطاف فقط، وفق الطريقة الحدية.

ثم قمنا بكتابة تابع في إكسل يقوم بحساب تسليح هذا المقطع في حال كان التسليح أحادياً.

وسنؤجل تعديل التابع ليحسب حالة التسليح الثنائي (تسليح شد مع ضغط) إلى التطبيق القادم إن شاء الله.

تحميل