اذهب الي المحتوي
أوفيسنا
بحث مخصص من جوجل فى أوفيسنا
Custom Search

الردود الموصى بها

قام بنشر (معدل)

بسم الله الرحمن الرحيم

تحية لجميع الإخوة في هذا المنتدى المبارك ، فالسلام عليكم ورحمة الله وبركاته

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

وأرجو أن لا يكون الموضوع مكررا .

سأستعرض هنا أفكارا أراها أساسية للمبتدئ في الأكسس ، تعينه على فهم الدوال وكتابتها ، وذلك ضمن عدد من النقاط :

1- ما هو الروتين الفرعي

2- ما هي الوظيفة .

3- متى تحتاج لكتابة روتين فرعي أو وظيفة.

4- مجال الوظيفة والروتين الفرعي .

5- الوسائط

6- معرفات الوسائط .

7- المتغيرات

8- أنواع المتغيرات .

9- المدى المكاني للمتغيرات .

10- قواعد عامة .

المرجع في هذا الموضوع :

1- كتاب علم نفسك برمجة أكسيس 2002

2- مشاركة لأبي هاجر في منتديات الفريق العربي حول المتغيرات

3- بعض الاجتهادات والتصورات الشخصية

تم تعديل بواسطه حارث
  • Like 1
  • Thanks 1
قام بنشر

أولا : الروتين الفرعي :

وهو الدالة التي تحتوي على عبارة Sub وتتكون من عدد من الأسطر تقوم بعمل محدد .

يبدأ الروتين الفرعي بالسطر

Sub SubName()
وينتهي بالسطر
End Sub
ولا بد من تسمية الروتين الفرعي باسم يستدعى بواسطته ، ويمكن تسميته بأي اسم يرغب فيه المبرمج ما لم يكن هذا الاسم محجوزا . ويفضل أن يكون الاسم دالا على ما يقوم به الروتين الفرعي من عمل . فمثلا يمكن للمبرمج أن يسمى الروتين الفرعي بالاسم AAA بحيث يبدأ بالسطر التالي :
Sub AAA()
إلا أن اسم AAA لا يدل على ما يقوم به الروتين الفرعي من عمل ، لذا فالأولى أن يسمى باسم يدل عليه ، فمثلا لو كانت مهمة الروتين الفرعي هي فتح نموذج اسمه Form1 ، فيمكن أن يسمى بالاسم
Sub OpenForm1()

  • Like 2
قام بنشر

ثانيا : الوظيفة

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

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

تبدأ الوظيفة بالسطر

Function FunctionName()
وتنتهي بالسطر
End Function
ولا بد من تسمية الوظيفة باسم على ما سبق بيانه في الروتين الفرعي . وبما أن الوظيفة تعطي قيمة لذا فمن المستحسن بيان نوع القيمة التي تعيدها الوظيفة ، وأنواع القيم هي نفسها أنواع المتغيرات ، وسيأتي بيانها . ومثال بيان نوع القيمة التي تعيدها الوظيفة
Function MyNumber() As Byte

فالوظيفة هنا تعطينا قيمة من نوع Byte.

وفي حال لم يبين نوع القيمة كما في المثال قبل السابق فإن البرنامج سيعتبرها من نوع Variant

  • Like 2
قام بنشر

ثالثا : تحتاج إلى الروتين الفرعي والوظيفة لأحد سببين أو لكليهما معا :

السبب الأول : تكرار بعض أسطر الأكواد في أكثر من موضع في البرنامج .

فمثلا قمت بعمل نموذج يعرض التقويم وسميته frmCal

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

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

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

  • Like 1
قام بنشر

رابعا : مجال الوظيفة والروتين الفرعي .

قد تكون الوظيفة أو الروتين الفرعي عامة وقد تكون خاصة .

ومعنى كونها عامة أنه يمكن استدعاؤها من أي وحدة نمطية في البرنامج ، وذلك بأن تسبقها عبارة Public ، كما في المثال التالي :

Public Function Fun2 ()As Byte
ومعنى كونها خاصة أنه يمكن استدعاؤها من الوحدة النمطية التي هي موجودة فيها فقط . وذلك بأن تسبقها عبارة Private مثال :
Private Function Fun2() As Byte  
عندما لا تحدد هل الوحدة النمطية عامة أو خاصة فإن البرنامج يعتبرها عامة . كما في المثال التالي :
Function Fun2() As Byte  

  • Like 1
قام بنشر (معدل)

خامسا : الوسائط

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

Function Fun2(A) As Byte
هنا A يسمى وسيطة . ويمكن أن تكون الوسيطة واحدة – كما في المثال السابق – ويمكن أن تكون أكثر من ذلك ، ويتم الفصل بينها بالشكل التالي :
Function Fun2(A, B, C) As Byte
في هذا المثال لدينا ثلاثة وسائط هي A و B و C والوسائط قيم لذا من المستحسن بيان نوعها بإضافة عبارة تدل على نوعها كما في المثال التالي :
Function Fun2(A As Byte, B As Integer, C As Variant) As Byte
فهنا حددنا نوع كل من الوسائط الثلاثة فجعلنا A من نوع Byte و B من نوع Integer و C من نوع Variant وفي حال لم يبين نوع الوسيطة كما في المثال قبل السابق فإن البرنامج سيعتبرها من نوع Variant (ويأتي شرح معنى كل من هذه الأنواع في بيان أنواع المتغيرات إن شاء الله) . كما في الوظيفة أو الروتين الفرعي فإن أي اسم تطلقه على الوسيطة سيكون مقبولا لدى البرنامج ، ما لم يكن من الأسماء المحجوزة ، لكن من المستحسن أن تطلق أسماء تدل على معنى ، بحيث تتذكر بسهولة مهمة كل وسيطة من الوسائط . ففي المثال السابق لن تستطيع فهم المهمة التي يؤديها أي من الوسائط المذكورة . لكن لو كان المثال بالشكل التالي:
Function AddDaysToDate (TheDate As Date, DaysNumber As Integer) As Date

(ملاحظة هذا مثال للتوضيح فقط ، ويغني عنه دالة DateAdd المضمنة في أكسس )

ففي هذا المثال تعرف بمجرد قراءة الوظيفة في أي وقت وبسهولة مهمتها (وهي إضافة أيام إلى تاريخ ما ) وأن الوسيطة الأولى هي التاريخ المطلوب إضافة الأيام إليه ، وأن الوسيطة الثانية هي عدد الأيام المطلوب إضافتها إلى هذا التاريخ.

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

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

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

إن استخدام الوسائط يمكننا من استخدام الوظيفة في أغراض متعددة ، ففي المثال السابق قد نعطيها تاريخ اليوم Date ونطلب منها إضافة سبعة أيام ، أو ثلاثة أيام ، أو طرح عشرة أيام ، وقد نعطيها تاريخا آخر محدد مثل 5-8-2003 ونطلب أن تضيف عليه عشرة أو خمسة أيام لتعطينا الناتج .

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

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

تم تعديل بواسطه حارث
قام بنشر

سادسا : معرفات الوسائط :

يمكنك أن تضع قبل الوسائط المعرفات التالية :

ByVal

ByRef

Optional

وشرحها فيما يلي

المعرف الأول: ByVal

يسبق معرف ByVal كل الوسائط التي لا نرغب في تغيير قيمتها خارج الروتين الفرعي أو الوظيفة ، بحيث حتى لو تم تغيير قيمة الوسيطة في سطور الروتين الفرعي أو الوظيفة فإنها ستعود كما كانت بعد انتهاء آخر سطر منه .

لماذا نستخدم ByVal : نستخدمها عندما نرغب في التأكد من أن الوسائط لن يمكن تغييرها بشكل دائم ، فقد نرغب في تغيير وسائط ByVal داخل الروتين الغرعي أو الوظيفة ، ولكن نريد أن تكون هذه التغييرات مؤقته ، بمعنى أننا لا نرغب في الاحتفاظ بهذه التغييرات بعد انتهائه .

ولتوضيح ذلك طبق المثال التالي:

Sub TestByVal(ByVal A as integer)

A=5

Msgbox A

' الرسالة هنا هي 5

end sub


Sub Test0

dim A as integer

A= 10 

call TestByVal(A)

Msgbox A

' الرسالة هنا هي 10  وهي قيمة  الوسيطة قبل استدعاء الروتين الفرعي

' TeatByVal

End Sub

قام بنشر

المعرف الثاني : ByRef

يسبق معرف ByRef كل الوسائط التي نرغب في تغيير قيمتها بواسطة الروتين الفرعي أو الوظيفة .

لماذا نستخدم ByRef : نستخدمها عندما نرغب في التنبيه إلى أن الوسيطة سوف يتم تغييرها.

ومن هنا فإن نفس المثال السابق لو جعلت بدلا من

Sub TestByVal(ByVal A as integer)
السطر التالي
Sub TestByRef(ByRef A as integer)

فسوف تجد أن الرسالتين كلاهما 5

قام بنشر

المعرف الثالث: Optional

يوفر معرف Optional بعض المرونة في الروتين الفرعي أو الوظيفة ، ذلك أن وسيطة Optional هي وسيطة لها قيمة افتراضية ، ومن ثم لا يجب على مستخدم الروتين الفرعي أو الوظيفة تمرير قيمتها إلا إذا كان يرغب في تغيير القيمة الافتراضية

وينبغي التنبيه إلى أنه عند استحدام معرفات Optional فإنه يجب أن تكون هذه المعرفات في آخر وسائط الروتين الفرعي أو الوظيفة .

مثال عملي لمعرف Optional :

لنفرض أنك تريد أن تعمل وظيفة تضيف ضريبة المبيعات إلى القيمة الإجمالية، وكانت أغلب مبيعاتك في ولاية رقم 9 ، والضرائب في هذه الولاية هي 5 % ، لكن أحيانا تكون المبيعات في خارج هذه الولاية ، وتكون الضريبة مختلفة ، لذا تكون الوظيفة بالشكل التالي

Function CalculateTotalSale(ByVal InSaleAmount as Double , Optional TaxPercent as Double = .05) As Double

CalculateTotalSale = InSaleAmount * (1 + TaxPercent)

End Function
لذا فإنك أذا أردت حساب القيمة الإجمالية مضافا إليها ضريبة المبيعات ، لا تحتاج إلى تمرير قيمة الضريبة كل مرة ، وإنما تحتاجها فقط إذا كانت المبيعات خارج الولاية أي أنه إذا كانت المبيعات داخل الولاية يكفي أن تستدعي الوظيفة بالشكل التالي
Sub Test1

Dim SaleAmount  As Double , TotalSale As Double 

 SaleAmount  = 100

TotalSale = CalculateTotalSale(SaleAmount )

MsgBox TotalSale  

End sub
أما إذا كانت المبيعات خارج هذه الولاية في ولاية ضريبة مبيعاتها هي 8% فإن الوظيفة تستدعى بالشكل التالي
Sub Test2

Dim SaleAmount  As Double , TotalSale As Double , Dim AnotherTax as Double 

 SaleAmount  = 100

AnotherTax  = .08

TotalSale  = CalculateTotalSale(SaleAmount , AnotherTax )

MsgBox TotalSale 

End sub

قام بنشر (معدل)

سابعا : المتغيرات .

ما هو المتغير :

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

مثلا :

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

يكتب الكود بالشكل التالي :

A = Calendar

'  هنا خزنت نوع التقويم المستخدم في قاعدة البيانات في متغير سميته A

Calendar = 1

'  عدلت تقويم قاعدة البيانات إلى التقويم الهجري

MsgBox Date

'  تظهر رسالة بالتاريخ الحالي .

Calendar = A

'  أعدت التقويم إلى القيمة المخزنة في المتغير A

ويستحسن قبل استخدام المتغير أن يعلن عنه بعبارة مثل :

Dim A

وهو ما يعرف بالإعلان عن المتغير

والإعلان عن المتغيرات مفيد جدا خصوصا عندما يكون الكود طويلا ، ومن فوائده :

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

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

3- عند الخطأ في كتابة متغير فإن البرنامج يعتبر الاسم الخطأ متغيرا جديدا ، الأمر الذي قد يسبب أخطاء لا يعرف المبرمج سببها إلا بصعوبة ، ولتجنب مثل هذا الخطأ يجب اعتماد ضرورة الإعلان عن المتغيرات ، وذلك بإضافة عبارة Option Explicit في أعلى الوحدة النمطية ، ومهمة هذه العبارة أن لا يقبل البرنامج أي متغير دون الإعلان عنه .

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

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

Dim A As Byte

ومعنى هذا الإعلان أن المتغير من نوع Byte وسيأتي شرحه إن شاء الله

وفي حال لم يعلن عن المتغير أو أعلن عنه لكن لم يعلن عن نوعه فإن البرنامج سوف يعتبر المتغير من نوع Variant

(ويأتي شرحه إن شاء الله) .

تم تعديل بواسطه حارث
قام بنشر

ثامنا : أنواع المتغيرات .

أنواع المتغيرات :

يحتوي الأكسس على عدد كبير من المتغيرات التي يصعب حتى ذكرها هنا فضلاً عن شرحها لكن يمكنك الاطلاع عليها عن طريق القائمة التي يتم عرضها بعد أن تكتب عبارة As أثناء تعريفك لمتغير ما .

وهذه المتغيرات منها ما هو عام يمكن استخدامه في لغة VBA في أي من برامج أوفيس ومنها ما هو خاص بأكسس VB وهذه في الغالب هي المتغيرات المتعلقة بتعريف كائنات أكسس أي الجداول والاستعلامات والنماذج وغيرها

هذه بعض أنواع المتغيرات ويجب استخدامها بدقة إذ يودي الاختلاف بين نوع المتغير والقيمة المسندة إليه إلى خطأ أثناء تنفيذ البرنامج فالعبارة التالية خطأ

Dim a as integer

A= "name
" لأننا أعلنا عن المتغير كرقم ، وأسندنا له قيمة هي سلسلة . وكذلك العبارة التالية
Dim a as integer

A = 50000

لأن أكبر رقم يمكن أن يحتويه متغير من نوع Integer هو 32767 وهكذا

هل يجب تعريف المتغيرات ؟

إذا أضفت في أعلى الوحدة النمطية عبارة : Option Explicit فإن هذا معناه أنك تخبر أكسس VB بوجوب الإعلان عن المتغيرات ، ومن ثم لا يقبل البرنامج أي متغير لم يعلن عنه .

والأصل أن تعريف المتغيرات ليس أمراً إلزاميا ، فعند حذف عبارةOption Explicit أو عدم وجودها أصلا فلن تكون ملزماً بالإعلان عن المتغيرات

قام بنشر

تاسعا : المدى المكاني للمتغيرات

أقصد بهذه النقطة أننا عند الإعلان عن متغير فأين نستطيع استخدامه ؟

هناك ثلاث فئات من المتغيرات :

1- الفئة الأولى : المتغيرات التي يتم تعريفها داخل الدالة أو الإجراء الفرعي وهذه يمكن استخدامها داخل الدالة أو الإجراء الفرعي فقط ولا يمكن إسناد قيم لها ولا تستدعي من خارج الدالة أو الإجراء

مثال :

Option Compare Database

Option Explicit


Public Function fun1()

Dim a As String

a = "كيف الحال؟"

End Function


Public Function fun2()

MsgBox a

End Function
هنا عندنا في الكود السابق وظيفتان : fun1 و fun2 أعلنا عن المتغير a في الوظيفة الأولى ، واستدعينا المتغير في الوظيفة الثانية ، عند استدعاء الوظيفة fun2 سيعرض البرنامج رسالة خطأ تفيد بأن المتغير a غير معرف . وذلك لأن نطاقه المكاني محصور في الوظيفة التي أعلن فيها وهي fun1 وتظهر رسالة الخطأ لأننا قد طلبنا من البرنامج أن لايقبل أي متغير غير معلن عنه لما أضفنا في أعلى الوحدة النمطية عبارة : Option Explicit في حالة عدم إضافة هذه العبارة فإن البرنامج سيعتبر المتغير a في الوظيفة fun2 متغيرا جديدا وبالتالي سيعرض رسالة خالية لأن المتغير متغير جديد لم يتم إسناد قيمة له . الفئة الثانية : المتغيرات التي يتم تعريفها في أعلى الوحدة النمطية الخاصة بالنموذج أو التقرير وهي ما يسمى بمنطقة التعريفات ، وهذه يمكن استخدامها داخل النموذج أو التقرير ولا يمكن استخدامها في نموذج أو تقرير آخر وهذه تعرف عادة باستخدام العبارة Dim أو Private
Option Compare Database

Option Explicit

Dim myvar As Integer

Private HerName
يمكن في المثال السابق استدعاء المتغيرين myvar و HerName من أي وظيفة أو روتين فرعي في الوحدة النمطية التي أعلن فيها عن هذا المتغير . 3- الفئة الثالثة : المتغيرات التي يتم تعريفها داخل الوحدات النمطية العامة ويمكن استخدامها في أي مكان من البرنامج، وهذه تعرف عادة باستخدام العبارة Public أو Global
Option Compare Database

Option Explicit

Global MyName 

Public HisName
يمكن في المثال السابق استدعاء المتغيرين MyName و HisName من أي وظيفة أو روتين فرعي في أي وحدة نمطية . بقي أن أشير إلى أن العبارة Static تستخدم عادة لتعريف المتغيرات التي نريد أن تحافظ على قيمتها عند استدعائنا لها عدة مرات ومن أمثلة استخدامها :
Function KeepTotal(TheNumber)

    Static BB

    BB = BB + TheNumber

    KeepTotal = BB

End Function
الأصل في المتغير المعلن عنه في وظيفة أن لا يحتفظ بقيمته عند انتهاء الوظيفة . ففي المثال السابق لو أننا أعلنا عن المتغير BB بواسطة العبارة Dim لكانت قيمته دوما صفر كلما استدعينا الوظيفة KeepTotal ومن ثم ستكون قيمة KeepTotal في كل مرة هي نفس قيمة الوسيطة TheNumber لكن لأننا أعلنا عنه بواسطة العبارة Static فإنه سيحتفظ بأخر قيمة له حصل عليها في آخر استدعاء للوظيفة KeepTotal منذ بدء البرنامج ، يعني أننا لو استدعينا الوظيفة KeepTotal بالشكل التالي :
MsgBox KeepTotal(5)
فستظهر الرسالة بالرقم 5 لأنه في المرة الأولى قيمة BB عند بدء الوظيفة هي صفر فإذا استدعيناها بعد ذلك بالشكل التالي :
MsgBox KeepTotal(3)

فستظهر الرسالة بالرقم 8 لأن قيمة BB عند بدء الوظيفة هي 5

وإذا استدعيناها بعد ذلك بالرقم 2 فستظهر بالرقم 10 وهكذا .

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

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

قام بنشر

عاشرا : قواعد عامة .

القاعدة الأولى : اجعل الأسطر المتكررة في وظيفة أو روتين فرعي .

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

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

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

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

القاعدة الثانية : حاول قدر الإمكان أن تكون الوظيفة والروتين الفرعي قصيرين

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

القاعدة الثالثة : أفضل الوظائف والروتينات الفرعية لا تتطلب سوى عدد محدود من الوسائط .

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

القاعدة الرابعة : استخدم معرفات الوسيطة لمنع إساءة استخدام المتغيرات

استخدم معرفات الوسيطة ByVal ByRef Optional لكي توضح تماما للبرنامج الغرض الذي تريده أثناء تمرير المتغيرات كوسائط .

القاعدة الخامسة : استخدم البرمجة الشرطية

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

ويفضل أن تنص على هذه الشروط في الوظيفة كتعليق

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

والغرض من هذه القاعدة هو تقليل سطور الوظيفة وتبسيطها .

القاعدة السادسة: استخدم التعليقات عند الحاجة إليها

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

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

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

قام بنشر

السلام عليكم

أولا جزاك الله خيرا علي الشرح الوافي و المميز ، و الذي سنستفيد منه جميعا بإذن الله

و عندما نصل بالدورة الاكسس بإذن الله الي الاكواد و استخدام ال vba لن أقلق علي البداية ( لأني سأنقل من هنا مع الاشارة طبعا

اول تعليق :

فيما يخص : معرفات الوسائط :

ByVal

ByRef

Optional

فأود أن َضيف أنه أن Byref هي القيمة الافتراضية في حالة عدم الاختيار

قام بنشر

حارث...أبوهادي...محمدطاهر ..... المزيني :fff:

كم هو أجمل وأروع على الاطلاق .

أهلا بالأخ المزيني بين أخوانه وشد حيلك يا بطل معنا وفى انتظار مشاركاتك الجميلة .

الأخ الحارث : موضوع عملاق مثلك تماما . بارك الله لك أخي العزيز . :yess:

أشرف خليل

قام بنشر

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

زائر
هذا الموضوع مغلق.
  • تصفح هذا الموضوع مؤخراً   0 اعضاء متواجدين الان

    • لايوجد اعضاء مسجلون يتصفحون هذه الصفحه
×
×
  • اضف...

Important Information