اذهب الي المحتوي
أوفيسنا

نجوم المشاركات

  1. ياسر خليل أبو البراء

    ياسر خليل أبو البراء

    المشرفين السابقين


    • نقاط

      8

    • Posts

      13,165


  2. omar elhosseini

    omar elhosseini

    المشرفين السابقين


    • نقاط

      3

    • Posts

      1,950


  3. النجاشي

    النجاشي

    05 عضو ذهبي


    • نقاط

      3

    • Posts

      1,900


  4. سليم حاصبيا

    سليم حاصبيا

    أوفيسنا


    • نقاط

      3

    • Posts

      8,723


Popular Content

Showing content with the highest reputation on 19 أغس, 2017 in all areas

  1. بعد اذن اخي ابو البراء بالمعادلات: في B2 ,اسحب نزولاً =LEFT(TRIM(A2),FIND("(",TRIM(A2))-1) في D2 اسحب نزولاً =SUBSTITUTE(MID(TRIM(A2),(FIND("*",TRIM(A2))),((FIND("سعر",TRIM(A2)))-(FIND("*",TRIM(A2)))-1)),"*","")+0
    2 points
  2. الاصدقاء الاكارم تحية طيبة الكثير يسال عن طرق البحث في عدة حقول و غالبا ما تكون الطريقة هي استخدام الاستعلام و باضافة عدة معايير له لكن في بعض الاحيان لا يمكن تطبيق هذه المعايير على الاستعلام و نحتاج الى كتابة الكود يدويا في هذا التطبيق اقدم لكم طريقة بسيطة للبحث في جدول مكون من اربع حقول مع ملاحظة انه يمكن البحث ب 21 طريقة من خلال هذا المثال البسيط قد يسال البعض من اين تاتي 21 طريقة و لا يوجد في المثال سوى اربعة حقول الجواب : يمكنك البحث كالآتي 1 الرقم 2 الاسم 3 التاريخ 4 ملاحظات 5 الرقم و الاسم 6 الرقم و التاريخ 7 الرقم و الملاحظات ...... وصولا الى البحث في الحقول الربعة مجتمعة والله من وراء القصد DbSearch.rar
    1 point
  3. السلام على جميع الاخوة الافاضل اما بعد : بعد المعلومات الكثيرة التي استفدت منها من خلال هذا الموقع الذي اصبحت مدمنا عليه ولا استطيع مفارقته افادني الاساتذة الى ضرورة عدم الاكثار من ادراج يوزرفورم في الملف حتى لا يأخذ حجم كبير و يكون خفيف نوعا ما لذلك هناك العديد من الاخوة و انا واحد منهم من يفضل عمل فورم واحدة لتقوم بمختلف العمليات وحتى استغني عن فورم ادراج رقم سري للدخول الى الملف وجدت العديد من الملفات التي حملتها من بعض المواقع الاجنبية يفضلون استعمال input box بدلا من استعمال فورم . بدون اطالة اليكم اخوتي الكود التالي ربما يفيد بعض المبتدئين امثالي ولكم مني خالص عبارات الشكر. 'يوضع هذا الكود في this workbook Sub Auto_Open() Application.Visible = False Dim UserName As String UserName = InputBox("Please Enter Your USER NAME.") If UserName = "123456" Then ' اكتب هناالرقم السري للدخول MsgBox "Correct" UserForm1.Show 'هنا اذا كان لديك يوزر فورم اما اذا لم يكن لديك فورم يمكن مسح هذا السطر Exit Sub Else MsgBox "Incorrect" End If ActiveWorkbook.Save Application.Quit End Sub
    1 point
  4. اسال الله العظيم اخي ان يوفقك ويبارك فيك وجزاك الله خير تمام هو المطلوب شكرا لك كثير استاذي الغالي شفان ريكاني تحياتي لك
    1 point
  5. If Me.وقت_الدخول >= #12:00:00 AM# And Me.وقت_الدخول <= #4:00:00 AM# Then Me.endcont = (Date + Me.Alaim) - 1 Else Me.endcont = Date + Me.Alaim End If ربط الوقت بالتاريخ.rar
    1 point
  6. اليك هذا الكود اذا دخلت من ساعة 12 صباحا الى ساعة 4 صباحا سيكون الناتج تاريخ اليوم زائد تاريخ في الحقل الايام واذا دخلت في غير ساعة سيعطيك تاريخ اليوم زائد تاريخ حقل الايام زائد واحد If Me.وقت_الدخول >= #12:00:00 AM# And Me.وقت_الدخول <= #4:00:00 AM# Then Me.endcont = Date + Me.Alaim Else Me.endcont = (Date + Me.Alaim) + 1 End If هل هذا ما تريد ؟ اليك القاعدة بعد تعديل ربط الوقت بالتاريخ.rar
    1 point
  7. وعليكم السلام ولماذا النقل من جدول الى آخر ، يكفي تغيير الدائرة ما تفكر القيام به غير صحيح في علم قواعد البيانات
    1 point
  8. تفضل المرفق التالي .. وإذا لم يكن المطلوب وضح اكثر بملف مرفق من عندك إذ أني أخبرتك أني لا أعمل على التخمين وفيه نقطة مهمة لابد من العلم بها أنه طالما الصفوف مخفية في النطاق A2:F27 فلا يمكن أن تظهر نفس الصفوف في النطاق H2:M27 وإنما ما يمكن إظهاره وإخفاؤه هو الأعمدة نفسها من H إلى M عموماً المرفق عدلت فيه قليلاً حيث قمت في ورقة الـ recycle بحذف صفوف فارغة بحيث تبدأ البيانات من أول الصف الثالث (لأنك سألت عن تلك النقطة من قبل) وقمت بفك الحماية عن عمود الكميات وخلية التاريخ بحيث تتمكن من الإدخال والورقة محمية فاتورة.rar
    1 point
  9. بارك الله فيك أخي أبو عبد الواجد وجزيت خيراً على دعائك الطيب ، ولك بمثله إن شاء العلى القدير
    1 point
  10. السلام عليكم - شفت لا والله مو سلق بيض - علم - والكود شغال 100 % نساله تعالى ان يوفق وفي ميزان حسناتك الله يرضى عليك
    1 point
  11. من الأفضل تناول نقطة نقطة لأني لا أملك الوقت الآن للعمل على كل النقاط مرة واحدة .. والأفضل إرفاق ملف معبر عن المطلوب كما أخبرتك من قبل الآن تغيرت هيكلة الملف ويوجد تفاصيل جديدة غير موجودة في الملف الأول سأجيبك على نقطة واحدة فقط ألا وهي الصفوف المخفية .. قم باستبدال كلمة rg في السطر التالي rg.EntireRow.Hidden = False بهذه الكلمة ws.Range("A5:F26") كما يفضل أن يكون لكل طلب موضوع مستقل لتجد استجابة أفضل من الأعضاء بالمنتدى تقبل تحياتي
    1 point
  12. إزاي مش فاهم وإنت اسمك علي فاهم (إني أمزح معك) ايه اللي مش مفهوم حاول توضح المشكلة بالنسبة لك فين .. واسأل ولا تخجل من السؤال هل قمت بإدراج فورم؟ إذا كان الأمر كذلك قم بإظهار الـ ToolBox أي صندوق الأدوات من قائمة View (إذا لم يكن ظاهر) ثم من صندوق الأدوات اسم زرر أمر CommandButton وانقر عليه دبل كليك .. هيفتح معاك موديول الفورم ضع فيه هذا السطر Application.Visible = True
    1 point
  13. أعتذر إليك أخي الكريم لأني لم ألاحظ الملف المرفق الذي أرفقته حاول تضع بعض النتائج المتوقعة ليسهل فهم المطلوب .. أنا جربت آخر مرفق من قبل أخونا سليم ويعمل بشكل جيد ما المشكلة التي تواجهك الآن؟
    1 point
  14. بارك الله فيك أخي العزيز سليم المعادلات تمام لكن لم تقم باستخراج العدد بالمعادلات هذا من ناحية .. من ناحية أخرى يوجد خلل في كلا الحلين حيث أن هناك أخطاء في الصفوف من 303 إلى 316 في الحل الذي قدمته بالـ Power Query وبالحل الذي قدمته أخي سليم بالمعادلات لذا قمت بعمل كود يعالج الأمر .. والرجاء من الأخ الكريم أبو عبد الواجد إنه يصحصح ويشوف النتائج كويس .. مش سلق بيض هو :) إليك الكود التالي عله يفي بالغرض ويصحح الأخطاء Sub Test() Dim a As Variant Dim b As Variant Dim s As String Dim i As Long a = Range("A2:A" & Cells(Rows.Count, 1).End(xlUp).Row).Value ReDim b(1 To UBound(a, 1), 1 To 3) For i = LBound(a, 1) To UBound(a, 1) s = CStr(a(i, 1)) b(i, 1) = Trim(Mid(s, 1, InStr(s, "(") - 1)) b(i, 2) = NumByStr(s, "قطعة") b(i, 3) = NumByStr(s, "سعر") Next i Range("B2").Resize(UBound(b, 1), UBound(b, 2)).Value = b End Sub Function NumByStr(strLong As String, strShort As String) As Variant Dim e As Long Dim s As Long e = InStr(1, strLong, strShort, vbTextCompare) If e <= 1 Then NumByStr = "" Exit Function End If Do Until IsNumeric(Mid(strLong, e, 1)) Or Mid(strLong, e, 1) = "." Or Mid(strLong, e, 1) = "," e = e - 1 If e = 0 Then NumByStr = "" Exit Function End If Loop s = e Do While IsNumeric(Mid(strLong, s, 1)) Or Mid(strLong, s, 1) = "." Or Mid(strLong, s, 1) = "," s = s - 1 If s = 0 Then Exit Do Loop NumByStr = Mid(strLong, s + 1, e - s) End Function
    1 point
  15. السلام عليكم : استعمل هذا الكود في حدث عند التحميل لنموذج لمنع التعديل على السجلات السابقة: Me.AllowEdits = False و استعمل هذا الكود خلف زر أمر لسماح بالتعديل على سجلات النموذج: Dim x As Integer x = InputBox("ادخل كلمة السر", "السماح بالتعديل") If x = 1988 Then Me.AllowEdits = True End If
    1 point
  16. السلام عليكم - جزيت خيرا أحمد الله اليك واشكرك استاذ ياسر في صلاة الفجر دعوت لك بالتوفيق وزيادة في الرزق من العلم والصحة الله يجزيك خيرا تسلم تشكر
    1 point
  17. وعليكم السلام أخي الكريم جرب الملف التالي .. ستجد ورقة عمل منفصلة بالنتائج .. إذا قمت بعمل تغيير في ورقة البيانات .. عليك أن تذهب لورقة النتائج وتعمل كليك يمين ثم Refresh لتحديث النتائج فرز البيان = اسم المادة - عدد القطع - سعر القطعة الواحدة - 1.rar
    1 point
  18. الحمدلله انحلت المشكله كان السبب الكود الذي بالحالي
    1 point
  19. استاذي شفان @Shivan Rekanyانظر الي هده القاعده قد يكون فيها التوضيح اكثر عندما تدخل رقم الشقه واحد ستلاحظ رقم السند يتحول خطا والمطلوب يكون ثابت ما يتغير عشان مايعمل معي مشكله بالحفظ
    1 point
  20. تصحيح Private Sub CommandButton1_Click() If TextBox1 + 0 > TextBox2 + 0 Then TextBox3 = "منتظم" _ Else TextBox3 = "متأخر" End Sub او هذا Private Sub CommandButton1_Click() If CInt(TextBox1) > CInt(TextBox2) Then TextBox3 = "منتظم" _ Else TextBox3 = "متأخر" End Sub
    1 point
  21. إخوتى الكرام .. الملف التالى يتناول شرح الدوال الإحصائية .. اتمنى ان يمثل إضافه بسيطة .. وكل عام وانتم بخير .. المرفقـــات الدوال الاحصائية.rar
    1 point
  22. السلام عليكم ورحمة الله وبركاته الدرس الثامن 8-Loop الحلقات التكراريه وسوف نتناول فى هذه الدرس الاتى لماذا نستخدم الحلقات التكراريه انواع الحلقات التكراريه الخروج من الحلقه التكراريه كيفية استخدام اكثر من حلقه داخل الكود ......................................................................... لماذا نستخدم الحلقات التكراريه انا شخصيا بعتبر الحلقات التكراريه واحده من اهم المواضيع التى يجب معرفتها حينما يتم الدخول الى عالم vba يتم استخدام الحلقات التكراريه لتنفيذ اكثر من امر فى وقت واحد مما يوفر الوقت ولتوضيح ذلك راجع المثال الاتى نفترض اننا لدينا مجموعه من الارقام مثلا 7 ارقام (1-2-3-4-5-6-7) ونريد ادخال هذه الارقم فى السطر الثامن بداية من العمود الخامس اى العمود e فكيف سنقوم بعمل ذلك طبعا الى معندوش فكره عن كيفية استخدام الحلقات التكراريه هيستخدم الكود الاتى Sub enterdata() [e8] = "1" [f8] = "2" [g8] = "3" [h8] = "4" [i8] = "5" [j8] = "6" [k8] = "7" End Sub اى سيقوم بالاشاره الى كل خليه على حده واعطاء كل خليه قيمتها كما هو متضح من الصوره وبالتالى بعد كتابة هذه الكود وتخصيص زر لتنفيذه او بالوقوف داخل الكود بالماوس ثم الضغط على f5 سوف يتم ملئ الخلايا بالبيانات كما فى الصوره دعونا الان نتطرق الى كيفيه تنفيذ ذلك بالحلقات التكراريه انواع الحلقات التكراريه 1- FOR 2- WHILE 3- DO ................................................................................................................................................................................................................................................................ الحلقه الاولى for …next هذه الحلقه تبدأ بكلمة FOR وتنتهى بكلمة NEXT وفيما بين الكلميتن هو ما سوف يتم تنفيذه للتوضيح اكتر For بداية الحلقه = اسم الحلقه To طريقه تنفيذ الحلقه] نهايةالحلقه] [ماسيتم تنفيذه داخل الحلقه] [Exit For] الخروج من الحلقه Next استكمال الحلقه حت النهاية وهنا يجب ان نشير الى ان اى حلقه تكراريه لابد ان يكون لها اسم يعبر عنها وليكن مثلا H ثم يجب ان يكون لها بدايه ولها نهايه وليكن ستبدأ من 1 وتنتهى فى 10 ثم سيكون هناك ما ينفذ داخل الحلقه والمقصود بطريقة تنفيذ الحلقه اى هل سيتم تنفيذها خطوه بخطوه وهذا هو الشائع فى الاستخدام ام كل خطويتن ام كل ثلاث خطوات وهكذا ولتطبيق ذلك سنتعرف على كيفية استخدام الحلقه for فى ادخال البيانات فلو اننا نريد ادخال الارقام من 1 الى 4 فى السطر 26 بداية من العمود 8 كيف سنقوم بعمل ذلك 1-نعطى الحلقه اسم معين FOR H H 2-نحدد البدايه 8 ونحدد النهاية 11 FOR H =8 TO 11 لاحظ ان عدد الحلقات هنا 4 عباره عن 8و9و10و111 3-ماسيتم تنفيذه Cells(26, h) = h - 7 4-استكمال الحلقه NEXT وبالتالى سيكون شكل الكود كالاتى Sub enterdata_for() For h = 8 To 11 ' h----- متغير تم تعريه على انه يبدأ من 8 وينتهى عند 11 ' اى ان عدد حلقاته هى 4 عباره عن 8ثم9ثم10ثم11 Cells(26, h) = h - 7 ' هنا يتم تنفيذ الكود ' هنا نقول ان الخليه التى تقع فى السطر26 وفى العمود من8الى11 ' مطروحا منه 7 ارقام ليصبح قيمة المتغير تساوى1hتساوى قيمة المتغير ' Cells(26, H)--- الرقم26هنا يدل على رقم السطر الذى سينفذ فيه الكود ' Cells(26, H)--- عباره عن العمود الذى سينفذ فيه الكود وبذلك يتضحh ' hلنا ان الكود سوف ينفذ على الاعمده من 8الى11 لانها تساوى قيمة المتغير ' h-7 يبدأ من الرقم8وينتهى عند الرقم11 فحينما ينم طرحhبما ان المتغير ' الرقم7 من المتغير بذلك تصبح قيمة المتغير تبدأ من الرقم1وتنتهى عند الرقم4 'وبذلك يكون تنفيذ الكود كالاتى ' الخليه فى السطر26وفى العمود5تساوى الرقم1ثم ' الخليه فى السطر26وفى العمود6تساوى الرقم2ثم ' الخليه فى السطر26وفى العمود6تساوى الرقم3ثم ' وهكذا حت نصل الى اخر الحلقه التكراريه اى العمود11 Next ' hتكرار عمل الكود حتى نهاية المتغير ' next---- forاقفال الحلقه التكراريه End Sub ويكون ناتج الكود بهذا الشكل اما اذا اردنا تنفيذ الكود على الخلايا بشكل عمودى بدلا من الخلايا الافقيه بمعنى لو اننا اردنا مثلا تنفيذ نفس الكود على الخلايا من h23 الى h26 اى فى الخلايا h23 و h24 و h25 و h26 كيف سيكون شكل الكود الكود هيكون نفس الكود السابق ولكن ما سيختلف هو اننا سوف نعيد تغير قيمة المتغير h الخاص بالحلقه التكراريه ليصبح من 23 الى 26 ثم نقوم بتغير موضع المتغير h الخاص بالحلقه التكراريه من الصف الى العمود للتوضيح اكثر الفكره هكلها محصوره فى السطرين دول For h = 8 To 11 هنا طبعا قيمة المتغير h الخاص بالحلقه التكراريه من 8 الى 11 احنا عايزين نخليه يبقى من 23 الى 26 يبقى هيكون بالشكل ده For h = 23 To 26 وكمان فى السطر ده Cells(26, h) = h - 7 وطبعا احنا قولنا ان الجزئيه دى Cells(26 تعنى ان الكود سوف ينفذ على السطر 26 والجزئيه دى Cells( , h) تعنى انه هينفذ على العمود h وطبعا h احنا معرفينه على انه من8 الى 11 اى انه سينفذ على العمود 8 ثم العمود 9 ثم العمود10 ثم العمود11 .................................................................................................... طب حنا عايزين ننفذ الكود على العمود h اى العمود رقم 8 يبقى سطر الكود هيكون بالشكل ده Cells( , 8) وعلى السطور من 23 الى 26 وبما اننا عرفنا h على انه من 23 الى 26 يبقى سطر الكود هيصبح بالشكل ده Cells(h, ) وفى النهاية هنلاقى ان سطر الكود بالكامل بالشكل ده Cells(h,8 ) اى ان الكود سينفذ على السطور h الى احنا عرفناها على انها من 23 الى 26 وعلى العمود رقم 8 وبعد كده تأتى الجزئيه دى = h - 7 ولاننا كنا معرفين h يبدأ من الرقم 8 فطرحنا من h الرقم 7 للحصول على الرقم 1 الى هو اول رقم احنا عايزين ندخله فلا او خليه وبما اننا لسه بردو عايزين نخلى الرقم 1 هو اول رقم يتم ادخاله ولكننا قمنا بتغير قيمة المتغير h لتصبح من 23 وللحصول على الرقم 1 يبقى لابد اننا نطرح من المتغير h ما يعطينا الرقم 1 وبالتالى سنجد سطر الكود هيكون كده = h - 22 وفى النهاية سيكون شكل الكود كده Sub enterdata_for1() Dim h As Integer For h = 23 To 26 Cells(h, 8) = h - 22 Next End Sub ويكون ناتج الكود بهذا الشكل الحلقه الثانيه While سوف نتعرف على كيفيه استخدام الحلقه التكراريه While...Wend هذه الحلقه تبدأ بكلمة While وتنتهى بكلمة Wend وفيما بين الكلميتن هو ما سوف يتم تنفيذه للتوضيح اكتر While [ الشرط ] ما يتم تنفيذه Wend نهاية الحلقه فلو اننا نريد ادخال الارقام من 1 الى 4 فى السطر 38 بداية من العمود 8 كيف سيكون شكل الكود Sub EnterwhileWend() Dim h As Integer ' H--- متغير تم تعريفه على انه رقم صحيح h = 8 ' متغير تم تعريفه على انه يساوى الرقم8----- While h <= 11 ' هنا نقول ان الحلقه التكراريه تكون اقل من الرقم11او تساويه Cells(38, h) = h - 7 ' Cells(38, H)--- الرقم38هنا يدل على رقم السطر الذى سينفذ فيه الكود ' Cells(38, H)--- عباره عن العمود الذى سينفذ فيه الكود وبذلك يتضحh ' hلنا ان الكود سوف ينفذ بديةمن العمود8 لانها تساوى قيمة المتغير ' h-7 يساوى الرقم8 فحينما يتم طرحhبما ان المتغير ' الرقم7 من المتغير بذلك تصبح قيمة المتغير تساوى الرقم1 h = h + 1 'h = h + 1 هنا نقول انه يتم زياده قيمة المتغير بقيمة1صحيح مع كل ' حلقه تكراريه حتى نصل الى الشرط وهو ان يكون اقل من او يساوى11 Wend '-------'نهاية الحلقه While End Sub ويكون ناتج الكود بهذا الشكل الحلقه الثالثه Do تنقسم الى ثلاثة انواع النوع الاول Do While Loop فلو اننا نريد ادخال الارقام من 1 الى 4 فى السطر 57 بداية من العمود 8 كيف سيكون شكل الكود Sub EnterDoWhile() Dim h As Integer ' H--- متغير تم تعريفه على انه رقم صحيح h = 8 ' متغير تم تعريفه على انه يساوى الرقم8----- Do While h <= 11 ' هنا نقول ان الحلقه التكراريه تكون اقل من الرقم11او تساويه Cells(57, h) = h - 7 ' Cells(57, H)--- الرقم57هنا يدل على رقم السطر الذى سينفذ فيه الكود ' Cells(57, H)--- عباره عن العمود الذى سينفذ فيه الكود وبذلك يتضحh ' hلنا ان الكود سوف ينفذ بديةمن العمود8 لانها تساوى قيمة المتغير ' h-7 يساوى الرقم8 فحينما يتم طرحhبما ان المتغير ' الرقم7 من المتغير بذلك تصبح قيمة المتغير تساوى الرقم1 h = h + 1 'h = h + 1 هنا نقول انه يتم زياده قيمة المتغير بقيمة1صحيح مع كل ' حلقه تكراريه حتى نصل الى الشرط وهو ان يكون اقل من او يساوى11 Loop '-------'نهاية الحلقه Do While End Sub ويكون ناتج الكود بهذا الشكل النوع الثانى Do Loop While فلو اننا نريد ادخال الارقام من1 الى 4 فى السطر 67 بداية من العمود 8 كيف سيكون شكل الكود Sub EnterDo() Dim h As Integer ' H--- متغير تم تعريفه على انه رقم صحيح h = 8 ' متغير تم تعريفه على انه يساوى الرقم8----- Do Cells(67, h) = h - 7 ' Cells(67, H)--- الرقم67هنا يدل على رقم السطر الذى سينفذ فيه الكود ' Cells(67, H)--- عباره عن العمود الذى سينفذ فيه الكود وبذلك يتضحh ' hلنا ان الكود سوف ينفذ بديةمن العمود8 لانها تساوى قيمة المتغير ' h-7 يساوى الرقم8 فحينما يتم طرحhبما ان المتغير ' الرقم7 من المتغير بذلك تصبح قيمة المتغير تساوى الرقم1 h = h + 1 'h = h + 1 هنا نقول انه يتم زياده قيمة المتغير بقيمة1صحيح مع كل ' حلقه تكراريه حتى نصل الى الشرط وهو ان يكون اقل من او يساوى11 Loop While h <= 11 ' هنا نقول ان الحلقه التكراريه تكون اقل من الرقم11او تساويه '-------'نهاية الحلقه Do End Sub ويكون ناتج الكود بهذا الشكل النوع الثالث Do Until Loop فلو اننا نريد ادخال الارقام من 1 الى 4 فى السطر 77 بداية من العمود 8 كيف سيكون شكل الكود Sub EnterDoUntil() Dim h As Integer ' H--- متغير تم تعريفه على انه رقم صحيح h = 8 ' متغير تم تعريفه على انه يساوى الرقم8----- Do Until h > 11 ' هنا نقول ان الحلقه التكراريه سوف تنفذ حتى الرقم11 Cells(77, h) = h - 7 ' Cells(77, H)--- الرقم77هنا يدل على رقم السطر الذى سينفذ فيه الكود ' Cells(77, H)--- عباره عن العمود الذى سينفذ فيه الكود وبذلك يتضحh ' hلنا ان الكود سوف ينفذ بديةمن العمود8 لانها تساوى قيمة المتغير ' h-7 يساوى الرقم8 فحينما يتم طرحhبما ان المتغير ' الرقم7 من المتغير بذلك تصبح قيمة المتغير تساوى الرقم1 h = h + 1 'h = h + 1 هنا نقول انه يتم زياده قيمة المتغير بقيمة1صحيح مع كل ' حلقه تكراريه حتى نصل الى الشرط وهو ان يكون اقل من او يساوى11 Loop '-------'نهاية الحلقه Do Until End Sub ويكون ناتج الكود بهذا الشكل الخروج من الحلقه التكراريه نتعرف هنا على كيفيه الخروج من الحلقه التكراريه مثال لو اننا لدينا اسماء فى الخلايا من a80:a85 ونريد فى حالة تطابق الاسم الاسم الموجود فى الخليه b80 مع الاسماء الموجود فى النطاق يتم كتابة الرقم 1 فى الخلايا من c80:c85 وفى حالة فراغ الخليه يتم الخروج من الحلقه التكراريه كيف سيتم تنفيذ ذلك بالكود لاحظ كما فى الصوره ان الخلايا الموجوده فى العمود c فارغه جرب تنفيذ الكود الاتى Sub hima() Dim h As Integer For h = 80 To 85 If Cells(h, 1) = [b80] Then Cells(h, 3) = 1 End If Next End Sub شاهد النتيجه بعد تنفيذ الكود ستلاحظ انه تم ادخال الرقم فى كل خلايا العمود c التى تقابلها فى العمود a الاسم a اما اذا قمنا باضافة exit for الى الكود هكذا Sub hima() Dim h As Integer For h = 80 To 85 If Cells(h, 1) <> [b80] Then Exit For End If If Cells(h, 1) = [b80] Then Cells(h, 3) = 1 End If Next End Sub لاحظ هنا انه تم اضافة هذه الاسطر الى الكود If Cells(h, 1) <> [b80] Then Exit For End If وهنا نقول انه فى حالة ان الخلايا فى العمود الاول لاتساوى الخليه b80 يتم الخروج من الحلقه التكراريه ولا يتم تنفيذ شئ اخر وهنا نلاحظ الاتى كما فى الصوره ان الخليه a80 بها الاسم a وان الخليه a81 بها الاسم b لذلك فان الكود خلال تنفيذه تم اكتشاف ان لااسم فى الخليه الاولى a80 مطابق فتم اعطاء الخليه المقابله لها فى العمود c الرقم1 ثم حينما تم الوصول الى الخليه الثانيه a81 تم اكتشاف انها غير مطابقه فتم الانتقال الى السطر exit for وبذلك تم الخروج من الكود ولم يتم تنفيذ شئ اخر نجد ان exit for تستخدم للخروج من الحلقه التكراريه For Next نجد ان exit do تستخدم للخروج من الحلقه التكراريه do نجد ان exit Sub تستخدم للخروج من الكود نهائيا مثال تلوين الخلايا من g95:k95 باللون الاحمر Sub color_loop() Dim h As Integer For h = 7 To 11 Cells(95, h).Interior.Color = RGB(255, 0, 0) ' red Next End Sub استخدام اكثر من حلقه فى كود واحد مثال ماذا لو اردنا تلوين الخلايا من g102:k102 بالوان مختلفه بحيث تأخذ الخليه ذات الزوجى اللون الاسمر Sub color_loop1() Dim h As Integer For h = 7 To 11 If h Mod 2 = 0 Then Cells(102, h).Interior.Color = RGB(0, 0, 0) ' red Else Cells(102, h).Interior.Color = RGB(200, 0, 0) ' blak End If Next End Sub ماذا لو اردنا ادخال الاسم فردى فى السطور الفرديه والاسم زوجى فى السطور الزوجيه من g109:k114 بحيث يأخذ السطر الفردى الاسم فردى والسطر الزوجى الاسم زوجى Sub color_loop2() Dim h As Integer Dim hh As Integer For h = 1 To 5 For hh = 7 To 11 If h Mod 2 = 0 Then Cells(h + 108, hh) = "زوجى" Else Cells(h + 108, hh) = "فردى" End If Next Next End Sub اتمنى ان يكون الدرس مفيدا مرفق شيت اكسيل به التطبيقات learnvba.rar تقبلوا تحياتى learnvba.rar
    1 point
  23. السادة / أعضاء المنتدى المحترمين سلام الله عليكم جميعا أرفق لكم نموذج لحركة القاطرات ( السيارات ) به شيت لمتابعة الوثائق الخاصة بالسيارات أو أى وثيقة أخرى باسوورد الدخول (( 123 )) وتقبلوا منى وافر الإحترام والتقدير حركة القاطرات.rar
    1 point
  24. شكرا لك أخي الحسامي فعلا معلومات رائعة حول حلقة التكرار ب for و next والشكر موصول للأخ kemas لتحويله للملف إلى فيديو تعليمي وأود التنبيه إلى أنه يمكن تداخل حلقات التكرار فمثلا لو أردنا عمل جدول الضرب يجب علينا عمل حلقة تكرار لجميع الأعداد التي نريد عمل جدول الضرب لها مثلا من 1 إلى 12 وداخل كل رقم من هؤلاء نقوم بضربه في الأرقام من 1 إلى 10 ونضع ناتج الضرب في عمود مستقل يمكننا استعمال ذلك الكود Sub mas() For n = 1 To 12 Cells(1, n).Value = "جدول ضرب " & n For m = 2 To 11 Cells(m, n).Value = m - 1 & " x " & n & " = " & (m - 1) * n Next m Next n End Sub تحياتي للجميع
    1 point
  25. السلام عليكم هذا مثال من عمل أحد الإخوة .. آمل أن تستفيد منه نص متحرك.zip
    1 point
  26. بسم الله الرحمن الرحيم بعض الاعمال السابقة دوال دالة ( VLOOKAnyCol ) تبحث فى اى عمود من الجدول وتستخرج النتيجة من آخر دالة VLOOK2ALL لإستخراج كل حالات البحث دالة VLOOKON بلا حدود تبحث فى عدة جداول دالة تجزئة الاسماء و الارقام دالة "IFYES" اقوى واسهل من "IF" مع احتمالات اكثر دالة اتخاذ القرار ( Resolve ) لتقيم التقديرات و المعدلات والنسب ادوات ذكية استرجاع اعدادات الاكسل الاصلية التخلص من علامات خطأ المعادلات نسخ الاكواد من ملف الى ملف أداة تحويل صيغ المعادلات الى اكواد مصباح علاء الدين للبحث اقوى دالة بحث الحلول الذكية و شريط الادوات الذكية التحكم بأشرطة الادوات والقوائم المنبثقة تلوين السطور الفردية أو الزوجية إكسيل كاميرا برامج واكواد كيفية الحصول على سريال نمبر الهارد ديسك الباحث الشامل اعداد الجدول الزمنى للمشروعات ( مخطط جانت ) إنشاء قوائم منسدلة مرتبطة متعددة المستويات تصدير مدى محدد الى الوورد حل مشكلة عدم ظهور اكثر من 1000 سجل فى قوائم التصفية التلقائية إستخراج النتائج بشرطين صيغة ظريفة سلسلة كيف تدرج دالة فى الاكسل لتكون متاحه لكل الملفات بإنشاء ملف ( AddIn ) يحتوى على دوالك الخاصة منع حفظ الملف بأسم آخر زيادة عملية التراجع و الإعادة ( Undo / Redo ) في الاكسل أكثر من 16 مرة اكسيل 11 كشـف تـوزيـع فئـات النقـديـة كشـف صـرف النقـديـة بالفئـات المتـاحـة إستيراد وتصدير جدول إكسيل من وإلى الأكسيس صمم توقيعك الخاص او علامتك المائية لملفاتك الخاصة كود الدوائر الحمراء والاحرف الخاصة لدرجات الطلاب نموذج طباعة الشهادات المدرسية مع دوائر الارقام برنامج طباعة الشهادات للمرحلة الابتدائية_1 برنامج طباعة الشهادات للمرحلة الابتدائية_2 برنامج طباعة نماذج الشهادات للمرحلة الاعدادية قائمة منسدلة تفلتر مع الاحرف او الاسماء المحددة برنامج حفظ بيانات الشيكات والبحت عنها اكواد و اوامر ( VBA ) مفيدة القائمة المنسدلة المرتبطة بقوائم متعددة المدى او النطاق ( ثابت / ديناميكى ) الارقام العشوائية بدون تكرار البوم للصور والمعروضات, بدون حدود ***** ***** ***** ***** *****
    1 point
  27. بسم الله الرحمن الرحيم والصلاة والسلام على اشرف المرسلين نبينا محمد صلى الله عليه وسلم شرح الخاصية Offset بسؤال من اخونا justice وهذا رابط سؤال اخونا justice لمن اراد الاستفسار عن بعض النقاط او التعليق على هذه المشاركة التى تخص الموضوع المشار اليه سؤال فى VBA, دالة Offset توضيح :: بالنسبة الى لفظى واتجاة ( اليمين واليسار ) اللذان سيتم استخدامهما فى الشرح هنا هما اتجاهان بالنسبة الى الاوفيس العربى ويكون العمود الاول A جهة اليمين وليس اليسار اما من يعمل على نسخ غير النسخة العربية سيكون لفظى واتجاة ( اليمين واليسار ) معكوسين بالنسبة له بعيدا عن خاصية Offset نحكى معا قبل الشرح :: بفرض انك تجلس فى منزلك ثم احتجت الى بعض الاغراض من سوبر ماركت علاء الدين فقلت لابنك احمد اذهب الى سوبر ماركت علاء الدين واحضر لنا هذه الاغراض فقال لك لا اعرف سوبر ماركت علاء الدين فقلت له هل تعرف منزل صديقى ابو محمد فقال نعم فقلت عند منزل صديقى ابو محمد اذهب شارعين الى الامام ثم ثلاثة شوارع الى اليسار ستجد سوبر ماركت علاء الدين ماذا فعل ابو احمد ليحدد لأحمد مكان السوبر ماركت لأبنة احمد :: اولا :: مكان البداية :: حدد له مكان البداية التى يبدأ منها وهى منزل صديقة ابو محمد ثانيا :: الاتجاه من مكان البدايه الى مكان السوبر ماركت :: لفد قال أبو احمد لأحمد من مكان البديه اتجه شارعين الى الامام ثم ثلاثة شوارع الى اليسار لتصل الى الهدف المراد وهو السوبر ماركت اذن ماذا فعل ابو احمد ليصف لأحمد كيفية الوصول الى الهدف :: لقد حدد له مكان البداية ثم حدد له الاتجاه بمعرفة ( الى الامام ) وايضا ( الى اليسار ) اى تم الوصول الى الهدف عن طريق نقطة البداية والانحراف عنها بمعرفة الاتجاهين االرئيسيين وهما ( الى الامام " الى اعلى " او الى الاسفل ) و ( الى اليسار او الى اليمين ) هذا هو ما يفعله التعبير Offset بالتمام اذن ال Offset نحدد لها مكان البداية ثم نحدد لها قيم الانحراف عن مكان البداية بمعرفة الاتجاهين الرئسيين لنصل الى الهدف لنرى هذا التوضيح ليكون اقرب الى الحقيقة بعض الشئ ماذا يحدث اذا قلت لك اخى العزيز ان تفعل الاتى : افتح ملف اكسيل :: اولا :: ابدأ بالوقف فى الخلية A1 ثانيا :: اتجه الى اسفل عدد 2 صف ثالثا :: اتجه الى اليسار عدد 2 عمود رابعا :: اين تقف الان تعالى معى لنرى ماذا فعلت خطوة خطوة بالترتيب السابق ل 4 خطوات فى اولا :: مكان البداية او نقطة الانطلاق :: ستقف فى الخلية A1 وفى ثانيا :: الانحراف او الاتجاه الاول ( وهو عدد من الصفوف ) :: التى تقول ( اتجه الى اسقل عدد 2 صف ) ستتحرك اولا صف واحد الى اسفل لتصبح فى الخلية A2 وثم تتحرك للمرة الثانية صف واحد ايضا لأسفل لتصبح فى الخلية A3 ( هذا هو اول اتجاه ) وفى ثالثا :: الانحراف الثانى ( و هو عدد من الاعمدة اما جهة اليسار او جهة اليمين ) :: لا تنسى اننا وصلنا الى الخلية A3 وسننفذ البند الثالث الذى يقول ( اتجه الى اليسار عدد 2 عمود ) اذن سنتحرك الى جهة اليسار عمود واحد لنصبح فى الخلية B3 ثم نتحرك مرة ثانية الى جهة اليسار عمود واحد لنصبح فى الخلية C3 اما فى رابعا : نرى اين نحن :: فلن نفعل شئ سوى النظر حولنا لنرى اين نحن الان . سنجد اننا نقف فى الخلية C3 هذا ما تقوم به خاصية Offset :: تعطينا مدى يبعد عن مدى محدد بعدد من الصفوف والاعمدة اى تستخدم لتشير الى خلية او مدى بالنسبة الى خلية اخرى او مدى اخر اى ان الخلية او المدى المشار اليه يبعد عن الخلية الاخرى او المدى الاخر بعدد من الصفوف والاعمدة اى انها تعدل المدى الى مدى اخر بعمل ازاحة عنه بعدد من الصفوف والاعمدة اى انها تحدد لنا مدى جديد بدلا من المدى الاصلى اذن نستطيع بأنفسنا بناء صيغة الخاصية Offset لتكون على الشكل التالى :: Offset(rowOffset:=2, columnOffset:=2) وهذه الصيغة مقبولة فى الاكسيل اذن تعالى معى لنحول الاربع بنود السابقة الى لغة الفجوال بيسك Range("A1").Offset(2, 2).Select اولا :: الامر :: Range("A1") هذا هو مكان البداية او الانطلاق هذا هو المكان الذى سيتم التحرك منه للوصل الى الهدف ثانيا :: الامر :: Offset(2, 2) هذا هو وصف الطريق الى الهدف انطلاقا من مكان البداية ( A1 ) اى انه الخريطة التى من خلالها سنصل الى الهدف ماذا تقول هذه الخريطة : هى تقول كلمتان سحريتان للوصول الى الهدف هم :: اتجه الى اسقل عدد 2 صف اتجه الى اليسار عدد 2 عمود الكلمة السحرية الاولى :: ( اتجه الى اسفل عدد 2 صف ) :: هى الرقم الاول بعد ( Offset ) فى الامر اذن الرقم الاول بعد ( Offset ) هو عدد الصفوف التى سنعبرها الى اسفل ولكن عند التنقل بين الصفوف يمكن ان تكون حركتنا خلالها اما الى اسفل او الى اعلى اذن كيف نعرف هل سنتحرك الى اسفل ام الى اعلى اذا كان الرقم الاول بعد ( Offset ) موجب تكون الحركة الى اسفل اما اذا كان الرقم الاول بعد ( Offset ) سالب تكون الحركة الى اعلى اذن نقوم بتنفيذ هذا الرقم الاول بعد ( Offset ) وهو موجب 2 بعد ان عرفنا الفرق بين اعلى واسفل سيكون تحركنا هو موجب 2 اى الى اسفل 2 خلية احنا بدأنا من الخلية ( A1 ) ونود النزول الى اسفل 2 خلية اذن الجزء الاول من الامر ( Offset ) هو من نقطة البداية ( A1 ) تحركنا صفين الى اسفل فأصبحنا فى الخلية ( A3 ) الكلمة السحرية الثانية :: ( اتجه الى اليسار عدد 2 عمود ) :: هى الرقم الثانى بعد ( Offset ) فى الامر اذن الرقم الثانى بعد ( Offset ) هو عدد الاعمدة التى سنعبرها الى الى اليسار ولكن عند الانتقال بين الاعمدة يمكن ان تكون حركتنا خلالها اما الى اليسار او الى اليمين اذن كيف نعرف هل سنتحرك الى اليسار او الى اليمين اذا كان الرقم الثانى بعد ( Offset ) موجب تكون الحركة الى اليسار اما اذا كان الرقم الثانى بعد ( Offset ) سالب تكون الحركة الى اليمين اى بعد الحركة الاولى التى اشارت الى الخلية ( A3 ) سنشير الى عمودين جهة اليسار اى نشير الان الى الخلية ( C3 ) اذن هذا الجزء من سطر الاوامر الذى نفذناه وهو Range("A1").Offset(2, 2) ماذا يقول بعد ان استوعبنا اتجاهات الحركة الخاصة ب ( Offset ) يقول :: بالانتساب الى الخلية ( A1 ) نحن نشير الى الاتجاه صفين الى اسفل وعمودين الى اليسار يعنى اننا اشرنا الى الموقع الجديد وهو الخلية ( C3 ) يعنى مهمة الصيغة ( Offset ) هى الاشارة الى موقع جديد بالنسبة الى موقع البداية بمعلومية عدد الصفوف و الاعمدة يعنى هى لا تقوم بفعل اى شئ سوى الاشارة الى موقع جديد ثالثا :: الامر ( Select ) :: هو الامر التنفيذى فى سطر الاوامر Range("A1").Offset(2, 2).Select هو اخر امر فى الجملة اى هو الفعل الذى سيتم تنفيذة بعد عملية الوصف او الازاحة اى بعد ان تم الاشارة الى موقع جديد وهو الخلية ( C3 ) قم بأختيارة او الوقف فية اذن خلاصة الامر Offset :: بمعلومية خلية البداية يشير الى خلية جديد تبعد عن خلية البداية بعدد من الصفوف والاعمدة فأذا كان عددها الاول موجب كان الاتجاة عدد من الصفوف الى اسقل فأذا كان عددها الاول سالب كان الاتجاة عدد من الصفوف الى اعلى و اذا كان عددها الثانى موجب كان الاتجاة عدد من الاعمدة الى اليسار و اذا كان عددها الثانى سالب كان الاتجاة عدد من الاعمدة الى اليمين :: :: الى من يختلط عليه اتجاة الحركة بين السلب والموجب ولماذا لم يكن العكس الموجب بدلا من السالب والسالب بدلا من الموجب بالنسبة الى اتجاهات الحركة هذا التوضيح عام بمعنى انه ينطبق على نسخ الاكسيل العربية او غير العربية :: تبدأ ارقام الصفوف بالارقام : 1 - 2 - 3 :: سواء فى نسخ الاوفيس العربية والاجنبية اذن اتجاه ترقيم الصفوف هو الموجب دائما فى اى لغة ويبدأ ترقيم الاعمدة :: C - B - A : اذن اتجاه ترقيم الاعمدة هو الموجب دائما فى اى لغة هذا حتى لا يختلط الامر علينا بخصوص اتجاه السالب والموجب :: :: المثال_1 :: Sub Ex_1() Range("F5").Offset(1, -2).Select End Sub فى سطر الاوامر التالى :: Range("F5").Offset(1, -2).Select يشير الى الخلية جديدة بمعلوية الخلية ( F5 ) وتبعد عنها صف واحد الى اسفل وعمودين الى جهة اليمين اى الخلية ( D6 ) ويختارها اى يذهب اليها المثال_2 :: Sub Ex_2() Range("G10").Offset(-3, -5) = "Officena" End Sub يشير الى لخلية جديدة بمعلوية الخلية ( G10 ) وتبعد عنها ثلاثة صفوف الى اعلى وخمسة اعمدة الى جهة اليمين اى الخلية ( B7 ) ويكتب فيها ( Officena ) المثال_3 :: نتذكر احد الامثلة فى شرح الحلقات التكرارية For...Next وكان كالتالى :: Sub Ex_3() For x = 1 To 3 Range("F" & x) = x Next x End Sub وكان يكتب فى المدى F1:F3 الارقام من 1 إلى 3 سنضيف سطر واحد الى هذا المثال نريد منه انه عندما يكتب فى الخلية F1 يكتب معرفة هذه الخلية كلمة "Officena" فى الخلية G1 وهكذا مع F2 و F3 طبعا بإستخدام دالتنا Offset ستكون المخرجات على الشكل التالى الخلية F1 طبعا ستكون = 1 والخلية G1 ستكون = "Officena" الخلية F2 طبعا ستكون = 2 والخلية G2 ستكون = "Officena" الخلية F3 طبعا ستكون = 3 والخلية G3 ستكون = "Officena" لتحقيق ذلك سنضيف سطر واحد الى المثال السابق قبل Next x وهو :: Range("F" & x).Offset(0, 1) = "Officena" ليكون المثال على المنوال التالى :: Sub Ex_3() For x = 1 To 3 Range("F" & x) = x Range("F" & x).Offset(0, 1) = "Officena" Next x End Sub فى البداية سيكت الرقم 1 فى الخلية F1 بالسطر التالى Range("F" & x) = x ثم هذا السطر المضاف ماذا يقول :: Range("F" & x).Offset(0, 1) = "Officena" بالاشارة الى الخلية نفسها التى كتبت الرقم 1 فى الخلية F1 وهى :: Range("F" & x) اعمل لها ازاحة او انحراف عنها عمود واحد جهة اليسار اى الخلية المجاورة لها جهة اليسار اى :: Range("F" & x).Offset(0, 1) وضع فيها القيمة Officena اى :: Range("F" & x).Offset(0, 1) = "Officena" اى ضع فى الخلية G1 كلمة Offset وهكذا حتى يكمل الدورات الثلاثة لنتقدم خطوة مع خاصية Offset هل تعمل هذه الخصية مع خلية مفردة فقط لا طبعا فالخلية المفردة تعتبر مدى او نطاق مكون من خلية واحدة و الخاصية Offset تتعامل فى الاصل مع المدى سواء كان خلية واحدة او مدى مركب من عدة اعمدة وصفوف اى ( جدول بيانات ) لنرى هذا المثال البسيط الذى نود فيه ان نقوم بالاتى :: نريد ان نكتب كلمة Officena فى المدى A1:B10 وهو مكون من عشرة صفوف وهم من الصف 1 - 10 وعمودين اثنين هما العمود A والعمود B بمعنى انه مدى مكون من عشرون خلية اى عبارة عن جدوال من عشرة صفوف وعمودين ليس من المعقول ان نستخدم For...Next لعمل ذلك عن طريق حلقتين تكراريتين لنرى المثال وهو تمهيد فقط للمثال الخامس المثال_4 :: Sub Ex_4() Range("A1:B10") = "Officena" End Sub يقوم هذا المثال بتعبئة المدى A1:B10 بكلمة Officena دفعة واحدة انسخ المثال الى ملف لتجربتة عظيم حتى الان و واضح المثال_5 :: ولكن ماذا اذا اردنا ان نعمل ازاحة لهذا المدى A1:B10 بمقدار عمود واحد عن موقعة الاصلى ( A1:B10 ) بمعنى بدلا من ان يقوم بتعبئة المدى A1:B10 بكلمة Officena يقوم يتعبئة المدى B1:C10 بكلمة Officena Sub Ex_5() Range("A1:B10").Offset(0, 1) = "Officena" End Sub نرى فى هذا الكود اننا تعاملنا مع هذا المدى كما تعاملنا مع مدى مكون من خلية مفردة نعم فالخاصية Offset مرنة ويمكنها التعامل مع الاوضاع التالية :: مدى مكون من خلية واحدة مدى مكون من مجموهة صفوف واعمدة اى جدول مدى مكون من عدة امدية او نطاقات مجمعة تشمل اى عدد من النوعين السابقين ولنرى مثال لذلك وعليك ان تقوم بالتجربة وتعديل المدى الى اى من الحالات الثلاثة السابقة المثال_6 :: Sub Ex_6() Range("A1:B10,F1:G10").Offset(0, 1) = "Officena" End Sub يحتوى هذا المثال على نطاقين عبارة عن جدولين هما النطاقين :: A1:B1 F1:G10 وسوف يقوم الكود بتعبئة نطاقين جديدين بمعرفة النطاقات السابقه بكلمة Officena على ان تكون النطاقات الجديدة لها ازاحه او انحراف عن النطاقات الاصلية بمقدار عمود واحد Range("A1:B10,F1:G10").Offset(0, 1) وهذه النطاقات بعد الازاحة ستكون B1:C1 بدلا من A1:B1 G1:H10 بدلا من F1:G10 وعليك تطبيق هذا المثال عمليا لترى وتستوعب طريقة عمل الخاصية Offset وايضا لتعرف هل استوعبت هذا الشرح ام هو غير مجدى والى لقاء قريب بإذن الله بصالح دعائكم
    1 point
  28. بسم الله الرحمن الرحيم والصلاة والسلام على اشرف المرسلين نبينا محمد صلى الله عليه وسلم الحلقات التكرارية For...Next بسؤال من اخونا justice وهذا رابط سؤال اخونا justice لمن اراد الاستفسار عن بعض النقاط او التعليق على هذه المشاركة التى تخص الموضوع المشار اليه شرح For...Next و الجوانب المتعلقة بها و طرق استخدامها التعبير For...Next هو يقوم بتكرار تنفيذ مجموعة من الاوامر او الاجراءات عدة مرات محددة العدد ونحتاج الية دائما بدلا من تكرار كتابة مجموعة اوامر مثلا 100 مرة تقوم For...Next بنتفيذة 100 مرة ولكن مجموعة اسطر الاوامر ستكتب مرة واحدة فهى تختصر الجهد والوقت و التعبير For...Next له عدة مسميات منها : الحلقة الدوارة او الحلقات الدوارة وايضا يسمى ب الحلقة او الدورة وايضا تسمى ب الحلقات التكرارية على اساس ان التعبير For...Next يؤدى الى تكرار تنفيذ مجموعة من الاوامر او الاجراءات التى تكون بين شقيى For...Next بعدد محدد من مرات التنفيذ ولذلك تسمى بالحلقة او الدوره او التكرارية والتعبير او الحلقة For...Next يستقبل اربعة متغيرات الاول :: العداد :: وهو متغبر عددى الذى يتحكم فى عدد دورات او مرات التكرار ل For...Next وهو الزامى الوجود لتعمل الحلقة الثانى :: قيمة بداية العداد :: التى بيدأ منها العداد بالعد - وهو الزامى الوجود لتعمل الحلقة الثالث :: قيمة نهاية العداد :: التى ينتهى بها العداد وينم الخروج من الحلقة التكرارية وهو الزامى الوجود لتعمل الحلقة الرابع :: الخطوة :: وهى القيمة التى يزداد او ينقص بها العداد وهى اختيارية اذا كانت قيمتها +1 والصورة المبسطة منها كما نرى : For x = 1 To 3 مجموعة اسطر من الاوامر Next x لنضع انفسنا مكان جهاز الكبيوتر لنرى كيف تعمل عندما يبدأ بقراءة هذا الكود الدورة الاولى :: السطر الاول :: وهو For x = 1 To 3 قراء الكبيوتر السطر الاول ووجد انه صدرت له الاوامر التالية ابدأ حلقة تكرارية بالعداد ( x ) الذى قيمة بدايته تساوى ( 1 ) وقيمة نهايتة تساوى ( 3 ) هذه اول دورة تكرارية ستكون قيمة العداد ( x ) تساوى ( 1 ) بمعنى اخر صدرت له الاوامر بعمل حلقة تكرارية لثلاث مرات تبدأ ب 1 وتنهى ب 3 لتنفبذ مجموعة الاوامر التى تقع بين For و Next وفى نهاية هذا السطر الاول من المفروض ان يكون هناك معامل اخر وهو الخطوة ( Step 1 ) ولكن يسمح لنا بتجاهلة طالما قيمة هذه الخطوة تساوى ( 1 ) السطر الثانى :: نفذ مجموعة الاوامر التى من الممكن ان تكون اكثر من سطر السطر الثالث :: ( Next x ) عنما يصل الى نكست يزيد قيمة العداد بقيمة الخطوة ( 1 ) اى ان قيمة العداد ( x ) ستكون مساوية ل ( 2 ) استعدادا للدورة الثانية هنا انتهت الدورة الاولى وكانت قيمة العداد = ( 1 ) وسيبدأ الدورة الثانية وستكون قيمة العداد = ( 2 ) الدورة الثانية :: سيعيد تنفيذ السطر الثانى ولكن ستكون قيمة ( x ) تساوى 2 الدورة الثالثة :: سيعيد تنفيذ السطر الثانى ولكن ستكون قيمة ( x ) تساوى 3 وفى هذه الدور الثالثة عندما ينتهى من نتفيذ السطر الثانى ( مجموعة الاوامر ) ثم ينتقل السطر الثالث ( Next ) لزيادة قيمة العداد بقيمة الخطوة ليصبح العداد ( x ) مساويا ل ( 4 ) تقول له ( Next ) لا حبيبى غير مسموح للعداد بالزيادة لان قيمة نهاية العداد هى ( 3 ) وانت تعرف ذلك من بداية الدورة الاولى اخرج من حلقتى وتنهى الحلقة تبعا لذلك المثال_1 :: Sub Ex_1() For x = 1 To 3 Range("F" & x) = x Next x End Sub لنرى هذا المثال معا وهو على نمط مثال الشرح الاولى السابق مع اضافة سطر اوامر لتنفيذة الدورة الاولى :: السطر الاول :: وهو For x = 1 To 3 العداد هو المتغير العددى x وقيمة البداية له = 1 وقيمة النهاية له = 3 اذن قيمة العداد x تساوى 1 السطر الثانى :: وهو سطر الاوامر Range("F" & x) = x اكتب فى الخلية F1 القيمة x التى تساوى 1 فى الدورة الاولى السطر الثالث :: وهو Next x ولها وظيفة واحدة فقط وهى زيادة او انقاص العداد بقيمة الخطوة وهى هنا زيادة العداد ب 1 اى تصبح x = 2 الدورة الثانية :: قيمة العداد x تساوى 2 السطر الثانى :: وهو سطر الاوامر Range("F" & x) = x اكتب فى الخلية F2 القيمة x التى تساوى 2 فى الدورة الثانية السطر الثالث :: وهو Next x يقوم بزيادة العداد x من 2 إلى 3 الدورة الثالثة :: قيمة العداد x تساوى 3 السطر الثانى :: وهو سطر الاوامر Range("F" & x) = x اكتب فى الخلية F3 القيمة x التى تساوى 3 فى الدورة الثالثة السطر الثالث :: وهو Next x نكست تجد العداد اتى اليها للزيادة مرة اخرى ماهى سيابه بقى فتذكره ايها العداد x الم ترى فى السطر الاول من الحلقة انك تنتهى عندما تكون = 3 أخرج من هذه الحلقة التكرارية وتنهى بذلك هذه الدورة التكرارية التى تم تكرارها ثلاثة مرات المثال_2 :: اذا اردنا ان نكتب فى العمود G بدأ من الصف الاول نزولا الى اسفل الارقام الفردية من 1 إلى 100 ماذا ستكون بداية العداد ونهايته وخطوته اذن ستكون بداية العداد =1 لان ال 1 عدد فردى الخطوة او مقدار الزيادة التى يزداد بها العداد لنحصل على العدد الفردى التالى ل 1 يجب ان تكون 2 ليكون العدد الفردى التالى هو 3 ونهاية العداد ستكون = 99 لان ال 99 عدد فردى وايضا يمكن ان تكون نهاية العداد = 100 لان التحكم هنا سيكون ل Next لماذا لان Next عندما يأتى اليها العداد وقيمتة 99 للزيادة الى 101 لن تسمح له Next بذلك لان قيمة نهاية العداد هى 100 ولكن يجب ان نلاحظ انه اذا استخدمنا قيمة العداد لتحديد رقم الصف الذى سنضع فية الارقام سنجد انه تبعا لقيم العداد سيكتب على السطور الفردية وهى 1...3...5...7...9...11 الخ لانها قيم العداد اذن نحن محتاجين الى احد القرود التى تستطيع العد من 1 إلى 100 ليجلس داخل الحلقة For...Next ليحدد لها الصف الذى تكتب فيه لنرى هذا المثال_2 :: Sub Ex_2() MyRow = 0 For x = 1 To 100 Step 2 MyRow = MyRow + 1 Range("G" & MyRow) = x Next End Sub الدورة الاولى :: السطر الاول :: MyRow = 0 هذا هو القرد MyRow الذى سيحدد لنا رقم الصف الذى نكتب عليه وهو خارج الحلقة وقيمتة تساوى صفر الان ولم يصحو من نومه بعد السطر الثانى :: For x = 1 To 100 Step 2 تحدثنا عنه وهو يحدد بداية العداد ب 1 ونهاية العداد ب 100 ومقدار الخطوة او الزيادة = +2 يعنى قيمة x = 1 السطر الثالث :: MyRow = MyRow + 1 ونحن الان فى الدورة الاولى من الحلقة ينشط قردنا عداد الصفوف و ستكون قيمة هذا القرد تساوى 1 السطر الرابع :: Range("G" & MyRow) = x هذا السطر بيقول اكتب فى العمود G فى صف القرد MyRow الذى قيمتة 1 اكتب x التى قيمتها 1 السطر الخامس :: سنزيد Next العداد وهو = 1 بقيمة الخطوة التى = 2 ليصبح العداد = 3 استعدادا للدورة الثانية x = 3 الدورة الثانية :: السطر الثالث :: MyRow = MyRow + 1 ونحن الان فى الدورة الثانية من الحلقة ستصبح قيمة القرد عداد الصفوف 2 السطر الرابع :: Range("G" & MyRow) = x هذا السطر بيقول اكتب فى العمود G فى صف القرد MyRow الذى قيمتة 2 اكتب x التى قيمتها اصبحت 3 و زى ما اتفقنا ان قيمة زيادة العداد ستكون 2 ويتكرر حدث الدورة الى ان يتم طرد قرد الصفوف من الحلقة الدوارة عندما تجد Next ان العداد x سيتجاوز حدود قيمة نهاية العداد وهى 100 المثال_3 :: لنتقدم خطوة الى الامام نود فيها ان نكتب فى العمود H الاعداد الزوجية بدأ من الصف الاول نزولا الى اسفل ولكن بشرط ان تكون ارقام تنازلية اى 100...98...96...94...92 وليس تصاعدية 2...4...6...8...10 لنرى هذا المثال_3 :: Sub Ex_3() MyRow = 0 For x = 100 To 2 Step -2 MyRow = MyRow + 1 Range("H" & MyRow) = x Next End Sub نرى فى هذا المثال ان القرد كما هو لانه هو منظم المرور الذى يحدد ارقام الصفوف المستخدمة سطر بداية الحلقة وهو For x = 100 To 2 Step -2 نرى ان العداد قيمتة الابتدائية = 100 وقيمتة النهائية = 2 ونلاحظ ان الخطوة او مقدار الزيادة او النقص ( Step -2 ) فى العداد ستكون سالب 2 اى -2 طبعا لاننا نود ان تبدأ الحلقة بكتابة الرقم 100 ثم 98 ثم 96 وهكذا وسيتم التنفيذ بنفس اسلوب المثال الثانى وبنفس قيم ارقام صفوف القرد العداد ولكن بلإختلاف قيمة العداد x بقيمة الزوجية لنلقى نظرة على المثال الثانى والثالث من حيث الخطوة Step سنجدها فى المثال الثانى موجبة وفى الثالث سالبة ماذا نلاحظ :: عندما تكون الخطوة Step موجبة تكون بدية العداد اصغر من نهاية العداد اما عندما تكون الخطوة Step سالية تكون بدية العداد اكبر من نهاية العداد لاتقصر فائدة الحلقات التكرارية على هذا التنفيذ البسيط ولكنها تعمل اشياء على درجة من الاهمية ويمكن ان تكون هناك حلقات تكرارية متداخلة بمعنى ان يمكن ان يكون هناك حلقتان متداخلتين معا او اكثر المثال_4 :: اذا اردنا ان نكتب الاعداد من 1 إلى 100 فى عشرة صفوف وعشرة اعمدة متتالين بدأ من الخلية الاولى فى الصف الاول اى نكتب فى الصف الاول 1 إلى 10 وفى الصف الثانى 11 إلى 20 وفى الصف الثالث 21 إلى 30 هكذا حتى 100 هنا يجب عمل حلقتان تكراريتين الحلقة الاولى :: او الخارجية ستقوم بوظيفة تحديد الصف الذى سنكتب فية وهى هنا حلقة للتحكم فى رقم الصف اى تنظيمية وستقوم بتكرار الحلقة الثانية او الحلقة الداخلية او الحلقة الفعلية التى ستكتب الارقام داخل الصف الذى حددته الحلقة الخارجية عشرة مرات بأرقام متتالية الحلقة الثانية ستقوم بتحديد رقم العمود وتقوم بالكتابة فية تبعا للصف الذى حددتة الحلقة الخارجية سابقا ماذا ينقصنا هنا فعلا ينقصنا قرد ولكن لن يكون له شأن برقم الصف او حتى برقم العمود الذى ينقصنا هنا قرد رقمى لا يعرف سوف الاعداد من 1 إلى 100 حتى يقول لنا القرد اى رقم سنكتب لنرى مثالنا Sub Ex_4() Number = 0 For MyRow = 1 To 10 For MyCol = 1 To 10 Number = Number + 1 Cells(MyRow, MyCol) = Number Next MyCol Next MyRow End Sub الدورة الاولى للحلقة الخارجية :: السطر الاول :: هذا هو القرد الرقمى Number = 0 وهو لا يعرف سوى ان يعد من 1 إلى 100 ولكن نرى ان قيمتة هنا صفر نعم لانه لن يبدأ بتحديد الرقم المراد كتابتة هنا بل وهو داخل الحلقة التكرارية الثانية وقبل كتابة تزاد قيمتة الى 1 السطر الثانى :: هو For MyRow = 1 To 10 وقد اشرنا ان الحلقة الاولى او الخارجية لتنظيم ارقام الصفوف ولذلك سمينا عدادها ب MyRow الذى يبدأ ب 1 وينتهى ب 10 وهى ارقام الصفوف التى سوف نستخدمها ولذلك ستكون قيمة MyRow فى الدورة الاولى للحلقة الخارجية = 1 السطر الثالث :: وهو For MyCol = 1 To 10 وهنا تبدأ الدورة الاولى للحلقة الداخلية من الدورة الاولى للحلقة الخارجية وقد اشرنا ان الحلقة الثانية او الداخلية لتنظيم ارقام الاعمدة والكتابة ولذلك سمينا عدادها ب MyCol الذى يبدأ ب 1 وينتهى ب 10 وهى ارقام الاعمدة التى سوف نستخدمها ولذلك ستكون قيمة MyCol فى الدورة الاولى للحلقة الداخلية للدورة الاولى من الحلقة الخارجية = 1 السطر الرابع :: هنا القرد الرقمى يبدأ فى النشاط ويجهز نفسة بأول رقم سيكتب وهو 1 Number = Number + 1 السطر الخامس :: وهو Cells(MyRow, MyCol) = Number يكتب فى الخلية التى صفها MyRow وهو = 1 وعمودها MyCol وهو = 1 يكتب فيها القرد الرقمى وهو = 1 السطر السادس :: وهو Next MyCol وهو يختص بزيادة قيمة MyCol الى 2 يعنى حدد لنا مكان الكتابة التالى بالعمود 2 على الصف الاول الخاص بالحلقة الخارجية لاننا سنتهى اولا من العشر دورات الخاصة ب الحلقة الداخلية لكتابة الارقام من 1 إلى 10 فى الصف الاول قبل ان نتقل الى Next MyRow لتغير رقم الصف استعدادا للدورة الثانية للحلقة الخارجية اذن بعد زيادة قيمة MyCol الى 2 بواسطة Next MyCol سيذهب الى السطر الرابع ليسئل القرد الرقى Number = Number + 1 اى رقم سنكتب بعد ذلك فبقول 2 ثم يذهب الى السطر الخامس وهو Cells(MyRow, MyCol) = Number مازلنا فى الحلقة الداخلية وقيمة الصف MyRow تساوى 1 لاننا لم ننهى من تنفيذ العشر دورات الخاصة بالحلقة الداخلية ولكن رقم العمود MyCol اصبح = 2 اى سيكتب فى الخلية التى رقم صفها 1 ورقم عمودها 2 سيكتب القرد الرقمى اى 2 وهكذا يستمر قى الكتابة على الصف الاول الى ان تنتهى العشر دورات الخاصة بالحلقة الداخلية وبذلك يكون كتب قى الصف الاول الارقام من 1 الى 10 وبإنتهاء العشر دورات للحلقة الداخلية يخرج منها ليصل الى السطر الثامن الخاص بالحلقة الخارجية السطر الثامن :: وهو Next MyRow لتصبح قيمة MyRow اى رقم الصف = 2 لنبدأ الدورة الثانية من الحلقة الخارجية برقم صف = 2 ويذهب الى السطر الثالث وهو For MyCol = 1 To 10 ليبدأ عشرة دورات للحلقة الداخلية من جديد وبرقم عمود 1 ورقم صف معنا من قبل ذلك وهو 2 ثم يأتى سطر الرابع سطر القرد الرقمى Number = Number + 1 ونسئلة اى رقم سنكتب فيقول 11 انا صاحى لك ثم يأتى السطر الخامس Cells(MyRow, MyCol) = Number فيقول اكتب القرد الرقمى الذى = 11 فى الخلية التى صفها = 2 وعمودها = 1 حتى تنتهى الحلقة الداخلية من دوراتها العشر الخاصة بالدورة الثانية من الحلقة الخارجبة وبذلك تكون كتبت فى الصف الثانى الارقام من 11 إلى 20 وهلم جر الى ان تنتهى الدورة الخارجية من دوراتها العشر وتكون الحلقة الداخلية قد اكملت دوراتها المائة نعم الحلقة الداخلية تؤدى 100 دورة لماذا لان الحلقة الخارجية تنفذ 10 مرات وفى كل مرة تنفذ الحلقة الداخلية 10 مرات اذن الداخلية تنفذ عشر عشرات اى 100 دورة المثال_5 :: فى كثير من الاحيان نستخدم الحلقة الدوارة فى فحص البيانات او التأكد من حدوث شئ معين ونود الخروج منها قبل ان تكمل دورتها المحددة بنهاية العداد فى هذه الحاله نستخدم الجملة الشرطية : If...Then... فاذا تحقق الشرط نخرج من الحلقة ب Exit For نعود الى المثال_1 الذى يكتب فى العمود F بدأ من الصف الاول الارقام من 1 إلى 3 ونضيف له جملة شرطية تقول بعد ما تكتب الرقم 2 اخرج من الدورة ولا تكمل باقى الدورات Sub Ex_5() For x = 1 To 3 Range("F" & x) = x If x = 2 Then Exit For Next End Sub نرى فى السطر الاول ان العداد يبدأ ب 1 وينتهى ب 3 والسطر الثانى يكتب قيمة العداد فى الخلية F1 والعداد = 1 فى الدورة الاولى السطر الثالث يختبر العداد هل هو = 2 يقول له لا السطر الثانى قى الدورة الثانية يكتب قيمة العداد فى الخلية F2 والعداد = 2 فى الدورة الثانية السطر الثالث فى الدورة الثانية يختبر العداد هل هو = 2 يقول له نعم فيقول اذن اخرج من الدورة Then Exit For نجد هنا ان الدورات الثلاثة لم تكتمل بسب السطر الشرطى الذى يجبر الحلقة على الخروج بعد ان بصل العداد الى الرقم 2 وتتم كتابتة فى بعض الاحيان نود عمل حلقة تكرارية لتكرار تنفيذ بعض الاشياء ولا يهمنا ان نعرف عددها او بدايتها ونهايتها او لا نحتاج الى قيمة الخطوة فكل ما يهمنا هو تنفيذ بعض من الاوامر على مجموعة اهداف او نقوم بالبحث عن شئ محدد فى مجموعة من الاهداف فى هذه الحالة نستخدم حالة خاصة من For...Next الا وهى For Each...Next وهى لا تختلف كثيرا عن الاولى ولكن يتم تجاهل العداد وتوابعه ( البداية - النهاية - الخطوة ) تحل محلها حلقة تكررارية على كل عناصر الهدف المثال_6 :: لنفرض انه فى العمود F فى المدى F1:F10 مكتوب الارقام من 1 إلى 10 ونود استبدال محتويات الخلية التى تحتوى على الرقم 5 بكلمة Officena Sub Ex_6() Dim Cel As Range For Each Cel In Range("F1:F10") If Cel = 5 Then Cel = "Officena" Next End Sub لا تنسى كتابة الارقام من 1 إلى 10 فى المدى F1:F10 لتتم تجربة المثال السطر الاول :: وهو Dim Cel As Range تم الاعلان عن المتغير Cel كمدى الذى ستتم علية عملية الاختبار وهذا المدى سيكون عبارة عن خلية واحدة من خلايا المدى فى كل دورة لإختبارها ففى كل دورة سيكون هذا المتغير يمثل خلية واحدة من المدة المشار اليه السطر الثانى :: وهو For Each Cel In Range("F1:F10") هنا تم الاستغناء عن العداد وتوابعه وهذا يعنى ان الدورات ستكون بعدد خلايا المدى المشار اليه Range("F1:F10") اى اعمل دورة لكل خليه فى المدى المشار اليه السطر الثالث :: وهو If Cel = 5 Then Cel = "Officena" هذا سطر الشرط او الاختبار ويقوم بإختبار الخلية التى عليها الدور اذا كانت = 5 يقوم بتغير قيمتها الى Officena اذا لم يتحقق الشرط يذهب الى السطر الرابع السطر الرابع :: وهو Next اى انتقل الى الخلية التالية فى المدى المشار اليه سابقا ليتم التنفيذ عليها وهكذا الى ان تنتهى الدورة فإذا وجد اى خلية = 5 يتم استبدال محتويتها الى Officena الى ان تنهى كل الدورات فالحلقة التكرارية For...Next من اقوى الحلقات الدوارة الاخرى واذا استعطت اجادتها وتطويعها يمكنك الاستغناء نهائيا عن الحلقتان الاخرتين وهما Do...Loop واخوتها While...Wend والحلقة Do...Loop اقوى من الحلقة While...Wend والى لقاء قريب بإذن الله بصالح دعائكم
    1 point
  29. السلام عليكم ورحمة الله وبركاته، المرفق التالي يشتمل على ملفين الأول هو عرض تقديمي على برنامج الباور بوينت يشتمل على شرح وافي وشامل عن طريقة إنشاء قائمة منسدلة مع مربع التحرير والسرد (Combo Box) .. والملف الآخر هو ملف إكسل مطبق به كل ما جاء في العرض التقديمي .. أتمنى أن يحوز على أستحسانكم. شكراً للجميع، Combo_Box_Explanation.rar
    1 point
  30. الصيغة التالية تخرج لك أسم مقدم أدنى سعر: =IF(M2=F2,E2,IF(M2=I2,H2,IF(M2=L2,K2,""))) شاهد المرفق، _______________________.rar
    1 point
×
×
  • اضف...

Important Information