noneta قام بنشر ديسمبر 2, 2014 قام بنشر ديسمبر 2, 2014 السلام عليكم.... اعزائي ... في المرفق ادناه نموذج يحتوي على عدد ايام الشهر المتبقية, احتاج الى استثناء ايام الجمعة منها.. ارجو المساعدة.. عدد اايام بدون يوم الجمعة.rar
rudwan قام بنشر ديسمبر 2, 2014 قام بنشر ديسمبر 2, 2014 انسخي الكود أدناه في الصيغة البرمجية للنموذج Private Function Rem_days() Dim FCount As Long Dim tDate As Date Dim Count_Fridays As Long Dim LDOM As Date Count_Fridays = 0 tDate = Date LDOM = DateSerial(Year(Date), Month(Date) + 1, 0) If Weekday(Date, vbFriday) <> 1 Then tDate = tDate - Weekday(Date, vbSaturday) + 7 End If Do While tDate <= LDOM Count_Fridays = Count_Fridays + 1 tDate = tDate + 7 Loop Rem_days = LDOM - Date - Count_Fridays End Function ثم غيري معادلة النص في النموذج لتكون كما يلي =rem_days() 2
noneta قام بنشر ديسمبر 3, 2014 الكاتب قام بنشر ديسمبر 3, 2014 انسخي الكود أدناه في الصيغة البرمجية للنموذج Private Function Rem_days() Dim FCount As Long Dim tDate As Date Dim Count_Fridays As Long Dim LDOM As Date Count_Fridays = 0 tDate = Date LDOM = DateSerial(Year(Date), Month(Date) + 1, 0) If Weekday(Date, vbFriday) <> 1 Then tDate = tDate - Weekday(Date, vbSaturday) + 7 End If Do While tDate <= LDOM Count_Fridays = Count_Fridays + 1 tDate = tDate + 7 Loop Rem_days = LDOM - Date - Count_Fridays End Function ثم غيري معادلة النص في النموذج لتكون كما يلي =rem_days() استاذ rudwan العبقري.... اشكرك جزيل الشكر للمساعدة والدالة تعمل فعلا,, وسؤالي هو هل عند مرور اي يوم جمعة ستأخذها هذه الدالة في الحساب,,مثلا عند تجاوز يوم الجمعة القادم المفروض هو ان ايام الجمعة المتبقية هي 3 فيتم حسابها. وساكون طامعة في كرمك اكثر في ان توضح لي عمل هذه الدالة بالتفصيل لاني في مرحلة تعلم برمجة. شكرا جزيلا
أفضل إجابة rudwan قام بنشر ديسمبر 3, 2014 أفضل إجابة قام بنشر ديسمبر 3, 2014 (معدل) Private Function Rem_days() تم تعريف الدالة هنا على أنها خاصة private لأنها ستكون خاصة لهذا النموذج فقط , أما اذا كان المطلوب استخدام في كافة أجزاء البرنامج فيتم انشاء وحدة نمطية خاصة في قسم الماكرو مع حذف كلمة private Dim FCount As Long Dim tDate As Date Dim Count_Fridays As Long Dim LDOM As Date يتم تعريف كافة المتغيرات التي ستستخدم في أجزاء الدالة مع تعريف نوعها , و اي متغير لايتم تعريفه في هذا الجزء لن يقبل الكود تنفيذه Count_Fridays = 0 هذا عداد لحساب أيام الجمعة , و دائما العداد يتم تصفيره قبل اسناد اي قيمة له اثناء تنفيذ الكود فكرة الكود هنا ان يتم الانتقال بين اليوم الحالي و تاريخ اخر الشهر و نريد ان نتعامل مع تلك الايام اي اليوم الحالي و غدا و الذي يليه و هكذا لذلك نحتاج استخدام متغير من نوع تاريخ ليحمل قيمة التاريخ التي نريد اختبارها tDate = Date اسناد قيمة أوليه لمتغير التاريخ tdate على أن يبدا بقيمة اليوم الحالي LDOM = DateSerial(Year(Date), Month(Date) + 1, 0) هنا تم حساب تاريخ آخر يوم في الشهر الحالي If Weekday(Date, vbFriday) <> 1 Then دالة weekday هي دالة معرفة في الأكسس تعطي قيمة اليوم من الأسبوع , فهنا نريد اختبار هل اليوم هو يوم جمعة ؟ اذا كان لا انتقل للسطر التالي حيث سيقوم بحساب قيمة تاريخ اول يوم جمعة قادم tDate = tDate - Weekday(Date, vbSaturday) + 7 End If الان يكون المتغير tdat قد تم اسناد قيمة اول يوم جمعة له اعتبارا من تاريخ اليوم في المرحلة التالية سيتم عمل حلقة دورانية لاحصاء عدد ايام الجمعة الواقعة مابين المتغير tdate و المتغير ldom و هو تاريخ نهاية الشهر الحالي Do While tDate <= LDOM الأمر السابق يقول نفذ الأمر طالما أن قيمة tdate أقل من قيمة ldom Count_Fridays = Count_Fridays + 1 سبق و أن اشرنا أن المتغير tdate يحمل قيمة تاريخ أول يوم جمعة اعتبارا من الآن , لذلك سيتم اعطاء عداد ايام الجمعة count_fridays القيمة 1 حيث أننا سبق و أن قمنا في أول سطر بتصفير قيمة هذا العداد , و الآن سيحمل القيمة 1 بعد ذلك سيتم اعطاء متغير التاريخ tdate قيمة يوم الجمعة التالي و ذلك باضافة 7 اليه كما يلي , tDate = tDate + 7 هنا سيعود مؤشر البرنامج لتنفيذ الجملة قبل السابقة تلقائيا و ذلك لأننا ضمن حلقة تكرارية تبدأ ب DO و تنتهي ب LOOP و سيكون الانتقال بينهما تلقائيا , للذك سيصبح قيمة عداد يوم الجمعة الآن 2 بعد اضافة 1 اليه ثم سيتم الانتقال الى يوم الجمعة التالي و هكذا الى أن تصبح قيمة المتغير tdate اخر قيمة ضمن الشهر الحالي , لأنه في شرط الحلقة الدورانية نفذ طالما أن قيمة tdate أقل من قيمة تاريخ أخر الشهر و بالمنطق , اذا تجاوز قيمة تاريخ أخر الشهر فسيتوقف الكود عن التنفيذ تلقائيا Loop هنا تنتهي الحلقة التكرارية و سيأخذ عداد ايام الجمع قيمة و لتكن أربعة مثلا نعود و نحسب في الجملة التالية نطرح تاريخ أخر الشهر ناقص التاريخ الحالي ناقص عدد ايام الجمعة Rem_days = LDOM - Date - Count_Fridays نلاحظ هنا أنه يجب أن نسند القيمة المطلوبة في الدالة الى نفس اسم الدالة التي تم تعريفها rem_days End Function هذا شرح مختصر للدالة , و أنا أنصح بأن يتم فهم الدالة أكثر عن طريق اختزالها على عدة مراحل مثلا يتم اعطاء اسم الدالة لأول سطر تنفيذ و حذف باقي الأسطر , ثم يتم اختبار القيمة التي سيرجعها لتكون مفهومة ثم يتم اضافة السطر التالي و فحص القيمة ,, و هكذا أما بالنسبة لسؤالك الأول , طبعا الدالة المفروض أن تعطي القيمة الصحيحة المتبقية كلما تم فتح النموذج أما اذا كان سيتم ابقاء النموذج مفتوحا طيلة ايام الشهر , فهنا لايتم تنفيذ الحساب تلقائيا , بل ينبغي في هذه الحالة استخدام خاصية المؤقت - التايمر لأن التايمر ينفذ الكود بعدد اجزاء الزمن المعرف له سواء بالثانية أو أجزائها تم تعديل ديسمبر 3, 2014 بواسطه rudwan 1
الردود الموصى بها
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.