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

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

قام بنشر

اخواني اعضاء المنتدي الكرام بعد سلام الله عليكم ورحمته وبركاته

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

 

 

ولكم جزيل الشكر ووافر الاحترام

قام بنشر

سألت الذكاء الاصطناعي فاعطاني الاجابة التالية :  ... وعذرا لتقدم الكلمات وتأخرها لوجود كلمات انجليزية بين العبارات العربية

محتاج آلية vba اختار منها الخط وحجمه وارتفاع الصف بحيث تطبق علي كل النملذج والتقارير بقاعدة البيانات اكسس
_____________________________________________________________________________________________________________________________
لتطبيق آلية موحدة لتغيير الخط، حجمه، وارتفاع الصفوف في جميع النماذج والتقارير داخل قاعدة بيانات Microsoft Access، فإن أفضل وأسرع طريقة هي استخدام كود VBA يمر على كافة عناصر قاعدة البيانات (Forms & Reports) ويعدل خصائصها برمجياً دفعة واحدة، بدلاً من تعديلها يدوياً نموذجاً تلو الآخر.

إليك الطريقة بالتفصيل مع الكود الجاهز:

1. كود الـ VBA الموحد
قم بفتح محرر الـ VBA (بالضغط على Alt + F11)، ثم اختر Insert -> Module وانصخ الكود التالي بداخله.

ملاحظة: تم تعيين قيم افتراضية في أعلى الكود (اسم الخط، الحجم، وارتفاع الصف)، يمكنك تغييرها مباشرة من الكود بما يناسبك.

VBA
Sub ApplyGlobalFormatting()
    Dim db As DAO.Database
    Dim doc As DAO.Document
    Dim frm As Form
    Dim rpt As Report
    Dim ctl As Control
    
    ' ---- حدد الإعدادات المطلوبة هنا ----
    Const MY_FONT As String = "Arial"      ' اسم الخط
    Const MY_SIZE As Integer = 12          ' حجم الخط
    Const ROW_HEIGHT As Integer = 450      ' ارتفاع الصف (بالتويت Twips: كل 1 سم تقريباً 567 تويت)
    ' ----------------------------------
    
    Set db = CurrentDb
    
    ' أولاً: تطبيق الإعدادات على جميع النماذج (Forms)
    On Error Resume Next ' لتجنب الأخطاء في حال كان العنصر لا يدعم الخاصية
    
    For Each doc In db.Containers("Forms").Documents
        ' فتح النموذج في وضع التصميم وخفي
        DoCmd.OpenForm doc.Name, acDesign, , , , acHidden
        Set frm = Forms(doc.Name)
        
        ' المرور على كل العناصر داخل النموذج
        For Each ctl In frm.Controls
            ' تعديل الخط والحجم لعناصر النصوص والتسميات
            If ctl.ControlType = acTextBox Or ctl.ControlType = acComboBox Or ctl.ControlType = acListBox Or ctl.ControlType = acLabel Then
                ctl.FontName = MY_FONT
                ctl.FontSize = MY_SIZE
            End If
            
            ' تعديل ارتفاع الصف في حال كان النموذج يعرض كجدول (Datasheet)
            frm.DatasheetRowHeight = ROW_HEIGHT
        Next ctl
        
        ' إغلاق وحفظ التعديلات
        DoCmd.Close acForm, doc.Name, acSaveYes
    Next doc
    
    ' ثانياً: تطبيق الإعدادات على جميع التقارير (Reports)
    For Each doc In db.Containers("Reports").Documents
        ' فتح التقرير في وضع التصميم وخفي
        DoCmd.OpenReport doc.Name, acDesign, , , acHidden
        Set rpt = Reports(doc.Name)
        
        ' المرور على كل العناصر داخل التقرير
        For Each ctl In rpt.Controls
            If ctl.ControlType = acTextBox Or ctl.ControlType = acComboBox Or ctl.ControlType = acLabel Then
                ctl.FontName = MY_FONT
                ctl.FontSize = MY_SIZE
            End If
        Next ctl
        
        ' إغلاق وحفظ التعديلات
        DoCmd.Close acReport, doc.Name, acSaveYes
    Next doc
    
    ' تنظيف الذاكرة
    Set db = Nothing
    
    MsgBox "تم تطبيق الخط الجديد، الحجم، وارتفاع الصفوف على جميع النماذج والتقارير بنجاح!", vbInformation, "اكتملت العملية"
End Sub
2. طريقة تشغيل الآلية
أمامك خياران لتشغيل هذا الكود بناءً على رغبتك:

الخيار أ: التشغيل المباشر والسريع (لمرة واحدة)
وأنت داخل محرر الـ VBA وضمن الكود أعلاه، ضع مؤشر الماوس في أي مكان داخل الكود.

اضغط على زر F5 من لوحة المفاتيح أو اضغط على زر التشغيل الأخضر (Run) في الشريطة العلوية.

ستستغرق العملية ثوانٍ معدودة (تعتمد على حجم قاعدة البيانات)، ثم ستظهر لك رسالة النجاح.

الخيار ب: ربط الكود بزر أمر (للتحكم المستقبلي)
إذا كنت تريد إتاحة هذه الميزة للمستخدم أو لنفسك لتغيير الخطوط مستقبلاً عبر واجهة البرنامج:

قم بإنشاء نموذج جديد (Form) وسمِّه مثلاً "لوحة التحكم بالخطوط".

أضف زر أمر (Button).

في حدث "عند النقر" (On Click) الخاص بالزر، اختر [Event Procedure] واكتب:

VBA
Call ApplyGlobalFormatting
💡 نصائح هامة جداً قبل التشغيل:
خذ نسخة احتياطية: يرجى أخذ نسخة احتياطية من قاعدة البيانات قبل تشغيل الكود، لأن عمليات الـ VBA التي تقوم بحفظ النماذج تلقائياً لا يمكن التراجع عنها (Ctrl + Z).

وحدة قياس الارتفاع (Twips): الـ Access يتعامل مع ارتفاع الصفوف بوحدة قياس تُدعى Twip. (الـ 1 بوصة = 1440 تويت، والـ 1 سم = 567 تويت تقريباً). القيمة 450 الموجودة في الكود تعطي ارتفاعاً مناسباً ومريحاً للعين، ويمكنك زيادتها أو نقصها حسب رغبتك.

النماذج المفتوحة: تأكد من إغلاق جميع النماذج والتقارير قبل تشغيل الكود حتى لا يحدث تعارض أثناء محاولة الكود فتحها وتعديلها في وضع التصميم.

 

  • Like 1
قام بنشر

معذرة علي التأخير في الرد أخي الكريم

الكود طبقته وشغال بس المشكلة كلما اريد خط لازم ادخل علي الكود وغيره ثم ارجع للنموذج واشغل الكود

أنا محتاج كومبوبكسات تشتمل علي انواع الخطوط في الويندوز وكمبوبكس لارتفاع الصف وكمبوبكس لحجم الخط وانا اختار منهم 

  • Like 1
قام بنشر
4 ساعات مضت, 2saad said:

أنا محتاج كومبوبكسات تشتمل علي انواع الخطوط في الويندوز وكمبوبكس لارتفاع الصف وكمبوبكس لحجم الخط وانا اختار منهم 

قمت بالإستفادة من كود أحد الأمثلة في المنتدى وعدلت الإجراء ليعتمد على المعلمات بدل القيم الثابتة

ستجد في المرفق ملف يحتوي على نموذج ووحدة نمطية قم بإسترادهما إلى تطبيقك وفتج النموذج ستجد فيه مربعات لتحديد القيم المطلوبة وبالنقر على زر (تنفيذ الإجراء) يفترض أن يتم تعميم القيم المحددة

فيما يخص قيم (حجم الخط و الإرتفاع) قمت بتحديد القيم بالنطاق (من 7 الى 72) لحجم الخط لإن حجم أصغر من 7 أراه غير منطقي لأن النص سيصبح غير مقروء والرقم 72 هو الحد الأقصى لحجم الخط في أكسس ولست متأكداً من أنه يقبل رقم أعلى من 72 نفس الشيئ للإرتفاع فإرتفاع أقل من 4 ملم سيكون صغيرا جداً وإرتفاع أكبر من 1.4 سم سيكون كبيراً جداً ولكن في الأخير لك حرية تعديل القيم 

بصراحة أنا لم أجرب تنفيذ الأمر لذلك لا أدري إذا كانت ستظهر أي أخطاء فإذا ظهرت أي أخطاء يرجى إعلامنا بها

تحياتي

Fonts.accdb

  • Like 1
قام بنشر

ليس من عاداتك عدم رفع مثال للتطبيق

لو ارفقت مثالا يشتمل على جدول به بعض البيانات ... ونموذج مستمر وتقرير مصدرهما الجدول لكان افضل لك

قلت مستمر .. لأن الحاجة فيها فعلا وخاصة التقرير  من اجل احتواء البيانات

قام بنشر
2 ساعات مضت, ابوخليل said:

ليس من عاداتك عدم رفع مثال للتطبيق

لو ارفقت مثالا يشتمل على جدول به بعض البيانات ... ونموذج مستمر وتقرير مصدرهما الجدول لكان افضل لك

قلت مستمر .. لأن الحاجة فيها فعلا وخاصة التقرير  من اجل احتواء البيانات

عفواً أخي @ابوخليل أنا حبيت أسهل الأمر على الأخ صاحب الموضوع فقد قال أن الكود ناجح ولا يريد إلا هذه الإضافات فوضعتها له في مثال يحتوي الحد الأدنى التعديلات التي سيقوم بتنفيذها على تطبيقه لتجربتها

أما موضوع إحتواء البيانات في التقرير فلا أعتقد أن الكود له دخل بهذا الموضوع لانه سيقوم بتعديل حجم الخط بغض النظر عما إذا كان مناسباً أم لا أليس كذلك؟ 

 

قام بنشر
2 ساعات مضت, منتصر الانسي said:

أما موضوع إحتواء البيانات في التقرير فلا أعتقد أن الكود له دخل بهذا الموضوع لانه سيقوم بتعديل حجم الخط بغض النظر عما إذا كان مناسباً أم لا أليس كذلك؟ 

طلبي منه المثال من اجل اجعل نقل الفكرة الى مشروعه يسيرا

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

Const MY_FONT As String = "Arial"      ' اسم الخط
    Const MY_SIZE As Integer = 12          ' حجم الخط
    Const ROW_HEIGHT As Integer = 450      ' ارتفاع الصف (بالتويت Twips: كل 1 سم تقريباً 567 تويت)

 

قام بنشر (معدل)

مشاركة مع اساتذتي تفضل استاذ @2saad محاولتي حسب ما فهمت اليك الشرح والمرفق . ووافني بالرد:fff:

                                                                                   image.gif.d12fd7c3c47854f2ec984f4355c30eb9.gif

 

2saad_Font, size, and row height.rar

تم تعديل بواسطه kkhalifa1960
قام بنشر
16 ساعات مضت, ابوخليل said:

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

إسمح لي أخي @ابوخليل أن أوضح هذه النقطة

عندما يتم تعريف المتغيرات بالكلمة المفتاحية Const فإننا نقوم بتعريف قيمة ثابتة غير قابلة للتعديل إلا عن طريق الدخول إلى محرر VBE وتعديلها ولن نستطيع التعديل من النموذج سواء كانت متغيرات خاصة أو عامة

أما مسألة أني جعلتها معلمات للإجراء نفسه فذلك لجعله مختصراً وأكثر مرونة فلو إفترضنا أن المتغيرات كانت عامة على مستوى النموذج فعند إستدعاء الإجراء سنضطر إلى كتابة أمر الإستدعاء بالشكل التالي

MY_FONT = cboFonts
MY_SIZE = txtFontSize
ROW_HEIGHT = txtRowHeight * 567
Call ApplyGlobalFormatting

حيث أنا سنقوم أولاً بتعيين قيمة لكل متغير ثم إستدعاء الإجراء

أما عندما جعلنا المتغيرات كمعلمات للإجراء فإن أمر إستدعاء الإجراء أصبح بالشكل التالي

Call ApplyGlobalFormatting(cboFonts, txtFontSize, txtRowHeight * 567)

وأنا أطبق هذا الأسلوب دائماً لسهولته تخيل أننا نحتاج إلى إستدعاء إجراء أو دالة ما لأكثر من مرة وبمعلمات مختلفة فبدل أن نحتاج إلى 5 او 6 أسطر لكل إستدعاء سنكتفي بسطر واحد

في الأخير مهما إختلفت طرق الحل لكنها تؤدي إلى نفس النتيجة وكما يقول المثل كل الطرق تؤدي إلى روما  :frown3:

تحياتي

قام بنشر
2 ساعات مضت, منتصر الانسي said:

 

Call ApplyGlobalFormatting(cboFonts, txtFontSize, txtRowHeight * 567)

 

نعم استاذي هو ما تفضلت به

ولكن باستبعاد استخدام Api ودوشة 32 و 64  حتى لو اردنا عرض جميع خطوط النظام فمكتبة وورد تفي بالغرض

هذه الدالة  لوحدها تكفي على النحو التالي .. ولكن مسألة ارتفاع الحقل بحاجة الى اعادة نظر حسب تصوري لمراعاة مقطع التفصيل عند التصغير والتكبير

يعني اعتقد يجب ان يكون هناك توافق طردي بينهما

Sub ApplyGlobalFormatting(ByVal MyFont As String, ByVal MySize As Integer, ByVal RowHeight As Integer)
    Dim db As DAO.Database
    Dim doc As DAO.Document
    Dim frm As Form
    Dim rpt As Report
    Dim ctl As Control
     Set db = CurrentDb
     On Error Resume Next
        '----------------------------------------------------
        For Each doc In db.Containers("Forms").Documents
          DoCmd.OpenForm doc.Name, acDesign, , , , acHidden
        Set frm = Forms(doc.Name)
        For Each ctl In frm.Controls
         If ctl.ControlType = acTextBox Or ctl.ControlType = acComboBox Or ctl.ControlType = acListBox Or ctl.ControlType = acLabel Then
                ctl.FontName = MyFont
                ctl.FontSize = MySize
            End If
 ctl.Height = RowHeight
       Next ctl
        DoCmd.Close acForm, doc.Name, acSaveYes
    Next doc
    '-------------------------------------------------------
    For Each doc In db.Containers("Reports").Documents
          DoCmd.OpenReport doc.Name, acDesign, , , acHidden
        Set rpt = Reports(doc.Name)
           For Each ctl In rpt.Controls
            If ctl.ControlType = acTextBox Or ctl.ControlType = acComboBox Or ctl.ControlType = acLabel Then
                ctl.FontName = MyFont
                ctl.FontSize = MySize
            End If
        ctl.Height = RowHeight
        Next ctl
            DoCmd.Close acReport, doc.Name, acSaveYes
    Next doc
       Set db = Nothing
    End Sub
'----------------------------------------------------
Private Sub btnApply_Click()
     Call ApplyGlobalFormatting(Me.cmbFonts.Value, Me.txtSize.Value, Me.txtHeight.Value * 567)
    MsgBox "تم تطبيق التنسيقات بنجاح!", vbInformation
End Sub

 

قام بنشر
41 دقائق مضت, ابوخليل said:

 ولكن مسألة ارتفاع الحقل بحاجة الى اعادة نظر حسب تصوري لمراعاة مقطع التفصيل عند التصغير والتكبير

يعني اعتقد يجب ان يكون هناك توافق طردي بينهما

تم معالجة المسألة بحيلة ارجاع مقطع التفصيل الى = صفر

 rpt.Section(acDetail).Height = 0

المرفق ادناه تطبيق للكود اعلاه

تم ايقاف الاجراء الخاص بالتعديل على النموذج والاكتفاء بما يخص التقارير
استخدمت مكتبة وورد من اجل جلب جميع خطوط النظام

لذا نلاحظ بطأ قليلا عند فتح الفورم ... وعلاجه هو في عمل دالة خاصة يتم فيها انتقاء خطوط حسب الرغبة وقابلة للاضافة والحذف

xsaadx4.rar

  • Like 1
قام بنشر

شكرا لكم جميعا وبارك الله فيكم وأكثر الله من أمثالكم الخيرين

وأنا آسف علي التأخير في الرد لأني كنت مشغولا

انشئ حساب جديد او قم بتسجيل دخولك لتتمكن من اضافه تعليق جديد

يجب ان تكون عضوا لدينا لتتمكن من التعليق

انشئ حساب جديد

سجل حسابك الجديد لدينا في الموقع بمنتهي السهوله .

سجل حساب جديد

تسجيل دخول

هل تمتلك حساب بالفعل ؟ سجل دخولك من هنا.

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

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

Important Information