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

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

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

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

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


    • نقاط

      13

    • Posts

      13165


  2. الصـقر

    الصـقر

    الخبراء


    • نقاط

      4

    • Posts

      1836


  3. ibn_egypt

    ibn_egypt

    الخبراء


    • نقاط

      2

    • Posts

      764


  4. أبو محمد عباس

    أبو محمد عباس

    05 عضو ذهبي


    • نقاط

      2

    • Posts

      1410


Popular Content

Showing content with the highest reputation on 12/09/14 in مشاركات

  1. زملائى بالمنتدى العزيز على قلبى مما لا شك فيه ان موضوع إيجاد الفرق بين تاريخين او طرح تاريخين يهم الكثير من مستخدمى الاكسيل لذالك اقدم لكم شرح مبسط لداله DateDif تستخدم هذه الدالة فى إيجاد الفرق بين تاريخين او طرح تاريخين شكل الدالة يكون كالتالى DATEDIF(Date1, Date2, Interval) شرح الداله الداله هى DateDif وتتكون من 3 أجزاء Date1 هو تاريخ الاقدم Date2 هو تاريخ الاحدث Interval وهو نوع النتيجة المطلوبه انواع Interval كما بالصورة واليكم تطبيقات عمليه بالصور للداله مثال 1 لدينا تاريخ بالخلية A1 وهو 2010/08/05 تاريخ الميلاد (مثلا) وتاريخ بالخلية B1 وهو 2014/12/08 تاريخ اليوم (مثلا) ونريد كم فرق السنوات بين تاريخين ( اى كم عمر الطفل بالسنوات عند هذا التاريخ) نكتب بالخلية C1 الداله التالية =DATEDIF(A1;B1;"y") نلاحظ هنا اننا استخدمنا حرف Y وهو اختصار لـ Year ونلاحظ ايضا انها مكتوبة بين علامتين تنصيص " " ويكون ناتج المعادله وهو 4 سنوات كما بالصورة مثال 2 اذا اردنا حساب الفرق بالشهور نغيير Y الى M وهو اختصار month وتكون المعادله كالتالى =DATEDIF(A2;B2;"m") ويكون النتيجة هى 52 شهر كما هو موضح بالصورة . مثال 3 اذا اردنا حساب الفرق بالشهور نغيير m الى D وهو اختصار Day وتكون المعادله كالتالى =DATEDIF(A2;B2;"d") ويكون النتيجة هى 1586 يوم كما هو موضح بالصورة مثال 4 اذا اردنا حساب الفرق بين التاريخين كم سنة وكم شهر وكم يوم بفرض ان التاريخين بالمثال الاول بالخلية A2 والخلية B2 وتكون المعادله كالتالى نضع بالخلية C2 المعادله التالية =DATEDIF(A2;B2;"y") ونضع بالخلية D2 المعادله التالية =DATEDIF(A2;B2;"ym") ونضع بالخلية E2 المعادله التالية =DATEDIF(A2;B2;"md") ونلاحظ النتيجة كما هو موضوح بالصورة اتمنى ان اكون وفقت بالشرح وان شاء الله سوف اجهز المزيد من الامثله العملية والمصحوبه بالصور تقبلوا منى وافر الاحترام والتقدير
    3 points
  2. السلام عليكم الشكر موصول للاخ ibn_egypt وهذا كود مشابه لما تفضل به مع بعض التعديلات Private Sub UserForm_Initialize() Dim wSh As Worksheet: Set wSh = Sheet2 Dim iLrw As Long: iLrw = wSh.Cells(wSh.Rows.Count, 1).End(xlUp).Row Dim iI As Integer Dim sTex As String For iI = 1 To iLrw If iI = 1 Then sTex = wSh.Range("A" & iI) Else sTex = sTex & " - " & wSh.Range("A" & iI) Next HTML sTex, 4, 5 End Sub Private Sub HTML(sTexte As String, iSize As Integer, iScrollAmount As Integer) Me.WebBrowser1.Navigate _ "about:<html><body BGCOLOR ='' scroll='no'><font color= #00000 " & _ " size=" & iSize & " face='Arial'><marquee direction=right ; font-size: 14pt;" & _ " color: white; border-style: ridge; border-color: scrollAmount=" & iScrollAmount & ">" & sTexte & "</marquee></font></body></html>" End Sub ينسخ الكود كما هو في الفورم اما السطر HTML sTex, 4, 5 فيعني على التوالي مايلي النص, حجم الخط, سرعة التحرك اي انه يمكنك التحكم في الخصائص التي سبقة من هذا الكود فقط WebBrowser.rar وهذا حل اخر عن طريق textbox Const cVitesse As Currency = 0.01 Dim bStart As Boolean Sub MovBar() Do While bStart timer_avant = Timer Do While Timer < timer_avant + cVitesse DoEvents Loop sMove Loop End Sub Sub sMove() Dim iWidth As Integer: iWidth = Me.TextBox1.Width Dim iI As Integer For iI = 1 To iWidth timer_avant = Timer Do While Timer < timer_avant + cVitesse DoEvents Loop Me.TextBox1.Left = -iWidth + iI Next End Sub Private Sub UserForm_Activate() bStart = True MovBar End Sub Private Sub UserForm_Initialize() Dim wSh As Worksheet: Set wSh = Sheet2 Dim iLrw As Long: iLrw = wSh.Cells(wSh.Rows.Count, 1).End(xlUp).Row Dim iI As Integer Dim sTex As String For iI = 1 To iLrw If iI = 1 Then sTex = wSh.Range("A" & iI) Else sTex = sTex & " - " & wSh.Range("A" & iI) Next Me.TextBox1 = sTex With Me.TextBox1 .AutoSize = True .BackStyle = 0 .SpecialEffect = 0 End With End Sub Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) bStart = False End End Sub textbox.rar تحياتي للجميع
    2 points
  3. السلام عليكم نموذج فواتير منوع (مبيعات /مشتروات/ مردوات المبيعات/مردودات المشتروات) بامكانية: الترحيل والبحث والتعديل وحذف الكل طلب للاخ تامر جمال جعلته هنا لفائدة الجمع الكريم ______________.rar
    1 point
  4. السلام عليكم ورحمة الله وبركاته اساتذتى فى هذا الصرح العظيم . الساده اعضاء اوفيسنا موضوع اليوم هو استخدام دالة VLOOKUP فى البحث عن قيمه معينه فى مجموعة صفحات بشكل بسيط وسهل فقد رايت استخدامات مشابهه ولكن كانت بشكل اصعب . والان اقدمها لكم بشكلها البسيط وعلى فكرة انا اعشق هذه الداله ارجوكم لاتنسونى فى دعاؤكم اترككم مع الملف والمثال العملى vlookp.rar
    1 point
  5. أخى الفاضل / عمل بسيط .. توزيع الطلاب على كشوف المناداة وأرقام الجلوس تصفح وشاهد .. قم بكتابة البيانات فى الخلايا الغير الملونة فى صفحات " بيانات أساسية / الطلبة / اللجنة " 1 - كشوف منادة تبعا للجان المحددة بالعددالمحدد. 2 - بطاقة لكل طالب كاملة بها كل بياناته . 3 - زر طباعة لكشوف المناداة وملصقات أرقام الجلوس . 2011 أرقام الجلوس والمناداة.rar
    1 point
  6. السلام عليكم إخواني الكرام في المنتدى الرائع أقدم لكم كود بسيط يتم وضعه في حدث Worksheet_BeforeDoubleClick يقوم الكود بوضع علامة صح عند النقر المزدوج على أي خلية في النطاق A1:A100 يمكنك تغيير النطاق إلى أي نطاق تريده .. Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Not Intersect(Target, Range("A1:A100")) Is Nothing Then Cancel = True Target.Font.Name = "Marlett" If Target = vbNullString Then Target = "a" Else Target = vbNullString End If End If End Sub
    1 point
  7. أريد عمل USER FORM لإدخال البيانات الأسرفي sheet الأساسيين بالجمعية وترحيل المستبعدين أو المحذوفين إلي sheet المستبعدين بيانات الأسر.rar
    1 point
  8. السلام عليكم ورحمة الله وبركاته الاستاذ الفاضل والاخ الحبيب ابو البراء جزاكم الله خيرا ابداع منقطع النظير وجهد كبير ومستمر لمساعدة الاخوة الاعضاء اثابكم الله واعانكم لعمل الخير تقبل فائق احترامي وتقديري
    1 point
  9. السلام عليكم مينفعش الكل يشارك وأنا واقف أتفرج - معرفش غير أنزل الملعب وأقوم بدور راس حربة - تفضل المرفق التالي به دالتين : الدالة الأولى تقوم باستخراج الأرقام من ضمن النص ، وفيه تفصيل ليها بالملف المرفق ، والثانية تقوم بجمع الأرقام Digits والله المستعان .. Extract Number - Sum Digits Function.rar
    1 point
  10. أخي الفاضل انت محظوظ جدا على فكرة، كل عمالقة المنتدي تواجدوا بموضوعك وما شاء الله بدل الحل حلول .. انت اللى مش عاوز تتعب نفسك وعاوز حاجة سهلة بدل المعادلات الطويلة علما ان حلول الأساتذة الكرام تفي بالغرض وزيادة عامة مرفق ملف مجمع به كافة حلول الأساتذة الأفاضل أ.سليم وأ.أبو تراب جزاهم الله كل خير وللتسهيل عليك هناك حل آخر مرفق الا وهو دالة تم تسميتها ( SumNo ) تقوم بإحضار الرقم فقط من الخلية انظر الملف المرفق تحياتي مثال.rar
    1 point
  11. السلام عليكم ورحمة الله وبركاته الاخ العزيز ابن مصر جزاكم الله خيرا
    1 point
  12. جزاك الله خيرا يا اخي الابن الغالي لمصر الغالية وأشكرك على التعليق المرافق للكود ، وأرجو أن تعم هذه الطريقة ...جعلها الله في ميزان حسناتك.
    1 point
  13. طريقة جديدة لربط الجداول بالليست بوكس، بحيث أي إضافة في الجدول يتم إضافتها في الليس بوكس، رايكم يهمنا والله يفتح عليكم list with table.rar
    1 point
  14. السلام عليكم ورحمة الله .. ارجو مساعدتي .... محتاج برنامج للتقسيط ان يكون البرنامج على نظام الاكسس او الاكسل .. فيه نظام للنقد ونظام للتقسيط وفيه مخزن للسلع وفية عدد الشهور مثلا التسلسل / اسم الزبون / السلعة / تاريخ الشراء/ سعر السلعة / الدفعة المقدمة/ القسط الشهري . وفيه كشوفات شهرية للمتاخرين عن التسديد او المتلكئين . ملاحظه / اعمل في قطاع حكومي والدائرة لا توفر لي برنامج وانا اتعب في هذه العمليه والبرامج سعرها خيالي ولا استطيع ان اشتري برنامج لان حالتي المادية ضعيفه ارجو مساعدتي ولكم الاجر ان شاء الله تحياتي للجميع
    1 point
  15. روعة يا ابن مصر يا غالي بارك الله فيك ورزقك من حيث لا تحتسب
    1 point
  16. اخى الفاضل اذهب الى اى ملف عندك على سطح المكتب واضغط عليه بالزر الأيمن للماوس واختر خصائص .. تمام شوف المسار او ال Location .. كمثال انا عندي بالشكل ده C:\Users\Ahmed\Desktop انسخ انت المسار ده واذهب للكود واستبدل السطر C:\ExcelFiles بالمسار الجديد اللى انت نسخته ... بس تحياتي
    1 point
  17. السلام عليكم الف شكر استاذ حسام ع المعلومة الرائعه جعلها الله في ميزان حسانتك .
    1 point
  18. استاذى الكريم ابومحمد عباس جزاك الله خيرا وشرفتنى بمرورك واتمنى لو فى عند حضرتك اى اضافه اكون ممنون لك تقبل منى وافر الاحترام والتقدير
    1 point
  19. 1 point
  20. السلام عليكم أخي الكريم مبدئيا الملف يحتاج تضبيط كثير 1- لاداعي لشيتات زائدة مثل الاستحقاقات أو نموذج معاشات 2- دالة VLOOKUP في هذه الحالة الأفضل أن يكون آخر معامل بها False أو 0 وليس True لأنه إذا الرقم المسلسل الذي تبحث عنه الموجود بالخلية الصفراء P3 إذا وضعت عن طريق الخطأ رقم ليس له وجود في جدولك وجعلت آخر معامل بالدالة True فلن يعطي خطأ وسيأتيك ببيانات أقرب رقم له في الجدول 3- تقول "حوالى 3000 موظف مقسمين لمناطق مختلفة" ضع في ملفك منطقتين أو أكثر علي شكل شيتات مثلا فهذا سيسهل كثيرا علي من يريد المساعدة
    1 point
  21. أنا أوافق أخي الغالي بن مصر الرأي يعني عشان الشغلانة بتاعتك فيه أعمدة مساعدة ونطاقات وشغل معادلات .. الكود أخف وأسهل .. ويلا يا أستاذ عادل زيادة الخير خيرين
    1 point
  22. تسلم يا أبو صلاح على التزامك بعمل الواجبات ومتابعة الحلقات بارك الله فيك أخي الحبيب وإن شاء الله تكون استفدت معلومات جديدة
    1 point
  23. تفضل أخي الحبيب الملف المرفق Get IP Function.rar
    1 point
  24. أشكرك أخي أبو حنين على الكلمات الرقيقة ولكن ليس ما قمت به إبداع .. إنما هي معادلة جمع Sum وبها المعادلتين اللتين تفضلت بهما .. ساعات بتكون بسيطة بس محدش بيكون واخد باله منها .. تقبل تحياتي (خد وردة قبل ما الورد يخلصه ابن مصر )
    1 point
  25. جرب الملف في المرفقات، ففيه عدة طرق لجمع النصوص والأرقام والتواريخ والأوقات.. أطيب المُنى، عبدالله،،، Text & Numbers.rar
    1 point
  26. أنت لست محتاجا لعمل ربط بين معرف الغياب و معرف الطلاب جدول الغياب نفسه يتضمن حقل رقم الطالب أيضا فاذا ماعليك الا أن تبني نموذج على جدول الغياب و تدخل بيانات الغياب عبر رقم الطالب و تاريخ اليوم
    1 point
  27. ممكن يكون المعادلة معكوسة لأني كنت مستعجل على كل حال استبدل في المعادلتين الرقمين 1 و 0
    1 point
  28. الحلقة العاشرة ************ السلام عليكم ورحمة الله وبركاته أقدم لكم اليوم حلقة كاملة الدالة MsgBox (وقد قدم لها الأخ الحبيب حسام عيسى موضوعاً كاملاً ، مما أخرني في تقديم الحلقة) .. عموماً هنتكلم عنها مرة تانية ، وفي الإعادة إفادة.. كلمة MsgBox اختصار للكلمة الإنجليزية Message Box أي صندوق الرسالة .. ودي وظيفتها إنك بتعرض رسالة للمستخدم تفيده بأمر معين .. لما نكتب الدالة MsgBox ، ونضغط مسطرة عشان ناخد مسافة ، بيظهر لنا مستطيل أصفر فيه توضيح لبارامترات الدالة .. كلها اختياري ما عدا البارامتر الأول اللي هو اسمه Prompt ، والبارامتر ده هو عبارة عن النص اللي هيظهر للمستخدم (وطبعاً مينفعش يكون اختياري وإلا مش هيكون فيه رسالة للمستخدم) بس إحنا ممكن نضحك على المحرر ، ونكتب السطر بالشكل ده : MsgBox "" هو كل اللي يهمه أقواس التنصيص .. هودا كل اللي يفهمه ، أما النص اللي بين أقواس التنصيص فدا ميعرفوش وميهموش ، اكتب أي كلام .. MsgBox "واخد على خاطري منكم" دي الرسالة اللي عايز أوصلها لكم أحبابي .. ودا سببه عدم المتابعة الجيدة للحلقات .. عموماً دا مش وقت للعتاب.. طيب واحد هيسأل : طيب كدا موضوع الدالة بسيط ومش محتاج حلقة ؟ أقوله البسيط هنعقده ، والمعقد هنبسطه .. تعالوا معايا نضع قيمة في الخلية D3 (كل اللي بيشرحوا مش عارف ليه مركزين على الخلية A1) أنا بحب التغيير - من باب خالف تعرف - ، وليكن القيمة 1500 عايزين نظهر القيمة الخاصة بالخلية في رسالة : MsgBox Range("D3").Value الرسالة هتظهر وفيها القيمة 1500 ، طيب ممكن نضيف عليها نص .. أكيد ممكن ! ليه لا! MsgBox "القيمة الموجودة يا أستاذ حسام في الخلية هي " & Range("D3").Value نلاحظ هنا إننا استخدمنا المعامل Concatenate اللي هو شكله & ، ودا وظيفته إنه بيدمج النصوص .. طبعاً القيمة اللي موجودة في الخلية D3 حتى لو كانت قيمة رقمية ، هنا مع دالة الرسالة مش بتشوفها رقم ، لكن بتشوفها نص (هنبص بعيون الدالة الجميلة) طيب ممكن نظهر قيمة خلية تانية .. أكيد ممكن ! ليه لا نضع القيمة 2000 في الخلية E4 ونجرب : MsgBox Range("D3").Value & Range("E4").Value هنلاقي إن قيمة الخلية D3 والخلية E4 لازقين في بعض ، دا لأنك مسبتش مسافة بينهم .. طيب المسافة هنعملها إزاي ؟ هو سؤال بسيط بس اعذروني أكيد فيه ناس بتسأله :: هنترك مسافة وبس .. لا .. هنعمل مسافة بالمسطرة بس بشرط تكون المسافة بين أقواس تنصيص زي كدا : MsgBox Range("D3").Value & " " & Range("E4").Value هنا نفس الكلام ربطنا بالمعامل & ، وعشان تكون المسافة مناسبة ضربت على المسطرة 3 مرات (معلش أصلي مضايق ومحتاج أضرب حد ، فملقتش غير المسطرة .. بس كفاية عليها 3 ضربات ..) واحد هيقولي أنا جربت الكود بس أنا مش عاجبني شكلهم جنب بعض ، ممكن نخلي كل قيمة في سطر .. أكيد ممكن ! ليه لا! MsgBox Range("D3").Value & vbNewLine & Range("E4").Value كلمة vbNewLine عشان نقدر ننزل لسطر جديد (وقلت قبل كدا بس محدش بيتابع إن فيه كلمة تانية بتؤدي نفس الغرض اسمها ايه يا شاكر؟ مش بقولكم محدش مذاكر .! اسمها vbCrLf ) يلا زيادة الخير خيرين .. وأضاف الأخ مختار كلمة جديدة أيضاً تؤدي نفس الغرض ألا وهي Chr(10) ربنا يسترها علينا وعليكم دنيا وآخرة. نشوف السطر ده : MsgBox ("الحمد لله الذي بنعمته تتم الصالحات") ايه الجديد يا أستاذ عبد المجيد ؟ الأقواس .. ممكن نستغني عنها ؟ آه ممكن .. ليه لا! .. بس الأقواس دي هنستفيد منها في إنك تخلي جملة MsgBox يمكن وضعها كقيمة في متغير (نصبر شوية هييجي الكلام عليها) .. طيب ايه هي الإضافات اللي نقدر نضيفها (هي زي البهارات حاجة كدا تحلي الأكله .. تخليها أحلى) ... إحنا قلنا البارامتر الأول خاص بالنص ودا إجباري (بس ممكن نخدع المحرر) ، البارامتر الثاني خاص بالأزرار Buttons .. الأزرار دي زي OK و Cancel و Retry وهكذا.. نجرب السطر التالي : MsgBox "هل تحب حلقات افتح الباب؟", vbOKCancel نلاحظ بعد نص الرسالة Prompt عملنا فاصلة , ودي عشان نقول للمحرر إننا هنضيف أزرار Buttons .. أول ما تعمل الفاصلة هتلاقي زي ما اتعودت قايمة فيها القيم اللي ممكن تستخدمها .. طيب لو نفذنا السطر اللي فات هنلاقي إن زر OK أو زر Cancel لو ضغطت عليهم مش هيحصل حاجة غير إنه يقفل الرسالة .. (قلنا نصبر هييجي عليها الكلام يا مستر عبد السلام) نتعرف على الأزرار الموجودة والمتاحة عندنا : vbAbortRetryIgnore vbOKCancel vbOKOnly vbRetryCancel vbYesNo vbYesNoCancel ممكن نجرب القيم دي ... القصة كلها في البادئة vb ثم الأزرار اللي هنستخدمها.. ننتقل لجزئية أخرى : مع نفس البارامتر الخاص بالأزرار ممكن نضيف رموز (علامة تعجب - علامة استفهام - ..) والرموز عشان نضيفها نضع علامة + بعد الأزرار التي سيتم استخدامها .. بالمثال يتضح المقال : MsgBox "هل تحب حلقات افتح الباب؟", vbYesNo + vbQuestion ممكن نتعرف على الرموز : vbQuestion vbInformation vbCritical vbExclamation طيب ممكن نستغنى عن الأزرار ونستعمل الرموز فقط ؟ أو ممكن نستغنى عن الرموز ونستعمل الأزرار فقط؟ أكيد ممكن ! ليه لا! (النهاردة واخدين حريتكم ..مفيش تقيد) هسيبكم شوية تجربوا الرموز دي ، وتشوفوا كل رمز شكله ايه؟ - فاصل ونواصل - واحد بعد ما شاف الرسالة ، لاحظ إن فيها عنوان Microsoft Excel فسألني ممكن أغير العنوان ده ؟ رديت عليه وقلت له (طبعاً عارفين الإجابة) عنوان الرسالة هو دا البارامتر التالت .. ود اسمه Title (ونلاحظ إن البارامتر لما يكون اختياري بيوضع بين أقواس بهذا الشكل [ ] ) نجرب السطر التالي : MsgBox "هل تحب حلقات افتح الباب؟", , "منتدى الأحبة" ايه دا بقا إنت عامل فاصلتين ليه؟ يا سيدي ما أنا قلت لك إن البارامتر التاني الخاص بالأزرار والرموز دي اختياري ، بمعنى يمكن الاستغناء عنه ، بس عشان نعديه لازم فاصلة ، وبعد الفاصلة فاصلة تانية ، يقوم المحرر يفهم إنك استغنيت عن البارامتر التاني ، ويشتغل على البارامتر التالت .. اللي هو عنوان الرسالة.. نجرب ونشوف ! ننتقل لأهم نقطة في حلقة اليوم ألا وهي تعيين الرسالة كمتغير ، عشان ببساطة ننفذ كود معين لو المستخدم اختار زر وننفذ كود تاني لو اختار زر تاني (أكيد الكلام يتوه ..خلينا في التطبيق) Answer = MsgBox("هل تحب حلقات افتح الباب؟", vbYesNo + vbQuestion, "منتدى الأحبة") نخلي بالنا إننا هنا هنستخدم متغير باسم Answer (ممكن تسميه بالاسم اللي يعجبك) ، والمتغير ده هيكون له قيمة (الرسالة مجرد ستارة .. والقيمة مخفية .. والقيمة دي هنعرفها حالاً) لو حبينا ننفذ كود معين في حالة اختيار معين ، هنستخدم الجملة If الشرطية ، يعني ببساطة لو المتغير Answer قيمتة كذا اعمل كذا ، ولو قيمته كذا اعمل كذا .. Sub Query() Answer = MsgBox("هل تحب حلقات افتح الباب؟", vbYesNo + vbQuestion, "منتدى الأحبة") If Answer = vbYes Then MsgBox "كدا حبيبي وصاحبي وكفاءة" ElseIf Answer = vbNo Then MsgBox "زعلت منك ..روح ربنا يسامحك" End If End Sub أظن المثال واضح ، في حالة إذا كانت قيمة Answer تساوي vbYes ، هينفذ السطر التالي ويظهر رسالة بمحتوى معين ، ولو كانت القيمة vbNo هيظهر رسالة تانية .. واحد هيقولي هو كله رسايل رسايل مفيش شات .. طبعا الأسطر اللي هيتم تنفيذها مش شرط تكون رسالة ، دا مجرد مثال عشان تفهم كيفية استخدام المتغير .. لكن ممكن تنفذ مجموعة أسطر من الأكواد في حالة vbYes ، ومجموعة أسطر أخرى من الأكواد في حالة vbNo ... ركز وخلي بالك من الكود التالي : Sub Query() Answer = MsgBox("هل تحب حلقات افتح الباب؟", vbYesNo + vbQuestion, "منتدى الأحبة") If Answer = 6 Then MsgBox "كدا حبيبي وصاحبي وكفاءة" ElseIf Answer = 7 Then MsgBox "زعلت منك ..روح ربنا يسامحك" End If End Sub كلنا اللي عملناه شيلنا vbYes وحطينا رقم 6 ، وشيلنا vbNo وحطينا رقم 7 (ايه دا بقا ..طيب هنعرف منين اللي إنت بتقوله ده ..فيه جدول بقيمة كل زر من الأزرار .. يرجى عدم الحفظ) فيه حاجة مهمة نسيت أقول عليها : لو لاحظتو إن الرسائل كلها وعنوان الرسائل بتظهر ناحية اليسار ، عشان نخليها يمين (ربنا يجعلنا من أهل اليمين) نجرب الكود التالي : MsgBox "هل تحب حلقات افتح الباب؟", vbMsgBoxRight, "منتدى الأحبة" آخر جزئية هنتكلم فيها .. مش هنتكلم فيها (فيه ملف مرفق فيه توضيح لآخر جزئية .. أنا بس هشرح نقطة واحدة في الملف المرفق ، وإنتو إن شاء الله المولى هتفهموا الباقي) الأزرار والرموز اللي عدت علينا في الحلقة ، ممكن نستغنى عنها بقيم ..إزاي ؟ MsgBox "هل تحب حلقات افتح الباب؟", vbYesNoCancel ممكن السطر ده يكون بالشكل ده : MsgBox "هل تحب حلقات افتح الباب؟", 3 يعني القيمة 3 = vbYesNoCancel .. مثال تطبيقي : ------------ Sub Query() Dim Answer As String Answer = MsgBox("هل تريد الدخول لتطبيق الإكسيل لتطبيق الأكواد في حلقات افتح الباب؟", vbYesNoCancel) If Answer = vbYes Then MsgBox "تفضل بالدخول .. بيتك ومطرحك ، وإن شاء الله تستفيد" ThisWorkbook.Activate ElseIf Answer = vbNo Then MsgBox "أكيد مشغول عشان ناوي تقفل .. عموماً تصحبك السلامة وفي رعاية الله" ActiveWorkbook.Save Application.Quit End If End Sub وأخيراً أتمنى أن أكون قد وفقت في توصيل المعلومة لكم بشكل مبسط .. دمتم في رعاية الله .. MsgBox Values.rar
    1 point
  29. الحلقة التاسعة ************ السلام عليكم ورحمة الله وبركاته النهاردة هنضرب 3 أشباح بحجر واحد (نشتغل قناصة) ، يعني الحلقة دي هنتكلم عن 3 أمور .. هنراجع على كيفية بناء دالة (هنأكد عليها بمثالين) ، ومن خلال المثالين (الشبحين) هنتعلم إزاي نتعامل مع الشروط .. يبقا مراجعة + معلومتين ! حلقة النهاردة مفيهاش كلام كتير ، بس موعدكمش إنتو عارفين طبعي بحب الرغي! معظمها هتكون عملي .. لنبدأ الحلقة على بركة الله الشكل العام لـ IF الشرطية .. عندنا 4 أشكال : الشكل الأول والثاني : لو هنتعامل مع شرط واحد وكل اللي يهمنا إن الشرط يتحقق ، مثال : If 100 > 90 Then MsgBox "The number 100 is greater than 90" الجملة لازم تبدأ بـ IF وبعديها جملة الشرط ، جملة الشرط هنا 100 أكبر من 90 (واحد هيقولي مش دي علامة أصغر من ..هقوله متنساش إننا بنكتب من الشمال لليمين ، والعلامة ممكن تقراها حسب الاتجاه ، بالعامية كدا إحنا قرينا رقم 100 مثلا هنلاقي الفتحة نحية الرقم 100 يبقا كدا نقراها أكبر من ) عارف إنها معلومة بسيطة بس فيه ناس ممكن يحصل عندها Confusion. الشرط اللي بنكتبه بيكون نتيجته حاجة من اتنين يا أبيض يا إسود (يا إما True يا إما False) ، لو كانت نتيجة الشرط True صحيحة بالمعنى البلدي يبقا اللي جاي هيتم تنفيذه ، أما لو كانت False المحرر مش هيعبر الجملة اللي ورا كلمة Then وهيعديها ، ويقول للسطر اللي بعد Then (عدي يا كود مفيش منك مصلحة) نجرب نغير علامة أكبر من إلى أصغر من ، ونشوف النتيجة ، مفيش تنفيذ لسطر الكود لأن الشرط لم يتحقق !! لاحظنا إننا كتبنا كله في سطر واحد .. ممكن اللي فات يتكتب في 3 أسطر في الحالة دي هيكون بالشكل ده : If 100 > 90 Then MsgBox "The number 100 is greater than 90" End If هنا الشرط في سطر متبوع بكلمة Then ، والسطر المراد تنفيذه في حالة تحقق الشرط (بقول تاني في حالة تحقق الشرط) دا السطر التاني ، طيب والسطر التالت ده جه منين (دا القفلة زي ما اتعودنا قفلة جملة If بتكون جملة End If ، ولاحظوا إننا في الشكل الأول مستعملناش القفلة لأننا كتبناها في سطر واحد فقط .. الشكل التالت : لما نتعامل مع شرط واحد بردو ، بس في الحالة دي إحنا عايزين نحدد ايه المطلوب من المحرر لما الشرط يتحقق ، وايه المطلوب لما الشرط ميتحققش .. بالمثال يتضح الكلام المكلكع ده : نفس المثال اللي فات بس هنزود عليه شرط إذا لم يتحقق الشرط ، بيتم استخدام جملة Else بهذا الشكل : If 100 > 90 Then MsgBox "The number 100 is greater than 90" Else MsgBox "The number 100 is less than 90" End If محدش سألني لحد دلوقتي إزاي بيتم تنسيق الكود بهذا الشكل؟ التنسيق للكود بيخلي الكود أسهل إنك تقراه وتفهم معناه .. يعني لو كتبت الكود بالشكل اللي جاي كدا هيكون أصعب شوية في التعامل معاه لما تيجي تقراه : If 100 > 90 Then MsgBox "The number 100 is greater than 90" Else MsgBox "The number 100 is less than 90" End If طبعا الفرق واضح .. والفرق يوضح أكتر لما تتعامل مع أسطر كثيرة من الأكواد .. اتعملت إزاي ؟ عن طريق الضغط على المفتاح tab بعد ما أضع المؤشر في أول السطر المهم مش هنتكلم عن البداية ولا النهاية لجملة If ، إحنا بس هنركز على جملة Else ، هي دي اللي بتفصل بين السطر المراد تنفيذه إذا تحقق الشرط ، والسطر المراد تنفيذه إذا لم يتحقق الشرط .. السطر اللي قبل Esle دا ليه الأولوية طبعاً بس في حالة تحقق الشرط ، أما السطر اللي بعديها بيكون في حالة عدم تحقق الشرط ..أظن كدا واضحة (عمال أقول الكلام بأكتر من أسلوب وأكتر من مرة ، لأن في الإعاة إفادة) نجرب الكود مرة بالشكل اللي فات ، ونغير علامة أكبر من إلى علامة أصغر من ونجرب مرة تانية ونلاحظ الرسالة (أقصد مدى تحقق الشرط) الشكل الرابع والأخير لـ IF دا بقا اللي تقدر من خلاله تضع شروط كتيرة زي ما إنت عايز (خد راحتك ..حط شروطك يا كبير ، والمحرر ينفذ) هنا المثال هو أفضل شرح ، هنكتب دالة Function وهنستخدم فيها IF مع الشكل الرابع ؛ لأننا عندنا شروط كتير .. الجماعة اللي بيشتغلوا في المدارس (ربنا يبارك فيهم) ، بيعملوا معادلة لتحديد المستوى أو التقدير (وشروطهم بتكون بالشكل ده : لو الطالب غ يبقا الناتج غ (حد عنده اعتراض) .. لو درجة الطالب ما بين 0 و 49 يبقا تقديره دون المستوى .. ولو الطالب درجته ما بين 50 و 64 يبقا مقبول .. ولو الطالب درجته ما بين 65 و 74 يبقا تقديره جيد .. ولو الطالب درجته ما بين 75 و 84 يبقا تقديره جيد جداً .. ولو الطالب درجته ما بين 85 و 100 يبقا ممتاز (شفتوا الشروط ..حاجة كدا تحس إنها متشابكة) .. بالمعادلات ممكن نعملها بالشكل ده : =IF(A1="","",IF(A1="غ","غ",IF(AND(A1>=0,A1<50),"دون المستوى",IF(AND(A1>=50,A1<65),"مقبول",IF(AND(A1>=65,A1<75),"جيد",IF(AND(A1>=75,A1<85),"جيد جداً",IF(AND(A1>=85,A1<=100),"ممتاز",""))))))) هي دي المعادلة اللي هتأدي الغرض وتحقق المطلوب .. بس تعرفوا إن طول المعادلة بالشكل ده 188 حرف (الحرف مقصود بيه الحروف والرموز) .. طبعاً المعادلة ممكن نحولها لدالة تحقق لنا المطلوب ، خلينا نشوف ونجرب : Function Grade(Mark As Variant) As String If IsEmpty(Mark) Then Grade = "" ElseIf Mark = "غ" Then Grade = "غ" ElseIf Mark >= 0 And Mark < 50 Then Grade = "دون المستوى" ElseIf Mark >= 50 And Mark < 65 Then Grade = "مقبول" ElseIf Mark >= 65 And Mark < 75 Then Grade = "جيد" ElseIf Mark >= 75 And Mark < 85 Then Grade = "جيد جداً" ElseIf Mark >= 85 And Mark <= 100 Then Grade = "ممتاز" End If End Function اتعرفنا قبل كدا على كيفية بناء الدالة ، ودا مثال تاني لتأكيد التعامل مع بناء الدوال : بدأنا بكلمة Function لأننا بنتعامل مع دالة وليس إجراء فرعي ، متبوعة باسم الدالة (والتسمية قلنا إنت حر فيها مثلا هنسميها Grade) ، طيب إحنا لما نتعامل مع الدالة دي ، نشوف الدالة دي هتتعامل مع ايه ؟؟ الدالة هتتعامل مع درجة الطالب ، فنسمي المتغير الخاص بالدالة Mark ،والدرجة دي قد تكون أرقام من 0 إلى 100 وقد تكون حروف (غ) بالتالي نخلي نوعها Variant لأن النوع ده من المتغيرات Variables بيتعامل مع أي حاجة ، فهنا هيتعامل مع أرقام ونصوص ، طيب والناتج المفروض هيكون عبارة عن نص ، فدا نخليه String وممكن نخليه Variant بس إحنا عايزين الناتج نص وبس (دون المستوى - مقبول - جيد - جيد جداً - ممتاز - غ - فراغ "") أعتقد إن الصورة واضحة ، هنا استخدمنا جملة ElseIf مش Else لأننا بنتعامل مع شروط متعددة ، ممكن نفضل نستخدمها لحد آخر شرط ، وممكن قبل الشرط الأخير نستبدلها بـ Else (إنت وراحتك) بعد كل كلمة ElseIf وضعنا شرط وفي آخر الشرط مننساش كلمة Then لما يكون فيه أكتر من شرط في نفس الوقت (بمعنى شرطين واجب تحققهم في نفس ذات الوقت بنستخدم المعامل Operator اللي اسمه And) بمعنى آخر للي ميعرفش المعامل And (لما نستخدم المعامل ده يبقا الشرطين لازم نتيجتهم تكون True عشان ينفذ السطر اللي وراه) ---------------- ناخد مثال فرعي عشان نفهم And : X = 10: Y = 20 If X = 10 And Y = 20 Then MsgBox "X = 10" & vbCrLf & "Y =20" في السطر ده لو اتحقق الشرطين وكانت نتيجتهم صحيحة هيظهر الرسالة اللي مذكورة دي ، أما لو شرط واحد فيهم متحققش ، يبقا مش هيتنفذ الكود .. معلومة إضافية لعمل سطر جديد في الرسالة نستخدم كلمة vbCrLf أو فيه كلمة أسهل منها بتؤدي نفس الوظيفة اسمها vbNewLine .. ونلاحظ بردو في الرسالة إننا استخدمنا المعامل & ودا بيستتخدم لربط أو دمج النصوص .. (أعتذر عن الخروج عن الموضوع الأصلي) ---------------- يرجع مرجعونا للدالة الخاصة بالتقدير : وضعنا الشروط ، وكلما تحقق شرط معين يتم وضع قيمة نصية لاسم الدالة : فلو تحقق الشرط مثلاً إن الدرجة ما بين 50 و 64 ، بنقول ساعتها إن الدالة اللي سميناها Grade ساعتها تحمل القيمة النصية "مقبول" ، ووضعنا النصوص بين أقواس تنصيص كما تعودنا .. يبقا في الحالة دي لو درجة الطالب 55 يبقا التقدير "مقبول" (اللهم اجعلنا من المقبولين) .. لتطبيق الدالة : اكتب القيم التالية في النطاق A1:A13 0 49 50 55 65 66 74 75 84 85 90 100 غ في الخلية B1 اكتب المعادلة : =Grade(A1) ونسحب المعادلة لحد بعد آخر النطاق ، يعني خلي المعادلة لحد A15 مثلاً عشان نشوف لما تكون الخلية فارغة ايه اللي هيحصل .. شوفوا بقا الفرق ما بين المعادلة اللي حطينها في الأول اللي طولها 188 حرف والمعادلة دي ، دي طولها يدوب 9 حروف بس (ادعوا لي !) ** ملحوظة : يا ريت لما نيجي نحط شروط ، نخلي شرط فراغ الخلية يكون في الأول (لأني جربت في دالة أخلي شرط الفراغ في الآخر بيعمل شوية كعبلة ، ودا سببه إننا لو حطينا الشرط مثلا الدرجة ما بين 0 و 49 .. الأول هيتم التعامل مع الخلايا الفارغة إنها صفر وليست خلايا فارغة) المهم عشان ميحصلش توهااااااان خليكوا تكتبوا شرط الفراغ في أول الشروط (اللي عايز يجرب يحط الشرط ده في الآخر يجرب ويشوف الكعبلة بنفسه) Function Grade(Mark As Variant) As String If Mark = "غ" Then Grade = "غ" ElseIf Mark >= 0 And Mark < 50 Then Grade = "دون المستوى" ElseIf Mark >= 50 And Mark < 65 Then Grade = "مقبول" ElseIf Mark >= 65 And Mark < 75 Then Grade = "جيد" ElseIf Mark >= 75 And Mark < 85 Then Grade = "جيد جداً" ElseIf Mark >= 85 And Mark <= 100 Then Grade = "ممتاز" ElseIf IsEmpty(Mark) Then Grade = "" End If End Function هوفر عليك وقت في التعديل ، جرب الدالة بهذا الشكل بنفسك ، وروح لورقة العمل واعمل دبل كليك في الخلية B1 عشان تشوف القيم الجديدة أو اضغط F9 لتحديث الدالة .. المشكلة بتحصل لأن منطق الترتيب في الشروط موجود ، بمعنى آخر إنه ماشي شرط شرط ، وأول ما شرط يتحقق ينتهي تنفيذه للدالة ، فلو وضعنا شرط الدرجة ما بين صفر و49 .. أول ما يلاقي خليه فاضية هيعاملها على إنها صفر وليست فارغة لأننا وضعنا شرط الفراغ في نهاية الدالة ، فنلاقي ناتج المعادلة مع الخلايا الفارغة (دون المستوى) .. انتهت الملحوظة (أنا عارف إن فيه ناس هتدعي عليا بسبب الملحوظة اللي متعتبرش ملحوظة دي .. دي درس جوا درس)@ آخر نقطة نتكلم فيها جملة IsEmpty (ودي دالة مدمجة في محرر الأكواد لاختبار الفراغ :: هل الخلية دي فارغة أم لا ؟؟) ، وممكن نستغنى عنها ونقول : If Mark = "" Then Grade = "" نرجع للصح ونخلي شرط الفراغ في أول الدالة ..أظن بإذن الله كدا الأمور بقت واضحة تماماً... ننتقل لمثال آخر وأخير عشان أنا تعبت لكم صراحة : نفس المثال ولكن بصورة أخرى .. هنعمل دالة ، هنغير اسمها بس عشان نطبقها في نفس الملف اللي إحنا شغالين عليه .. هنسميها Level وهنا في المثال القادم بإذن الله هنستخدم حاجة شبيهة بجملة If بس بصراحة ألذ وشكلها أشيك وأسهل في الفهم .. الجملة اسمها Select Case وبييجي وراها المتغير اللي هنشتغل عليه (اللي هو في الحالة دي Mark درجة الطالب) وبعدين نبدأ نضع حالات الشرط بكلمة Case متبوعة بالشرط بس بشكل مختلف شوية وقبل آخر شرط ممكن نستخدم Case Else وممكن نستغنى عنها (مش هتفرق) ، وفي النهاية مننساش القفلة يا عبد المولى (End Select) .. Function Level(Mark As Variant) As String Select Case Mark Case "" Level = "" Case 0 To 49 Level = "دون المستوى" Case 50 To 64 Level = "مقبول" Case 65 To 74 Level = "جيد" Case 75 To 84 Level = "جيد جداً" Case 85 To 100 Level = "ممتاز" Case "غ" Level = "غ" End Select End Function لتطبيق الدالة نروح للخلية C1 في ورقة العمل ونضع المعادلة بهذا الشكل ، ونسحبها لحد A15 مثلا ، عشان نقارن النتائج : =Level(A1) مش هشرح تفاصيلها ؛ لأنها واضحة وضوح الشمس في عز الليل ..(شكلي هنجت ...!!) .. (حد يضغط F5 عشان يعملي ريفرش .. الطالب المنتبه هيقولي كدا غلط لو ضغطنا هنا F5 ، وإحنا جوا محرر الأكواد كدا هينفذ أمر مش هيعمل ريفرش) بكدا نكون انتهينا من شبحين من أهم أشباح عالم الأكواد (شبح If وشبح Select Case) ، وكمان شبح (بناء الدالة UDF) أستودعكم الله ، أترككم في رعاية الله .. كان معكم القناص أبو البراء (صائد الأشباح) من قلعة الرعب أوفيسنا
    1 point
  30. الحلقة الثامنة *********** السلام عليكم ورحمة الله وبركاته أسعد الله أوقاتكم إخواني الكرام في الصرح العملاق هنتكلم النهاردة عن نافذة مهمة جدا ومهمشة في الشروحات إلى حد كبير .. النافذة اسمها (النافذة الفورية Immediate Window) ودي بتفكرني بالخميرة الفورية .. تلاقي ست البيت مستعجلة ع العجين ، ومعندهاش صبر ، كتر خيرها وراها فيس بوك مش فاضية للعجين ، تقوم تستخدم الخميرة الفورية عشان العجين يخمر بسرعة ..(واحد هيقولي إنت شكلك شغال في فرن) ! نفس الفكرة معانا بردو مع النافذة الفورية اللي هنتكلم عليها ، بمعنى لو فيه سطر معين من الأكواد عايز تشوف نتيجته بشكل فوري ، يبقا هو دا المكان المناسب عشان تحصل على النتيجة السريعة .. أولاً قبل ما ننسى وياخدنا الكلام ، إحنا بنظهر النافذة دي من قايمة View ثم Immediate Window ، واللي هيركز هيلاقي الاختصار الخاص بيها CTRL + G بتظهر النافذة دي أسفل المحرر ودي من ضمن هيكلة محرر الأكواد ، ممكن تتحكم في حجمها من خلال سهم بيظهر في المربع الأحمر في الصورة دي : المهم هي دي النافذة الفورية ، بصراحة أداة رائعة للي يفهمها كويس ، ممكن من خلالها تنفيذ الأكواد بشكل سريع ، وممكن تجاوبك على الأسئلة بشكل فوري وهنشوف الكلام ده بالأمثلة ، وبتستخدم لتصحيح الأخطاء البرمجية Debugging ، وكمان تستخدم لإظهار نتائج الكود .... الكلام النظري مش هيفيد زي العملي .. فلنبدأ الحلقة : أولا هنشتغل محققين (أخيرا الواحد ياخد وضعه - مش هنفضل كدا ملطشة دايما ، إحنا اللي دايما بنتسأل ) إحنا نسأل وهو يجاوب ، ومننساش الإجابة هتكون فورية ... طبعاً كل اللي ظاهر قدامنا مجرد مؤشر الماوس واقف في أول النافذة .. إحنا اتعودنا إن السؤال دايما بيكون آخره علامة الاستفهام ، هنا الوضع مختلف ، إحنا هنحط علامة الاستفهام في الأول عشان نخض النافذة كأننا بنقولها انتبهي هسألك ، وجاوبي في الحال : نكتب مثلاً السطر التالي (نكتبه يا كابتن حسام مش ننسخه) ?Rows.Count أو ? Rows.Count ممكن بعد علامة الاستفهام نترك مسافة أو لا نترك ، الأمر سيان ، وممكن مؤشر الماوس يكون في نهاية السطر أو في أي مكان داخل السطر ، الأمر سيان .. بعد ما نكتب نضغط Enter نلاقي الإجابة في التو وفي الحال (ونعم النافذة المطيعة) السطر اللي فات هيعد عدد الصفوف في ورقة العمل (1048576) .. الإجابة هتكون من غير أقواس ? Columns.Count عدد الأعدمة في ورقة العمل ، الإجابة (16384) محدش يجرب يعد الخلايا لأن دا هيسبب حاجة اسمها Overflow (جرب بنفسك هيطلع لك رسالة خطأ) نجرب نعد أوراق العمل ? Worksheets.Count أو ? Sheets.Count نجرب نفتح مصنفين مثلاً ونجرب السطر التالي ? Workbooks.Count السطر الأخير لعد المصنفات المفتوحة!! ناخد أمثلة تانية ، هو مفيش غير أسئلة العد دي .. لا طبعا الأسئلة كتير ، بس أنا بقول بالمرة نتعلم أسطر جديدة عشان نستفيد منها في التطبيق العملي طيب نخلي نافذة الإكسيل ونافذة المحرر جنب بعض زي ما اتعلمنا قبل كدا ، ونضع في الخلية B4 القيمة 100 ، وبعدين كليك يمين وتنسيق خلايا ، ونخلي تنسيق الخلية كعملة بالجنيه المصري مثلاً ، ونلونها باللون الأصفر بلاش الأحمر اللي الناس هتبدأ تتعقد منه ، ونخلينا واقفين في الخلية B4 بحيث تكون الخلية هي الخلية النشطة ActiveCell.. نرجع للفورية (النافذة الفورية إنتو لحقتو تنسوا !! ربنا يستر عليكم من الزهايمر) ، ونكتب السطر التالي لمعرفة قيمة الخلية B4 : ? Range("B4").Value ونجرب السطر التالي لمعرفة تنسيق الخلية B4 اللي هي الخلية النشطة : ? ActiveCell.NumberFormat ونكتب السطر التالي لمعرفة عرض العمود للخلية النشطة : ? ActiveCell.ColumnWidth ونكتب السطر التالي لمعرفة عنوان الخلية النشطة : ? ActiveCell.Address ونكتب السطر التالي لمعرفة رقم صف الخلية النشطة : ? ActiveCell.Row ونكتب السطر التالي لمعرفة رقم عمود الخلية النشطة : ? ActiveCell.Column ونكتب السطر التالي لمعرفة رقم اللون الداخلي للخلية النشطة (مش لون الخط Font ) : ? ActiveCell.Interior.Color ونكتب السطر التالي لمعرفة اسم ورقة العمل اللي موجودة فيه الخلية النشطة : ? ActiveCell.Parent.Name في السطر الأخير الكلمة Parent في اللغة الإنجليزية معناها (أحد الوالدين .. وأنا هترجمها الأم ؛ لأن الأم متوصي عليها 3 مرات) ، فالخلية النشطة جزء صغير من الحضن الكبير اللي هو ورقة العمل ، فبالتالي الخلية بمثابة الابن ، وورقة العمل بمثابة الأم ، ففي السطر اللي فات عايزين نعرف اسم الأم للخلية النشطة (واحد هيقولي النتيجة هتطلع كريمة مختار ..ما هي بتطلع بدور الأم دايما ) .. أنا بالفعل خليت اسم الشيت (كريمة مختار) فطلعت النتيجة (كريمة مختار) بس الاسم من غير أقواس .. أنا طولت في الجزئية اللي فاتت عشان نقدر نستفيد كمان من الأكواد المختلفة عشان نبدأ نتقدم في مرحلة التعلم بشكل أسرع (وعشان كمان عجباني شغلانة المحقق دي بصراحة ..أنا أسأل وهو يجاوب !!) ننتقل لجزئية تانية : النافذة دي ليها دور تاني غير اللي عملناه من شوية ، إننا نقدر من خلالها ننفذ الكود مباشرة ، بس بشرط يكون الكود سطر واحد ناخد مثال تطبيقي عملي ، ونكتب السطر التالي لتغيير لون التاب Tab (التبويبات المختلفة لأوراق العمل) - مننساش قبل ما نضغط إنتر نبص على لون التبويب لورقة العمل النشطة ActiveSheet : ActiveSheet.Tab.Color = vbRed لو معجبكش اللون خليه vbYellow ، ولا تزعل نفسك يا منير !! السطر ببساطة بيتعامل مع ورقة العمل النشطة (مش الخلية النشطة نخلي بالنا) وبعدين Tab للتعامل مع التبويبات لأوراق العمل ، وأخيراً Color لتحديد قيمة للون التاب ، ونخلي القيمة اللون اللي يناسبنا .. بكدا نعرف معلومة جديدة إننا ممكن ننفذ الكود من خلال النافذة الفورية ، ونشوف نتيجة تنفيذه في ورقة العمل مباشرةً.. نجرب السطر التالي لتنسيق عرض الأعمدة من A إلى D بمقدار 5 : Columns("A:D").ColumnWidth = 5 ونكتب السطر التالي لجعل ورقة العمل المسماة Sheet1 مخفية : Worksheets("Sheet1").Visible = False أو Sheets("Sheet1").Visible = False ولإظهارها بنغير القيمة False إلى القيمة True .. وممكن نستغنى عن القيمتين دول ، لو عايزين نتعلم الصح هنا .. هنتعلم من خلال الأسطر القادمة التعامل مع الخاصية Visible >> بالنسبة للخاصية Visible ممكن نحط لها قيمة من 3 قيم : -1 أو xlSheetVisible (لإظهار ورقة العمل ...) * القيمة 0 أو xlSheetHidden (لإخفاء ورقة العمل ..) * القيمة 2 أو xlSheetVeryHidden (لإخفاء ورقة العمل ..) محدش منتبه ليه ؟ شكلي كدا هبطل الحلقات بسبب عدم التركيز .. القيمة 0 والقيمة 2 للخاصية Visible نفس الوظيفة (طبعا ً لا .. طبعاً لأ) أمال ايه الموضوع ؟ ايه الفرق؟ القيمة 0 ، دا إخفاء عادي ، يعني ممكن لو أي مستخدم عنده خبرة وعمل كليك يمين على التاب الخاص بأسماء أوراق العمل ، هيلاقي الأمر Unhide ، هيضغط عليه هيلاقي الورقة المخفية ، فيقوم يظهرها .. أما القيمة 2 ، فدا الإخفاء السوبر (زي التطشيب السوبر لوكس) ، دا بقا يخلي المستخدم لو عمل كليك يمين في المكان اللي قلنا عليه ، هيلاقي الأمر Unhide مش أكتيف مش نشط ..! ولإظهار الورقة في هذه الحالة لابد من الدخول على محرر الأكواد ، ومن النافذة properties (ودي لو مش ظاهرة بنضغط F4 تقوم تطل علينا بطلعتها البهية ) ، هنحدد ورقة العمل المسماة Sheet1 ونشوف نافذة الـ Properties في آخرها هنلاقي الخاصية Visible نختار منها أول اختيار الخاص بإظهار ورقة العمل .. أو نستخدم الكود لإظهارها .. السطر اللي المفروض نكتبه هيكون بالشكل ده : Sheets("Sheet1").Visible = -1 خلاصة الجزئية اللي فاتت إننا ممكن ننفذ الأكواد عن طريق النافذة السحرية (أنا حر في تسميتها ..بلاش تعترض يا مدحت) ننتقل لجزئية جديدة ، مع اسستخدام جديد للنافذة العبقرية ، ألا وهي تصحيح الأخطاء البرمجية (ودا الاستخدام الشائع ليها) ودا بيطلق عليه Debugging .. الأخطاء البرمجية بيطلق عليه Bugs (بق : لأن البق حشرة ضارة ، زيها زي الخطأ البرمجي ضار بالكود) قبل ما نسرد في الشرح نتعرف على كائن اسمه Debug ودا بيستخدم في الأكواد عشان يطبع (بس مش على ورق ..أمال هيطبع على ايه ؟؟ هيطبع النتائج في النافذة الفورية) ، والخاصية المرتبطة بهذا الكائن الخرافي اسمها Print ، ونرجع تاني بالذاكرة عشان نتذكر المعلومة اللي ذكرناها عن الفعل Print إنه Method .. ناخد مثال عملي عشان نفهم إزاي نستخدم الكائن Debug ، أدرج موديول جديد ، وضع فيه هذا الإجراء الفرعي : Sub ErrorCode() MyRandomNumber = Rnd() / 0 End Sub فيه دالة بالإكسيل اسمها Rand لعمل أرقام عشوائية بين الصفر والواحد ، ولو حبينا تكون الأرقام العشوائية بين الصفر والعشرة مثلاً نضرب * 10 داخل ورقة العمل قم بتحديد مجموعة خلايا واكتب المعادلة التالية ثم اضغط Ctrl + Enter ، ولتجربة المعادلة اضغط F9 =RAND()*10 المقابل للدالة دي في محرر الأكواد Rnd ووراها قوسين ، يعني الاختلاف في حرف واحد زيادة في الدالة (يا عم بيل جيتس يعني فرقت معاك في الحرف ده ، ما كنت خلتها نفس الحروف !!) يرجع مرجعونا للكود : المتغير وضعنا له قيمة رقم عشوائي على صفر (وعارفين في الرياضيات أنه لا يمكن القسمة على صفر) يعني هذه القيمة تعتبر باطلة ننفذ الكود هنلاقي رسالة خطأ بتقول : Divison By Zero ، نضغط على إنهاء للخروج من نافذة الخطأ .. ممكن واحد مذاكر شوية يقول فيه جملة أنا حافظها عشان أتلاشى رسالة الخطأ : On Error Resume Next والجملة دي نحطها قبل السطر اللي فيه الخطأ البرمجي .. دلوقتي لو نفذنا الكود هنلاقي إن مفيش حاجة حصلت ، طيب نضيف سطر أخير زي كدا : Sub ErrorCode() On Error Resume Next MyRandomNumber = Rnd() / 0 Debug.Print Err.Description End Sub السطر الأخير بيتعامل مع النافذة الفورية ، ننفذ الكود وعنينا على النافذة الفورية .. نفذتوا الكود :: نلاحظ الجملة دي ظهرت في النافذة الفورية Division by zero ، ودي وصف للخطأ البرمجي الموجود داخل الكود .. كلمة Err دي اختصار لكلمة Error (خطأ) ، وبعدين نقطة فتظهر الخواص المرتبطة بكلمة Err ، هنلاقي كلمة Description ودي معناها وصف .. خلاصة لكلام وصف الخطأ . والناتج هيظهر لي في النافذة الفورية .. معلومة تانية ، ممكن ننفذ الكود من خلال النافذة الفورية عن طريق أمر اسمه Call وبعديه مسافة متبعة باسم الإجراء الفرعي أو الدالة بهذا الشكل Call ErrorCode() وممكن نكتب القوسين أو منكتبهمش الأمر سيان !! ناخد مثال تاني على دالة UDF دالة معرفة ، ودي اتكلمنا عليها الحلقة اللي فاتت .. هنعمل دالة بسيطة على السريع ، عشان نطبقها في النافذة الفورية : Function MyName() As String MyName = "YasserKhalil" End Function نكتب ايه في النافذة الفورية ؟؟ في حالة الإجراء الفرعي من شوية كتبنا الأمر Call متبوع بمسافة وبعدين اسم الإجراء الفرعي عشان أقدر أنفذ الكود داخل النافذة الفورية ، أما بالنسبة للدالة Function فبنستخدم علامة استفهام في البداية ? MyName جرب الأمر Call قبل MyName وجرب تشيله مرة ، هتلاقي مفيش نتيجة تظهر لك .. الشكل الصحيح في السطر اللي فات وبس يبقا نخلي بالنا في حالة استدعاء الإجراء الفرعي بنستخدم Call ، أما في حالة الدوال فبنستخدم علامة استفهام قبل اسم الدالة .. نرجع تاني للكائن Debug هل الكائن الخرافي ده مرتبط بالأخطاء فقط ؟؟ الإجابة لا ، هو بييجي وراه كلمة Print لطباعة أي نتائج .. وكمثال أخير عشان الحلقة طولت : Sub PrintX() For X = 1 To 5 Debug.Print X Next X End Sub في الكود الموجود يا عبد الودود فيه حاجة في الـ VBA اسمها الحلقة التكرارية ، ودي مش هشرحها ، لأن فيه موضوع في توقيعي خاص بالحلقة التكرارية For.. Next ، ومرفق بالموضوع ملف فيديو في المشاركات (يرجى الرجوع إليه ..) ما بين سطرين الحلقة التكرارية الأمر اللي بيقوم بطباعة قيمة المتغير X في النافذة الفورية .. ركز في النافذة السحرية هتلاقي النتايج الفورية ، على ما خلصت الحلقة ديا أنا طلعت عينيا .. يارب تكونوا استفدتوا بنسبة 100% ، وإلى لقاء مع حلقة مفيدة ومجدية ، أترككم في حفظ الله . مثال آخر : لمزيد من التوضيح (مثال بدون شرح) >> حلقة تكرارية لأوراق العمل الموجودة داخل المصنف << (الواجب تنفيذ الكود وشرحه) Sub List_Sheets() Dim WS As Worksheet For Each WS In Worksheets Debug.Print WS.Name Next WS End Sub كان معكم المحقق أبو البراء من نيابة أوفيسنا .. والسلام حسن الختام ...
    1 point
  31. الحلقة السابعة *********** السلام عليكم ورحمة الله وبركاته عنوان حلقة اليوم (هيا بنا نلعب ونبني !) النهاردة هنشتغل في البناء .. والبناء هنا هيكون بناء دالة Function .. ممكن يكون الدرس اللي زي كدا مرحلة متقدمة بس أنا تعمدت أشتغل فيها عشان نسبق ونتسابق للمراحل المتقدمة وإحنا في البدايات ، وعشان الناس اللي مستواها متقدم تشارك معانا ، ومتحسش بالملل من البدايات اللي هما شايفينها سخيفة. ** كلنا عارفين إن برنامج الإكسيل بيوفر لنا عدد كبير جدا من الدوال الجاهزة اللي نقدر نستفيد بيها بشكل كبير ، وكمان فيه إضافات Addins بتكون فيها دوال يمكن استخدامها .. لكن مع الوقت هتلاقي نفسك محتاج تعمل دالة (تبني دالة ) بحيث توفر لك الوقت والجهد .. النوع ده من الدوال اللي بتبنيه بنفسك بيطلق عليه (الدوال المعرفة UDF ودي اختصار لـ User Defined Function ) ، وممكن نقول عليها (دوال مخصوصة .. يعني بالبلدي كدا دوال تفصيل .. بنفصلها بحيث تناسب احتياجتنا) هناخد مثال بسيط عشان نفهم إزاي نتعامل مع بناء الدوال : أول شيء لازم يكون عندك المعطيات اللي هتشتغل بيها .. لو قلنا مثلا عايزين نعمل دالة نحسب بيها مساحة المستطيل ..يبقا الأول نعرف معادلة مساحة المستطيل Area = (الطول * العرض) (محدش يكون نظره ضعيف ويقرا العرض من غير نقطة ، لأحسن تودونا في داهية) يبقا المعطيات عندي : الطول والعرض ، هنقول الطول Length والعرض Width .. دي طبعا هتكون متغيرات لأننا مش عارفين قيمتهم كام ، ولأن قيمتهم مش ثابتة ؛ فنطلق عليهم (المتغيرات) ممكن نعملها على شكل معادلة ونقول : Area = Length * Width خطوات البناء : هنفتح محرر الأكواد وندرج موديول جديد ونستعد لعملية البناء ..ركزوا معايا يا أحباب Function Area() End Function أول شيء نكتب كلمة Function مش Sub يا صالح .. إحنا هنشتغل على دالة يبقا نكتب Function أما كلمة Sub فدي بتكون للإجراء الفرعي ..وبعدين نترك مسافة (بالمسطرة أكيد) ونكتب اسم للدالة .. هنسميها هنا اسم معبر Area لأننا عايزين نحسب المساحة وبعدين لما تضغط Enter هتلاقي محرر الأكواد عمل قوسين بعد اسم الدالة وقفل بالجملة End Function (ومننساش دايما القفلة مطلوبة ..لازم يكون تقفيلك مظبوط) ما بين السطرين اللي اتكتبوا دول هتبدأ تكتب الأكواد المطلوبة لتنفيذ العملية الحسابية لحساب مساحة المستطيل ... بس قبل ما نبدأ يا ريت نحط مؤشر الماوس بين القوسين (ايه ده هما القوسين دول طلعلهم لازمة .. أنا كنت مفكرهم زينة وشكل .. حاجة تحلي شكل المحرر زي غترة كدا !) .. القوسين دول بنستخدمهم لتحديد متغيرات الدالة ودي بنسميها arguments ، زي المتغيرات Variables بس دي بيتم الإعلان عنها داخل الأقواس دي ..( يعني هيا متغيرات بس ممكن نقول إنها متغيرات من فصيلة الذوات .. بمعنى إنها مهمة وليها برستيج ، فأول ما نعلن عنها نعلن عنها في الأول قبل ما نبدأ نشتغل عليها). هنكتب اسم المتغير ونوعه زي كدا Function Area(Length As Double, Width As Double) End Function وإحنا بنكتب المتغير وبعديه كلمة As أول ما ناخد مسافة ، هنلاقي فيه قايمة ظهرت لي عشان أختار منها (ممكن نطنشها ..نتجاهلها) أو ممكن نستفيد منها إننا نشوف الكلمة اللي عايزينها ولما نلاقيها نضغط عليها Double Click يعني دبل كليك (شفتوا الترجمة دي .. مش أي حد يترجم خلوا بالكم) ، لما نضغط دبل كليك عليها هنلاقيها اتكتبت ، يا إما نضغط Tab من لوحة المفاتيح .. أول متغير اسمه Length اللي هو خاص بالطول ، وحددنا نوعه بـ Double ودا زي ما عرفنا بيستخدم مع الأرقام العشرية الطويلة . تاني متغير اسمه Width وبردو حددناه نفس النوع .. ومننساش عشان الأمور تكون صحيحة بنضع فاصلة بين المتغيرين ..عشان عمنا المحرر ميحصلش عنده لبس !! بكدا نكون انتهينا الحمد لله .. عندك لسه مخلصناش ..دي كانت البداية والنهاية .. نيجي بقا للجد اللي هو هزار نكتب السطر اللي جاي ده ما بين البداية والنهاية Area = Length * Width يا ريت بعد إذنكم بلاش كسل - محدش ياخد السطر كوبي ويروح يعمل Paste - لا أنا عايز أتعبكم - ما أنا تعبان من الكتابة - اتعبوا شوية انتو كمان .. كله يكتب (اكتب يا حسين .. سجل كل كلمة بيقولها !!) .. الفايدة من الكتابة إننا أول ما نكتب كلمة Area وناخد مسافة ، نلاحظ مستطيل أصفر ظهر لي بيشرح لي متغيرات الدالة .. حلوة ولا ملهاش فايدة .. الفايدة إنها تعتبر زي وسيلة مساعدة ، عشان لما نحب نستخدم الدالة دي في كود تاني أو دالة تانية .. (معنى الكلام اللي بقوله إننا ممكن نبني دالة ونستخدمها في دالة تانية أو كود أو خلافه ..كنوع من التيسير) لو كتبنا أول حرف في كلمة length أو width بحرف small ، هتلاقي المحرر بعد ما تخلص بيحول الحروف الأولى دي لحروف Capital ، ودي سببها إن الكلمات دي متعرف عليها قبل كدا في أول الدالة. كدا تمام تم بناء الدالة (بالسهولة دي ! أيوا بالسهولة دي .. الفكرة مش معقدة .. كلنا اللي إحنا عايزينه مساحة المستطيل والمساحة = الطول * العرض (بس خلاص على رأي شعبولة) نيجي بقا نشوف نتيجة الكلام اللي إحنا عملناه في ورقة العمل .. واحد يقول هنضغط Run (هقوله لا دا مش إجراء فرعي .. دي دالة ، ودلوقتي طالما كتبتها عندك في ملفك أصبح زيها زي أي دالة ، يعني زيها زي الدوال الموجودة في الإكسيل ..وببساطة شديدة تقدر تستعملها ..) تطبيق على الدالة : قم بوضع القيمة 9 في الخلية A1 والقيمة 6.5 في الخلية B1 ، وبعدين في الخلية C1 قم بعمل معادلة للدالة اللي إنت بنيتها: =area(A1,B1) نخلي بالنا ..لما نستخدم الدالة بنستخدمها بنفس الشكل اللي بنيناها بيه ، يعني المتغير Length بييجي بعديه فاصلة ثم المتغير Width ..نشوف الناتج هنلاقية 58.5 .. وبكدا عرفنا مساحة المستطيل بدلالة الطول والعرض .. نجرب نمسح الخليةB1 ونشوف الناتج ، هنلاقي الناتج صفر ، ودا طبيعي لأن أي رقم * فراغ = صفر بس أنا عايز أحط شروط مختلفة ، أنا عايز الناتج ميكونش صفر .. لما يكون العرض مش موجود يضرب الطول في نفسه ..(ايه الكلام الصعب ده ) نرجع تاني للدالة ونبدأ نشوف ايه اللي ممكن نعمله ..؟ في الحالة دي طالما إن إنت عايز تخلي العرض اختياري وليس إجباري ، يبقا هتحدد الكلام ده للمحرر ، وتقوله Optional (اختياري) Function Area(Length As Double, Optional Width As Variant) Area = Length * Width End Function هنا غيرنا نوع المتغير إلى Variant، تحسبا إنك ممكن تترك الخلية اللي فيها العرض فارغة .. واحد هيقول : خلااص ، هرد أقوله : لسه ! طالما إننا خلينا العرض اختياري ، يبقا لازم نحط شرط ، ونشوف الشرط إذا تحقق يعمل ايه ، ولو الشرط متحققش يعمل ايه ..!! نرجع لمرحلة الإعدادي لما كنا بناخد قاعدة IF بمعنى إذا أو لو (وعرفنا أيامها إن لو حرف شعلقة في الجو) .. جملة IF في البرمجة : بييجي وراها شرط ، ولو الشرط اتحقق ايه اللي يحصل ، ولو متحققش ايه اللي يحصل . الشرط اللي هنحطه .. في حالة عدم وجود العرض يعمل ايه ؟ يضرب الطول في نفسه (الطول * الطول) ، طيب لو كان موجود العرض ، يبقا يضرب الطول * العرض Function Area(Length As Double, Optional Width As Variant) If IsMissing(Width) Then Area = Length * Length Else Area = Length * Width End If End Function ما هذا ؟؟ هذا ماذا ؟ هذا هو شكل الدالة بلغة البرمجة ، زي ما فهمناها نترجمها .. بعد كلمة If بييجي الشرط ، والشرط نخلي بالنا يا إما True يا إما False .. لو True ينفذ السطر اللي بعد كلمة Then مباشرة ، لو False ينفذ السطر اللي بعد سطر Else وجملة If الشكل العام ليها زي كدا If الشرط Then الكود في حالة تحقق الشرط Else الكود في حالة عدم تحقق الشرط End If محدش ياخد الكود ده في محرر الأكواد (دا للتوضيح .. واحد مش معبرني وبردو بياخد الشكل ده كوبي ورايح على محرر الأكود ..سيبوه يتصدم !!) أعتقد الصورة كدا بقت واضحة .. استعملنا في الشرط كلمة IsMissing ، الترجمة الحرفية ليها هل مفقود ؟ هل مفقود العرض ؟ -- يعني هل المتغير المسمى العرض مفقود ؟ لو كان مفقود هيتم حساب المساحة بضرب الطول * الطول ، ولو كان موجود يطنش الجزء الأول وينفذ الجزء التاني ، ويضرب الطول * العرض نرجع لورقة العمل ونعدل المعادلة ونخليها : =area(A1) كدا مفيش المتغير الخاص بالعرض ، فتقوم الدالة تضرب الطول * الطول ، ويطلع الناتج 81 لو فضلت المعادلة زي ما كانت في الأول هيكون الناتج صفر .. طيب دا هيكون واجب : عايزين نضيف شرط وهنستخدم فيه معامل الشرط OR ..بحيث لو كان العرض = 0 يضرب الطول * الطول ... سامع واحد من اللي بيقروا بيدعي عليا ، وبيقول حرام عليك طلعت عنينا عشان نعرف مساحة المستطيل ، دا أنا أرحم لي إن أحسبها بايدي وأريح بالي .. معلش استحملوني ! دا كان مجرد مثال عشان نفهم إزاي نقدر نبني دالة .. واجب تاني غير الأولاني (مش هرحمكم!) : قم ببناء دالة بسيطة ، بحيث لو قيمة معينة أكبر من أو يساوي 100 يكتب ممتاز ، لو أقل من 100 يكتب جيد وإلى لقاء مع حلقة جديدة من حلقات افتح الباب واجري ورايا كان معكم البنا أبو البراء من شركة مؤسسة أوفيسنا لأعمال البناء .. إلى أن ألقاكم بخير .. دمتم في حفظ الله
    1 point
  32. الحلقة السادسة ************ أهلا بكم إخواني الأحباب مع حلقة جديدة ، والحلقة دي استكمال لحلقة المتغيرات .. كنا اتكلمنا عن نوعين من المتغيرين باستفاضة (3 مرات على ما الكلمة اتكتبت معايا ) ..اتكلمنا عن النوع Integer ودا بيكون للأرقام الصحيحة ، والنوع String ودا بيكون للقيم النصية. نكمل رغي عن المتغيرات عشان نخلص منها ونخلص عليها .. بداية أحب أعرفكم بدالة في VBA اسمها CINT ..الدالة دي وظيفتها إنها بتحول أي قيمة لعدد صحيح من النوع Integer (ودي اختصار Convert Integer..الحرف الأول من Convert وأول 3 حروف من Integer) >> الكلام مش هيفيد بقدر التطبيق :: نجرب المثال التالي Dim LValue As Integer LValue = CInt(8.45) MsgBox LValue لو نفذنا الكود هنلاقي إن القيمة أصبحت 8 .. طيب نغير الرقم إلى 8.5 ونشوف النتيجة بردو نفس القيمة 8 .. طيب نغير الرقم ونخليه 8.6 خلي بالك متتوقعش 8 ، القيمة بقت 9 (تسعى في الخير) الملاحظات المستفادة : إن الكسر لو أقل من أو يساوي 0.5 .. القيمة بتتقرب لتحت ، أما لو الكسر أكبر من 0.5 يبقا يتقرب لفوق ..(يعني الدالة دي ممكن نستفيد منها في أمور تانية .. زي التقريب) جرب القيمة 8.50001 .. جربتو : أكيد لا نازلين قراية وخلاص .. اللي جرب هيتأكد من إن : لو هفوة مفيش تفاهم!! نراجع مرة تانية المتغير Integer بمثال عملي : Dim nRowCount As Integer nRowCount = Rows.Count MsgBox nRowCount أولاً عايزين نتعلم شيء مهم جداً وإحنا لسه في البداية : إننا لما نيجي نسمي متغير يا ريت يكون الاسم وصفي (يعني كل المتغيرات عندي هسميها وصفي ..شكلك بتعزه يا أستاذ ...طيب ما نسميه شوقي أو مراد ..لازم وصفي ) .. يا جدعان انتو فهمتوني غلط أنا أقصد بكلمة وصفي إنه يوصف الاسم بشكل كويس .. يعني مثلا نشوف نوع المتغير نلاقيه Integer فنقوم في أول الاسم نحط مثلا n عشان يوضح لأي حد يقرا الكود إنه Interger ، وبعد الحرف الدلالي n نكتب اسم للمتغير يكون دال عليه .. أنا مثلا هعد الصفوف فاقوم أكتب RowCount .. يبقا في النهاية اسم المتغير nRowCount ...طبعا اللي بقوله ده مش الزامي ..دي عادة حسنة بيتبعها المبرمجون المحترفون ..مش الاقي ناس تكتب mghy حاجة كدا ملهاش دلالة على اسم المتغير ...!! السطر التاني وضعنا قيمة للمتغير وهي Rows.Count وطبعا كلمة Count دي Method بمعنى (عد) ، ودي وظيفتها إنها تعد بس تعد ايه .. تعد الصفوف Rows واحد يقولي طيب ممكن أعد الأعمدة أقوله أيوا Columns.Count مفيش مشكلة .. واحد يقولي يعني ممكن أعد الخلايا في نطاق معين زي A1:C5 ، بردو مفيش مشكلة Range(Cells(1, 1), Cells(5, 3)).Count المهم خلينا في السطر التالت (محدش يخرجني برا الموضوع) .. مش محتاج شرح ..إظهار قيمة عدد الصفوف في رسالة ننفذ الكود (رسالة خطأ .. ميهمكش من الفشل .!! ) واحد هيسألني طيب الغلطة فين ..كل حاجة زي الفل .. المحرر دا بيستعبط ! أنا مش هشتغل على المحرر دا تاني سلااام .. هرد عليه وأقوله اصبر بس كل الحكاية إننا بنتعامل بقواعد وقوانين ..أنا لما عرفت المتغير حددت نوعه بـ Integer ودا بيكون للأرقام الصحيحة ما بين 32, 767 و القيمة السالبة -32, 768 يعني ببساطة بيتعامل مع الأرقام دي وبس ..ميقدرش يتعامل مع أكبر من كدا .. طيب ايه الحل ؟ ايه البديل ؟ البديل المتغير Long دا بيتعامل مع الأرقام الصحيحة بردو ، بس ما بين 2,147,483,647 -2,147,483,648 طيب نرجع للكود بتاعنا ..عدد الصفوف في إكسيل 2007 مثلا يساوي 1048576 ، والمتغير Integer قلنا إن صحته على أده ، فيقوم المتغير Long ييجي ويشيل.. يبقا كل اللي هنغيره كلمة واحدة عشان الامور تمشي تمام (نشيل Integer ونحط Long) يعني ممكن الكود يكون بالشكل ده (لاحظوا أنا هغير البادئة في اسم المتغير إلى L اختصار Long) Dim LRowCount As Long LRowCount = Rows.Count MsgBox LRowCount بكدا نكون اتعرفنا على Integer و Long في حالة التعامل مع الأعداد الصحيحة. ننتقل لجزئية جديدة .. التعامل مع الأرقام اللي فيها كسور عشرية.. مش هنطول في الكلام ، هناخد باختصار مثال عملي عشان نفهم الدنيا ماشية إزاي Dim FloatingPoint As Single FloatingPoint = 10 / 3 MsgBox FloatingPoint طيب نغير كلمة Single بكلمة Double ونلاحظ الفرق..!! مش هشرح الفرق لكن هقول إن اللي فهم الفرق بين Integer و Long ، هيفهم الفرق بين Single و Double ... حازم رفع ايده وقالي لأ يا باشا اشرحها بردو (حاضر يا عم حازم حازم هنشرحها عشان نأكد المعلومة بس مش أكتر ) لما استعملنا النوع Single نلاحظ إن عدد الأرقام العشرية 6 بس ، أما Double فنلاقي إن اللي على يمين العلامة 14 رقم (جرب الكود مرة كدا ومرة كدا وعد بنفسك (فيه ناس هتكسل)) نقطع على الجماعة المدرسين اللي بدوا رياضيات ، ونقول إن مساحة الدائرة = ط نق2 ، والله مش عارف إذا كان صح ولا غلط عموما القيمة ط = 22/7 ، ودي موجودة في الإكسيل باسم Pi ، يعني لو كتبنا في خلية =PI() هيديني قيمة الـ ط ... المهم نستفيد في المثال التالي معلومة جديدة (إننا ممكن سنتخدم بعض الدوال الموجودة في الإكسيل ونطبقها في الـ VBA) Dim FloatingPoint As Single FloatingPoint = WorksheetFunction.Pi MsgBox FloatingPoint نخلي بالنا إننا وضعنا قيمة للمتغير واستخدمنا WorksheetFunction عشان أقول لمحرر الأكواد إننا هنستخدم دالة ، وبعدين نقطة Period وبعدين اسم الدالة هنا Pi ومفيش أقواس (دا الاختلاف ..لما استخدمناها في ورقة العمل كان لازم أقواس أما هنا فلا يتم استخدامها .. نجرب مرة المتغير Single ومرة المتغير Double ..(أي خدمة يا حازم حازم .. منستغناش عن خدماتك يا متسر ياسر ياسر ) نكمل كلام عن المتغيرات عشان نخلص منها : نتكلم عن المتغير التقيل Variant ودا بنستخدمه لما نكون مش عارفين نحدد القيمة هل هي رقم ولا نص ولا كائن Object ولا ولا (ولى زمن الجهل وأقبل زمن التعلم) .. فبنستخدمها ..بس نخلي بالنا إنها بتستهلك مساحة من الذاكرة فكثرة استخدامها بتخلي التعامل مع الأكواد يكون بطيء .. المتغير اللذيذ Boolean ودا يا أبيض يا أسود .. يا صح يا غلط .. يا True يا False .. يا 1 يا صفر بتكون القيمة المخرجة إحدى قميتين فقط Dim bOfficena As Boolean MsgBox bOfficena هنا حددنا نوع المتغير بـ Boolean .. لما ننفذ الكود هنلاقي رسالة فيها False (نفهم من كدا إن الاختيار الافتراضي هو False) يعني مش زينا بنفترض حسن النية ، لا دا ماشي بمبدأ المتهم مجرم حتى تثبت براءته ، فهنا وضع القيمة False للمتغير .. نجرب نضع القيمة صفر Dim bOfficena As Boolean bOfficena = 0 MsgBox bOfficena هنلاقي نفس الناتج اللي فات False ..!! نغير شوية ونخلي القيمة أي قيمة غير الصفر ، هتلاقي الناتج True فيه متغيرات تانية زي Date للتعامل مع التواريخ ، والمتغير Currency للتعامل مع العملات وبكدا كفاية أوي على المتغيرات .. المهم في الموضوع الفكرة تكون وصلت .. للمزيد من الشروحات يرجى الإطلاع على الدورة الرائعة التي يقوم بها أخونا محمود الشريف (كلنا بنكمل بعض ..دا شعارنا في المنتدى ..أنا بس مجرد واحد معاه مفاتيح ..هديكم نسخة منها عشان تعرفوا تفتحوا الباب يا أحباب) كان معكم صانع المفاتيح Keys Maker أخوكم أبو البراء وإلى لقاء في حلقة جديدة من حلقات افتح الباب واهرب من الشباك .. دمتم بود .. تقبلوا حبي وأشواقي وتحياتي القلبية
    1 point
  33. بيقولو لو الوطن اتصل هاتقولو ايه ؟ .... فقلت ايوا لسـة فاكـــر تتصــل لســة فاكـــر انك ليكـ شــعب كان أمــس بيــكــ بيـفتخر . لســة فاكـــر يا وطــــــن .... بعد مـــا شـــبابك بقي حلمهــم انكــ تتهـــجر . كــنت فين لما دم اخويـــا سال عالرصـيف !!! كــنت فين لما مـــات شـــهيد الرغـــيف !!! لســة بتتصــل .... !؟ طــب إتصــــل وانــت بتتصل إفتـــكر..... إني صـــوتي اللي حــــررك اتـحــرق ... والحــرية اللي حلمنا بيها كلام عــالورق ... إتصـــل ... ولما تتصــل افتــكر... اني هــربت للغربة قبل ما اتكــــــسر وغربتي بقت أيام عمري اللي بيتهدر إتصل يا وطـــن ... إتصل اتصل وقبل ما تتصل ... افتكر ان دمنا من غير تمن كان بيتهدر اتصل وياريتكـ تفتكــر إن ذنب الشــعب في رقبتك افتكر ... افتكر ... انك خليت غربتي وطــني وأنت محطة هبوطــ افتكر ان كلمة نهائي ..تــساوي عند المغترب روح مـــوت موت حــوادث مــوت كــوارث أوحتى مــوت من السكوت اتصل يا وطــن اتصل وانت بتتصل افتكر ان صحيت ولادي يوم رجوعي وسمعت منهم اللي وجع قلبي بين ضلوعي .. سمعت بنتي لما قالت نفسي اهاجر نفسي اسافر او حتى يا امي نفسي بلدي تبقى ديا نفسي ابقى هنا ابقى سعوديه شفت يا وطن ..شفت انك بقيت تراب بقيت سراب يبقى لسا ناوي تتصل طب اتصل او حتى اعتقل كل اللي مقلش آمييين اعتقل ومتنساش تمنع هواك تمنع دواك عن المسجونين اتصل وقبل ما تتصل بس افتكر كل اللي فات وانتظر ايوا انتظر انتظر كتير او قليل انما في الاخر هاتفتكر ## بقلم Safa Mahdy
    1 point
  34. حرصـاً من فريق العمـل بالمركز الإعلامي علــى تحسـين و تطـوير نـــوع الخدمة التي تتلقاهــا ومن ذلك المنطلق لاحظنا وجود عدة استفسارات من وقت لأخر حول كيفية اضافة موضوع جديد، استخدام خاصية البحث ، عرض موضوعات عضو معين ، مشاكل مع رفع المرفقات ..... الخ لذلك سوف نستعرض معا بعض الخواص التي تهم الأعضاء (( وللموضوع بقية ))
    1 point
  35. السلام عليكم الكود التالي يعمل على 2003-2007 Option Explicit '////////////////////////////////////////////////////// ' اسم مجلد الملفات Const FilName As String = "ملفاتي" ' عنوان خلية الجمع في الملفات Const Adr As String = "A1" '////////////////////////////////////////////////////// Sub kh_SumAllBook() Dim MyObj, MyObjFol, Obj Dim xlw As Excel.Workbook Dim MySheet As Worksheet Dim iPath As String, iName As String Dim Last As Long, i As Long Dim ch As String * 1 ch = Application.PathSeparator '============================ On Error GoTo Err_kh_Files '============================ iPath = ActiveWorkbook.Path & ch & FilName & ch Set MyObj = CreateObject("Scripting.FileSystemObject") Set MyObjFol = MyObj.GetFolder(iPath) '============================ Set MySheet = ThisWorkbook.Worksheets("TOTAL") '============================ With MySheet Last = .Cells(Rows.Count, "A").End(xlUp).Row .Range("A2").Resize(Last, 3).ClearContents End With '============================ kh_Application False '============================ On Error Resume Next For Each Obj In MyObjFol.Files iName = Obj.Path If Not Dir(Obj.Path) = "" Then If TestType(CStr(Obj.Name)) Then Set xlw = Workbooks.Open(iName) With MySheet i = i + 1 .Cells(i + 1, "A").Value = CStr(Obj.Name) .Cells(i + 1, "B").Value = CStr(xlw.Worksheets(1).Name) .Cells(i + 1, "C").Value = Val(xlw.Worksheets(1).Range(Adr)) End With xlw.Close False End If End If Next On Error GoTo 0 '============================ If i Then MySheet.Range("E2").Value = Evaluate("Sum(" & Range("C2").Resize(i).Address & ")") '============================ Err_kh_Files: kh_Application True If Err Then MsgBox "Err.Number:" & vbCr & Err.Number: Err.Clear '============================ Set MySheet = Nothing: Set MyObj = Nothing: Set MyObjFol = Nothing End Sub Sub kh_Application(mbol As Boolean) With Application .Calculation = IIf(mbol, -4105, -4135) .ScreenUpdating = mbol .EnableEvents = mbol End With End Sub Function TestType(MyTName As String) As Boolean Dim MyTyp As String MyTyp = Mid$(MyTName, InStrRev(MyTName, ".")) TestType = MyTyp Like ".xls*" End Function المرفق 2003-2007 kh_sum.rar
    1 point
  36. يمكنك ذلك عن طريق الpage setup للتقرير طبعا تعدل عدد الأعمدة وعرض العمود الواحد ليناسب مقاس الصفحة file>page setup>columns>number of columns:3>column size>width=6 REPORT.zip
    1 point
×
×
  • اضف...

Important Information