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

الردود الموصى بها

قام بنشر

انسخي الكود أدناه في الصيغة البرمجية للنموذج

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()
  • Like 2
قام بنشر

 

انسخي الكود أدناه في الصيغة البرمجية للنموذج

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 فيتم حسابها.

 

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

 

شكرا جزيلا

  • أفضل إجابة
قام بنشر (معدل)


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

 

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

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

ثم يتم اضافة السطر التالي و فحص القيمة ,, و هكذا

أما بالنسبة لسؤالك الأول , طبعا الدالة المفروض أن تعطي القيمة الصحيحة المتبقية كلما تم فتح النموذج

أما اذا كان سيتم ابقاء النموذج مفتوحا طيلة ايام الشهر , فهنا لايتم تنفيذ الحساب تلقائيا , بل ينبغي في هذه الحالة استخدام خاصية المؤقت - التايمر

لأن التايمر ينفذ الكود بعدد اجزاء الزمن المعرف له سواء بالثانية أو أجزائها

تم تعديل بواسطه rudwan
  • Like 1

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

زائر
اضف رد علي هذا الموضوع....

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • تصفح هذا الموضوع مؤخراً   0 اعضاء متواجدين الان

    • لايوجد اعضاء مسجلون يتصفحون هذه الصفحه
×
×
  • اضف...

Important Information