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

Foksh

الخبراء
  • Posts

    5143
  • تاريخ الانضمام

  • تاريخ اخر زياره

  • Days Won

    262

كل منشورات العضو Foksh

  1. تسمحولي بمداخلة بسيطة ، ولا اعلم إن كانت ستحل المشكلة .. بدايةً هل النموذج يحتوي على دوال تقوم بحسابات معينة مثل تاريخ وسن التقاعد ( الواضح من الصورة ) ؟؟ إن كانت نعم ، فهنا أعتقد السبب الرئيسي للمشكلة التي تحدث عنها أخي أحمد . فآكسيس سيحتاج للعمليات الحسابية أجزاء من الثانية إن كانت الدوال تستدعى عند التحميل أو الفتح للنموذج . لذا ، هل جربت عند فتح النموذج استخدام دالة تعطيل رسم المكونات في النموذج :- Me.Painting = False استخدامها عادة يكون باستدعاء الأيقاف لرسم وتحديث النموذج عند تحميله أو فتحه ، ومن ثم العودة بتشغيلها بعد هذه الدوال أو الإستدعاءات التي تجلب قيم ناتجة عن عمليات حسابية . لم أقم بالتجربة الحقيقية على المرفق ، ولكن من باب النقاش ليس أكثر .
  2. تمام اخي اسعد ، إن شاء الله بصمم لك نموذج يخدمك فيما تريد .. لكن العذر منك على التأخير بسبب العمل الليلي 🥱
  3. وعليكم السلام ورحمة الله وبركاته .. المشكلة الحالية التي رأيتها في الملف المرفق أنه لا توجد حقول تربط اللجنة برقم المبنى ( id_mabna ) أو كود المراقب ( id_morakab ) . وجدول ( Tbl_lagna ) به حالياً فقط الحقول id_lagna , ellagna , almoraqeb ( كنص يدوي وليس كربط ) . لذا ما خطر ببالي الآن هو :- ننشئ استعلام بسيط لتجميع أرقام الجلوس والطلاب ، ولنفترضه بالإسم qry_Student_Seats :- SELECT Tbl_student.alsaf_Id, Tbl_student.id_lagna, Min(Tbl_student.Stugalos) AS FromSeat, Max(Tbl_student.Stugalos) AS ToSeat, Count(Tbl_student.id_student) AS TotalStudents FROM Tbl_student WHERE Tbl_student.Stugalos IS NOT NULL AND Tbl_student.id_lagna IS NOT NULL GROUP BY Tbl_student.alsaf_Id, Tbl_student.id_lagna; ننشئ الإستعلام الكامل الذي يمكنك أن تستخدمه في أي مكان ، ولنفترض إسمه qry_Lagna_Full :- SELECT Tbl_saf.saf AS الصف, qry_Student_Seats.id_lagna AS [رقم اللجنة], qry_Student_Seats.FromSeat AS [من رقم جلوس], qry_Student_Seats.ToSeat AS [إلى رقم جلوس], qry_Student_Seats.TotalStudents AS [عدد الطلاب], Tb_elmabna.mabna AS المبنى, Tbl_morakab.teacher AS المراقب FROM ((qry_Student_Seats INNER JOIN Tbl_saf ON qry_Student_Seats.alsaf_Id = Tbl_saf.saf_id) LEFT JOIN Tb_elmabna ON qry_Student_Seats.id_lagna = Tb_elmabna.id) LEFT JOIN Tbl_morakab ON qry_Student_Seats.id_lagna = Tbl_morakab.id_teaccher ORDER BY qry_Student_Seats.alsaf_Id, qry_Student_Seats.id_lagna; الآن شغل الإستعلام الكامل وشوف النتيجة إن كانت صحيحة .. كملاحظة ، ستجد أن المبنى والمراقب فارغان للجان من 7 فما فوق ؛ والسبب بسيط جداً أخي أسعد وهو أن جدوليك Tb_elmabna و Tbl_morakab مسجل بهما حالياً 6 سجلات فقط (من 1 إلى 6) . فبمجرد إضافة المبنى 7، 8، 9، 10 والمراقبين 7، 8، 9، 10 في جدوليهما الأصليين ، ستراهم قد ظهروا تلقائياً أمام باقي اللجان بدون أي تدخل النتيجة في المرفق :- school4.zip
  4. هذا باعتبار أن الملف Accdb أو ملف قاعدة بيانات !! لكن الملف هو ملف تنفيذي EXE
  5. ما شاء الله ،، يا عيني يا عيني على التحكم الجميل والممتع فعلاً مؤثرات بصرية ممتعة وجميلة وتكثر الحاجة لها في عدة أمور ومواضع جزاكم الله خيراً أخي منتصر على ما تطرحونه من أفكار جميلة فعلاً .. وقد ذكرتني في أحد التحديات ( التحدي الـ 11 ) ، والتي قامت بها المجموعة في الواتس أب ، وكان هناك بعض الأفكار في هذا الرابط :- https://drive.google.com/drive/folders/1eUZmrIB9FkbmazQNBHpNJiFaXwCg7c75
  6. وعليكم السلام ورحمة الله وبركاته ، أخي عبدالله .. بداية شكراً لك على المتابعة ، وفعلاً كان الخلل في اسم المدرسة التي ذكرتها . حيث كان اسمها في الورقة Sheet2 = "عمربن الخطاب بالزاوية " ولاحظ الفراغ الموجود في نهاية الاسم . بينما في الورقة الثانية = "عمربن الخطاب بالزاوية"
  7. وعليكم السلام ورحمة الله وبركاته .. الصق هذه المعادلة في الخلية C2 ، وراقب النتيجة للصف الأول ، هل هي صحيحة :- =COUNTIFS(Sheet2!$B:$B, $B2, Sheet2!$E:$E, "*"&C$1&"*") إذا لم يظهر لديك أي مشكلة أو رسالة خطأ تتعلق بالفاصلة العادية (,) أو المنقوطة (;) . وكانت النتيجة صحيحة لعدد الطلاب للمدرسة والصف . فقم بسحبها من C2 وحتى H2 = الصف السادس لنفس الصف . فإذا كانت النتيجة صحيحة أيضاً ، حدد الخلايا الـ 6 ثم اسحب من الزاوية الى نهاية الأعمدة في الورقة للتطبيق على جميع المدارس والصفوف دفعة واحدة . أما فيما يتعلق بالإجمالي ، فاستعمل المعادلة البسيطة في i2 ، ثم اسحب لآخر العمود لجلب إجمالي عدد الطلاب لكل مدرسة في صفوفها الـ 6 :- =SUM(C2:H2) وهذا ملفك بعد التطبيق :- دمج بهاء.xlsx
  8. بسم الله ، ما شاء الله سلسلة ذهبية غنية ، وشاملة من إبداعاتك أخي منتصر .. اللهم لا حسد ، ونسأل الله أن يبارك لكم في علمكم وأن ينفع بكم
  9. يا عيني يا عيني ما هذا الجمال ، والإبداع أخي منتصر بارك الله فيك على هذه المشاركة الجميلة فعلاً والتي يحتاجها الكثير فعلاً .. تعقيباً على كلام أخي موسى ، والذي لا ينقص من روعة العمل شيئاً ، لاحظت ما يلي يما يتعلق بالنقطة الثانية :- استخدام تعريف المتغير Private lngStep As Single في بداية النموذج الفرعي sbfSpinButtons . حيث أن نوع البيانات Single ( وحتى Double ) يعتمد على نظام الفاصلة العائمة الثنائي . وهنا الكسور العشرية التي تبدو بسيطة مثل 0.1 أو 0.05 لا يمكن تمثيلها بشكل دقيق تماماً بالنظام الثنائي ؛ فيتم تخزينها بقيمة تقريبية تزيد قليلاً عن القيمة الأصلية . ثم يأتي شرط فحص الحد الأقصى في الدالة Up ، حيث varMaxValue = 1 ، في الجملة :- If (ctlTxtBox.Value + lngStep) <= varMaxValue Then وفرضاً ، الشرط يختبر هل 1.00000001490116 <= 1 ؟؟؟ والنتيجة قطعاً هي لا = False . بالتالي يرفض الكود الزيادة ، ويتجمد الرقم عند 90% (0.9) . ونفس الأمر يتكرر مع خطوة 5% بعد 20 نقرة حيث يتجاوز المجموع الرقم 1 بجزء متناهي الصغر ، فيتوقف عند 95% . ونفس المشكلة تحدث أيضاً عند النزول Down . عندما يصل إلى 10% ثم ينقص 0.1 ، يصبح الناتج تقريباً -0.0000000149 ( أقل من الصفر ) ، فيتوقف عند 10% ولا يصل إلى 0% . لذا ، خطر ببالي ومن باب التجربة ما يلي ، على الدالتين Up و Down ، مع تغيير نوع المتغير طبعاً ليصبح الضع كالتالي :- نوع المتغير في تعريفه من Single إلى Double . الدالتين تصبحان :- Private Sub Up() Dim curVal As Variant Dim stpVal As Variant Dim nextVal As Variant stpVal = CDec(lngStep) If Not ctlTxtBox Is Nothing Then ' الوضع الأول: مع مربع النص If IsNumeric(ctlTxtBox.Value) Then curVal = CDec(ctlTxtBox.Value) nextVal = curVal + stpVal If Not IsEmpty(varMaxValue) Then If nextVal <= CDec(varMaxValue) Then ctlTxtBox.Value = CDbl(nextVal) ElseIf curVal < CDec(varMaxValue) Then ' إذا تجاوزت الخطوة الحد الأقصى وكان الرقم أقل منه (مثل 99% مع خطوة 3%) نضبطه على 100% ctlTxtBox.Value = varMaxValue End If Else ctlTxtBox.Value = CDbl(nextVal) End If End If Else ' الوضع الثاني: مع متغير وحدث curVal = CDec(dblValue) nextVal = curVal + stpVal If Not IsEmpty(varMaxValue) Then If nextVal <= CDec(varMaxValue) Then dblValue = CDbl(nextVal) ElseIf curVal < CDec(varMaxValue) Then dblValue = CDbl(varMaxValue) Else Exit Sub End If Else dblValue = CDbl(nextVal) End If RaiseEvent ValueChanged(dblValue) End If End Sub Private Sub Down() Dim curVal As Variant Dim stpVal As Variant Dim nextVal As Variant stpVal = CDec(lngStep) If Not ctlTxtBox Is Nothing Then ' الوضع الأول: مع مربع النص If IsNumeric(ctlTxtBox.Value) Then curVal = CDec(ctlTxtBox.Value) nextVal = curVal - stpVal If Not IsEmpty(varMinValue) Then If nextVal >= CDec(varMinValue) Then ctlTxtBox.Value = CDbl(nextVal) ElseIf curVal > CDec(varMinValue) Then ' إذا نزلت الخطوة عن الحد الأدنى وكان الرقم أكبر منه نضبطه على 0% ctlTxtBox.Value = varMinValue End If Else ctlTxtBox.Value = CDbl(nextVal) End If End If Else ' الوضع الثاني: مع متغير وحدث curVal = CDec(dblValue) nextVal = curVal - stpVal If Not IsEmpty(varMinValue) Then If nextVal >= CDec(varMinValue) Then dblValue = CDbl(nextVal) ElseIf curVal > CDec(varMinValue) Then dblValue = CDbl(varMinValue) Else Exit Sub End If Else dblValue = CDbl(nextVal) End If RaiseEvent ValueChanged(dblValue) End If End Sub
  10. جزاك الله خيراً اخي @AMINYOUSIF .. هدية مقبولة منك
  11. وعليكم السلام ورحمة الله وبركاته .. رغم أن طبيعة الطلب غير مفهومة أخي الكريم !!! ولكن !! على العموم ، ومشاركة مع أخي الأستاذ @بن علية حاجي ، جرب هذه المعادلة في الورقة Sheet1 في الخلية I2 ، واسحب للنهاية حسب حاجتك للتطبيق على الكل :- =IFERROR(VLOOKUP(A2&"", source!$A:$D, 4, 0), VLOOKUP(A2*1, source!$A:$D, 4, 0)) السبب على الأغلب يكمن في قاعدة أساسية في إكسل تسمى اختلاف نوع البيانات - Data Type Mismatch أما اذا كان سؤالك ، كيف تعمل الدالة السابقة ؟ فهي تقوم بما يلي :- تبحث أولاً مع تحويل القيمة إلى نص في (A2&"") إذا لم تجدها ، تقوم تلقائياً بالبحث بعد تحويل القيمة إلى رقم (A2*1) تضمن لك الحصول على النتيجة الصحيحة في كلتا الحالتين على أي جهاز كمبيوتر أو إصدار إكسل جرب وأخبرنا بالنتيجة
  12. العفو يا صديقي ...
  13. وعليكم السلام ورحمة الله وبركاته .. جرب المعادلة التالية في الخلية N6 :- =IF(G6<50, "ضعيف", IF(G6<60, "دون المتوسط", IF(G6<75, "متوسط", IF(G6<90, "فوق المتوسط", IF(G6<=100, "كفؤ", "درجة غير صحيحة"))))) إذا لم تعمل معك ، فالسبب عادةً الفاصلة المنقوطة ، لذا جرب التالية إحتياطاً :- =IF(G6<50; "ضعيف"; IF(G6<60; "دون المتوسط"; IF(G6<75; "متوسط"; IF(G6<90; "فوق المتوسط"; IF(G6<=100; "كفؤ"; "درجة غير صحيحة")))))
  14. لكم الأجر والثواب .. شكراً لكم مهندس جمال على مروركم وإطرائكم
  15. وعليكم السلام ورحمة الله وبركاته .. أبدعت بهذه المشاركة أخي أحمد ، وجزاكم الله خيراً لمشاركتكم الأداة مع أنها وكما أوضحتم بأنها 30 يوماً , ولكني سأنصحك بتجربة الأداة الأكثر تطوراً والمفتوحة المصدر حتى ، وبما أنك من المهتمين بهذه الأدوات الجميلة ، وهي أداة Rubberduck في هذه التفاصيل :- 1. تنسيق ومحاذاة الكود :- تقوم بإعادة محاذاة وتنسيق الكود بالكامل بضغطة زر واحدة ( للإجراء الحالي المحدد ، الموديول ، أو كامل المشروع ) . تحتوي على إعدادات متقدمة لتخصيص المسافات البادئة ، طريقة ترتيب الجمل الشرطية ، وسلوك الأقواس والتعليقات . 2. فحص وتدقيق الكود الذكي :- تحتوي الأداة على محلل ذكي يكتشف أكثر من 100 نوع من الأخطاء ونقاط الضعف البرمجية تلقائياً أثناء كتابة الكود ، مثل :- المتغيرات غير المستخدمة ( Unused Variables ) أو الأكواد الميتة ( Dead Code ) . المتغيرات التي لم يُحدد نوع بياناتها صراحة وتُركت كنوع Variant افتراضياً . غياب عبارة Option Explicit في الموديولات . نسيان إغلاق أو تفريغ كائنات الذاكرة ( Set rs = Nothing ) . توفر ميزة الإصلاح السريع ( Quick Fix ) لتصحيح المشكلة بنقرة واحدة دون كتابة يدوية . والعديد من المميزات التي قد تكتشفها عند مراجعتك هذا الرابط للتحميل والتفاصيل .
  16. أهلاً بعودتك أخي @kkhalifa1960 ، وحمداً لله على سلامتكم
  17. وعليكم السلام ورحمة الله وبركاته .. إذا كان قارئ الـ NFC يعمل بوضع Keyboard Emulation ، أي أنه يرسل البيانات كما لو أنك كتبتها بلوحة المفاتيح ، فالإجابة هي نعم يمكن تنفيذ الفكرة دون الحاجة إلى مكتبات خارجية معقدة . وكأننا نتعامل مع قارئ الباركود أو الـ QR تماماً ؛ لأنني قد مررت بهذه التجربة مسبقاً . ابحث عن قارئ يدعم هذه المواصفات مجتمعة :- USB HID Keyboard Emulation . قراءة محتوى NDEF Text من البطاقة ، وليس UID فقط . إمكانية إرسال مفتاح Enter بعد القراءة . ليسهل عيك وضع الحدث داخل مربع نص كلمة المرور في الحدث بعد التحديث . بمعنى آخر ، هو القارئ الذي يعمل كلوحة مفاتيح افتراضية . وطبعاً ليست كل قارئات USB NFC من هذا النوع . اقرأ المقال التالي للتوضيح أكثر . أتمنى أن تكون الإجابة قد شملت ما تفكر به أخي الكريم .
  18. العفو أخي الكريم .. على الرحب والسعة
  19. هذه الجملة وحدها شرف لي أخي منتصر ، أن أقف بجانبكم وبجانب نخبة من الأساتذة هنا التي لكم ولها أعمال تستحق رفع القبعات وبجدارة ..
  20. بارك الله بكم أبا المعتصم على ما دعيتم ... ولكم الأجر والثواب إن شاء الله هو بعينه المنطق اللي انت بتتكلم عنه 😅 .. نعم هنا كان الهدف في الفكرة الأولى أن تقوم الأداة فعلاً بتقديم نسخة Accde ، واسترجاعها عند الحاجة لكثرة ما مررنا به من مشاكل وقعت أنا أولكم - أخوكم الصغير - بها سابقاً بأنني لم أجد نسخة العميل التي تم ارساله لها ولكن مفتوحة المصدر .. ولهذا توجهت لهذه الفكرة . فإن كان في خاطركم أفكار فلا أمانع أبداً أن أسمع أفكاركم ومقترحاتكم التطويرية .. الأمور الدقيقة هذه تلفت انتباهكم ، وفعلاً التسميات موجودة داخل مربعات النص اذا كانت فارغة ، ولكن بدون ليبلات 😁 يا عيني عليك .. بارك الله فيكم أخي احمد على مشاركتكم التجربة .. . سمعت صوتك وأنا أقرأ ردك هذا أخي منتصر 👀 .. مين قال هذا الكلام 😅 . على العكس يهمني رأيكم أخي منتصر
  21. لك ذلك بالطبع .. تفضل يا عزيزي ، تابع الشرح في الفيديو التالي ..
  22. شكراً لك أخي أحمد على مرورك هذا لأن لديك نسخة أوفيس واحدة فقط ، بينما في جهازي فأنا لدي نسختين مثبتتين في الويندوز ، الأولى 2024 - 64 بت ، والثانية 2010 - 32 بت . فلو كان لدي نسخة واحدة ما كانت ستظهر لدي وكان الأمر في جهازي سيكون مطابقاً لما في جهازك . هذا كل ما في الأمر 😇 .
×
×
  • اضف...

Important Information