الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

سلسلة دروس VBA

مغلق
بدأه خضر الرجبي في 14 يونيو 2005 · 8 رد · 4,098 مشاهدة · في قواعد بيانات Microsoft Access
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

إخواني وأخواتي ، بارك الله فيكم جميعاً

الدرس الأول : الحقات التكرارية (الدورانية) : Looping

في كثير من الأحيان يحتاج المبرمج إلى تكرار تنفيذ مجموعة من التعليمات عدداً من المرات، ويوجد طرقتين أساسيتين للتكرار في حالة كان عدد مرات التكرار معروفة مسبقا حيث يجب استخدام For ... Next ، وإذا كان عدد مرات التكرار غير محددة مسبقاً ومبنية على تحقق شرط معين (شرط إنتهاء الدوران أو البقاء به) فهنا نستخدم Do ... Loop .

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

أشكال البنى التكرارية الأربعة :

1. تنفيذ التعليمات statments هنا سيستمر حتى يتحقق الشرط condition .

Do Until condition
 Statments
Loop

وعندما يصل أكسيس لتفيذ هذا الدوران ، فإنه سيبدأ وقبل كل شيء بفحص قيمة الشرط conditon، فإذا كان True ، سيتم الإنتقال فوراً إلى ما بعد التكرار أي أنه لن يتم الدخول للحلقة. أما إذا كان False ، فسيتم تنفيذ التعليمات satments ،ثم يرجع للسطر DO Until ، للقيام بفحص الشرط ثانية، وهكذا ...

إذاً ، سيتم تكرار الحلقة عدداً من المرات ، طالما بقي الشرط conditon قيمته False . ولن ينفذ ولو مرة واحدة إذا كان الشرط True.

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

ولنأخذ مثالاً حتى نفهم كيف سيتم التعامل مع هذا الشكل من أشكال الحلقات الدورانية:

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

sum = 0
x= InputBox("أدخل الرقم ")
do until x=999
sum = sum+x
x= InputBox("أدخل الرقم ")
loop
Msgbox sum

مع ملاحظة ما يلي :

1. أننا قمنا أولا بتحديد قيمة المجموع وهي بالبداية صفراً

2. ثم قمنا بإدخال القيمة الإبتدائية قبل الدخول للحلقة وهي X ويتم إدخالها من قبل المستخدم عند تشغيل البرنامج.

3. بناء على قيمة x فإذا كانت 999 يكون الشرط true ولا ندخل للحلقة وإلا يكون false وندخل

في داخل الحلقة نقوم بزيادة قيمة sum االمجموع بمقدار القيمة المدخلة وهي x .

4. ثم تأتي عملية الإدخال من جديد داخل الحلقة والتي بدونها لن ينتهي التكرار حيث من خلال هذه الجملة سيتم وقف التكرار وذلك عند إدخال القيمة 999.

5. وفي نهاية البرنامج نطبع القيمة المطوبة وهي مجموع الأرقام التي تم إدخالها.

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

Do
Statements
Loop Until condition

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

ولنأخذ المثال التالي :

نريد أن نحسب مساحة مجموعة من الدوائؤ وعندما ندخل أن نصف القطر للدائرة صفراً تتوقف الحقلة (الدوران).

Private Sub ex2_Click()
Do
r = InputBox("أدخل نصف القطر")
a = r ^ 2 * 22 / 7
MsgBox "المساحة= " & a
Loop Until r=0
End Sub

وأرجو ملاحظة ما يلي :

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

2. تم إدخال نصف القطر r حيث سليزم لحساب مساحة الدائرة والتي تساوي مربع نصف القطر مضروبا في النسبة التقريبية ط والتي تساوي 22/7.

3. يتم احتساب مساحة الدائة وطباعة النتيجة وذلك داخل الحلقة ايضاً.

4. في نهاية الحقلة يتم السؤال عن الشرط فإذا كانت قيمة نصف القطر r=0 فسنخرج من الحلقة والا ننتقل لإدخال نصف قطر جديد وحساب مساحة جديد وهكذا ..

3. في الشكل الثالث من أشكال الدوران ، تنفذ التعليمات طالما أن قيمة الشرط condition صحيحة true وإلا يتم التوقف عن الدوران في الحلقة التكراارية.

do while condition
statements
loop

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

ولنأخذ المثال التالي :

نريد أن نقرأ مجموعة من الأسماء ونطبعها وإذا كان الحرف الأول في الكلمة ع (حرف العين) نتوقف.

Private Sub ex3_Click()
na = InputBox("أدخل أسم")
Do While Left(na, 1) <> "ع"
 MsgBox na
 na = InputBox("أدخل أسم")
Loop
End Sub

ومن المهم ملاحظة ما يلي :

1. يتم إدخال اسم ابتدائي قبل الدخول للحلقة حيث سيتم فحص الشرط مباشرة

2. لاحظ أن الشرط هو بالسؤال عن الحرف الأول من اليسار Left للاسم وإذا لم يكن يساوي حرف العين نستمر في الدوران وعندما ندخل اسم يكون أول حرف فيه عين يتم التوقف والخروج من الدوران.

3. في داخل الدوران سيتم طباعة النتيجة المطلوبة وهي الأسم ثم سيتم السؤال عن الأسم التالي تمهيدا لتنفيذ الدورة الثانية وهكذا ...

4. الشكر الرابع والأخير من أشكال الحلقات الدورانية المشروطة يتم فيه تنفيذ التعليمات مرة واحدة على الأقل وهو كما يلي :

Do
statements
Loop While condition

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

ولنأخذ المثال التالي وهو حساب مجموع مربعات (تربيع) الأعداد المدخلة . نتوقف عن الحساب ونطبع النتيجة المجموع عندما ندخل العدد 0.

Private Sub ex5_Click()
sum = 0
Do
x = InputBox("أدخل رقم")
sum = sum + x ^ 2
Loop While Not x = 0
MsgBox "مجموع مربعات الأعداد المدخلة هو " & sum
End Sub

لاحظ أن شرط الإنتهاء هو not x = 0 وهو مكافىء للشرط x<> 0 حيث الرمز <> يعني لا يساوي.

لاحظ أيضا أنه في جميع الأشكال الأربعة الساقة لم يحدد في الأمثلة عدد مرات التنفيذ وهكذا تستخدم الحلقات الدورانية في هذه الأشكال عندما لا يعرف عدد مرات التنفيذ (الدوران) مسبقاً.

أما إذا كنا نعلم عدد مرات التنفيذ (الدوران) فإنه من غير المفضل نهائياً استخدام الأشكال السابقة ويجب استخدام الشكل الخاص بالتكرار المروف مرات الدوران مسبقا وهو For .. do التالي :

For counter = start to end [Step increment]
statments
Next [Counter]

حيث أن :

counter : متغير (عداد الحلقة التكرارية)

start : القيمة الإبتدائية للدوران

end : القيمة النهائية للدوران

increment : مقدار الزيادة في كل مرة من مرات الدوران وإذا لم يوضع تكون الزيادة بشكل معياري هي 1

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

وإليكم كيفية تعامل أكسيس مع هذا النوع من الحلقات :

1. عند الدخول للدوران for يتم وضع قيمة counter تساوي القيمة الإبتدائية start .

2. يتم ومباشرة وقبل تنفيذ الجمل التي تلو for إذا كانت قيمة العداد counter أكبر من القيمة النهائية end فإن كانت كذلك يتم إنهاء الدوران والخروج منه .

أما إذا كانت قيمة Increment سالبة فإن الفحص يتم بطريقة عكسية حيث يتم التأكد فيما إذا كانت قيمة العداد counter أقل من القيمة الإبتدائية start وإذا كانت كذلك يتم الخروج من الحلقة.

3. يتم تنفيذ الجمل التي في الحلقة

4. يتم زيادة قيمة العداد بمقدا واحد أو increment إذا كان محدداً.

5. وهكذا يتم تكرار الخطوات من 2 إلى 4 في كل مرة.

ولنأخذ المثال التالي نفرض أننا نريد جمع الأعداد الزوجية من 1 - 100 وطباعة النتيجة :

Private Sub ex6_Click()
sum = 0
For i = 1 To 100 Step 2
sum = sum + i
Next i
MsgBox "المجموع هو " & sum
End Sub

وفي مثالنا الثاني نريد أن نقرأ سام نموذج فإذا كان مفتوح نطبع أن النموذج مفتوح وإلا نطبع غير مفتوح

Private Sub ex7_Click()
n = InputBox("أدخل اسم النموذج")
IsOpen = False
For i = 0 To Forms.Count - 1
 If Forms(i).FormName = n Then
  IsOpen = True
 End If
Next i
If IsOpen Then
 MsgBox " النموذج مفتوح"
Else
 MsgBox "النموذج غير مفتوح"
End If
End Sub

لاحظ أن للنماذج المفتوحة رقم يبدأ من صفر forms.count

ولاحظ اسم النموذج forms(I). formname

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

مع الاحترام والتقدير

looping.rar

#2

أستاذنا الجليل خضر

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

#3

اخي خضر الرجبي

السلام عليكم ورحمة الله وبركاته

الف شكر على هذا الدرس القيم وجزاك الله خيرا ونأمل مواصلة بقية الدروس لتعم الفائدة للجميع وارغب في السؤال هل هناك حلقات تكرارية غير هذه الحلقات ادناه

 Do While <condition>... Loop

 Do Until <condition>... Loop

 Do... Loop While <condition >

 Do... Loop Until <condition>

اختكم

زهره

#4

السلام عليكم

أختي زهرة ، بارك الله فيك

بالنسبة للحلقات المشروطة لا يوجد طرق أخرى .

وقاعدة كتابة هذه الجمل بشكلها المتكامل هو كما يلي :

Syntax

Do [{While | Until} condition]
[statements]
[Exit Do]
[statements]

Loop

Or, you can use this syntax:

Do
[statements]
[Exit Do]
[statements]

Loop [{While | Until} condition]

بالنسبة للحلقات غير المشروطة على غرار for ... next يوجد أيضا تركيب أخر مهم لا نستطيع تجاهله وهو for each ... next وكمثال عليه أقدم لكم ما يلي :

هذا الموضوع يتماشى مع Access 2002 و Access 2003

يستفاد من هذا الموضوع معرفة طريقة إضافة الطابعات المحملة (المعرفة) لجهاز الحاسوب إلى مربع تحرير وسرد (combo box) باستخدام البرمجة بلغة(VBA) .

خطوات الطريقة هي :

1. ندخل إلى خصائص مربع التحرير والسرد ونضغط لسان التبويب الكل (All tab).

2. نغير قيم الخصائص كما يلي :

نضع في خاصية الاسم (Name) الاسم dPrinter

نختار في خاصية نوع مصدر الصف (Row Source Type) قائمة الحقول (Value List)

نضع في حدث عند التحميل للنموذج (On Load) الكود التالي:

Private Sub Form_Load()
Dim prt As Printer
For Each prt In Application.Printers
Me!dPrinter.AddItem prt.DeviceName
Next
End Sub

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

ملاحظة(2): انتبه إلى طريقة استخدام (AddItem).

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

مع الاحترام والتقدير

تم تعديل هذه المشاركة بواسطة خضر الرجبي في 15 يونيو 2005 في 12:08

#6

السلام عليكم

إخواني وأخواتي ، بارك الله فيكم جميعا

الملحق 2 : نهاية درس الحلقات التكرارية .

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

While condition
[statements]
Wend

ويعمل طالما تحقق الشرط condition وبقي محققا يعني true فسيستمر تنفيذ التعليمات statements وعندما يصبح الشرط false يتنهي الدوران

ولنأخذ مثالا عليه :

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

Private Sub PrintStatement_Click()
Dim W, Stat As String
Stat = ""
W = ""
While Not W = "توقف"
 W = InputBox("أدخل كلمة")
 Stat = Stat & " " & W
Wend
MsgBox Left(Stat, Len(Stat) - 4)
End Sub

لاحظوا أننا طبعنا في النهاية قيمة state المتغير النصي الذي سيحتوي على كل الكلمات ولكن - 4 أي بدون الأربعة الحروف الأخيرة لأنها ستكون الكلمة توقف .

2. الخروج من الحلقات الدورانية:

بشكل عام وكما لاحظنا في الدرس الأول فإن الخروج من الحلقة المشروطة يتم عندما يتحقق الشرط المطلوب للخروج وكذلك الحال بالنسبة للحلقات غير المشروطة for ... next فإن الخروج يتم عند اتمام عدد المرات للدوران.

يمكن في كل الأحول ما عدا في (while ... wend) استخدام الخروج المباشر exit for أو exit do ومن أي مكان داخل الحلقة ، ويتم الخروج إلى الجملة التي تلي الحلقة مباشرة.

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

Function IsOpen(ByVal MyFormName As String) As Boolean
Dim i
IsOpen = False
For i = 0 To Forms.Count - 1
 If Forms(i).FormName = MyFormName Then
  IsOpen = True
  Exit For
 End If
Next i
End Function

وطريقة طلب الإقتران ستكون كما يلي :

Private Sub FormCmd_Click()
 MsgBox IsOpen("form1")
End Sub

لاحظ أيضا أن هذا المثال يبين أنه يمكن استخدام exit من داخل if ، وكذلك يمكن استعمالها داخل جملة select إذا كان داخل دوران.

3. التكرار (الدوران) المتداخل Nested Loops

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

Private Sub AddAll_Click()
Dim w As String
Dim out As Boolean
sum = 0
Do
 w = InputBox("الرجاء إدخال عدد الأرقم التي تريد جمعها واحد إلى خمسة أو اي شيء اخر للخروج")
 Select Case w
  Case "واحد": last = 1
  Case "اثنين": last = 2
  Case "ثلاثة": last = 3
  Case "اربعة": last = 4
  Case "خمسة":: last = 5
  Case Else: last = 0
             out = True
  End Select
  For i = 1 To last
   sum = sum + InputBox("أدخل رقم")
  Next i
Loop Until out
MsgBox "المجموع هو " & sum
End Sub

لاحظوا أنه في case else

1> تم تعيين قيمة out = true وذلك للخروج من الحلقة الخارجية المسؤولة عن إدخال الكلمات حيث ان هذه الحالة case يتم الدخول إليها في حال أدخلنا كلمة غير من واحد إلى خمسة.

2> تم تعيين قيمة last =0 حتى لا يتم تنفيذ الدوران for .. next لأنه يبدأ من 1.

أترككم الآن مع هذا الدرس وسأذهب لأعد لكم درس جديد سيكون عن مجموعة التسجيلات فانتظروني ... :D

مع الاحترام والتقدير

ex1-re2.rar

تم تعديل هذه المشاركة بواسطة خضر الرجبي في 16 يونيو 2005 في 11:13

#7

السلام عليكم

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

مع الاحترام والتقدير

#8

استخدام معلمات التسجيلات Bookmarks

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

ويتكون معلم التسجيلة من سلسلة نصية مولدة من الأكسيس لكل تسجيل ويمكن إسناد قيمتها لمتغير نصي (string) ، لحفظها والعودة لها لاحقا.

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

وفي مثالنا التالي ، نريد أن نصمم زر أمر بحيث ينقلنا إلى المسؤول عن الموظف .

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

مع الاحترام

RST_7_Lessons.rar

#9

الاخ خضر الرجبي جزاك الله الف خير والله الحلقات التكرارية هذ كانت معقداني الف شكر لك على هذا الشرح الرائع

هذا الموضوع مغلق.

مواضيع مشابهة