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

AbuuAhmed

الخبراء
  • Posts

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

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

  • Days Won

    17

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

  1. يبدو "بالنظر" أن الكود سليم. فقط استخدام "Is" زائدة لا داعي لها ولكنها لا تسبب خطأ. إن لم تستطع رفع مثال لتسهيل مهمة مقدمي الحلول فاكتب لنا رسالة الخطأ لنعرف ما هو الخطأ وكذلك لو تعطينا السطر الذي يقف عنده البرنامج بعد ظهور رسالة الخطأ. مجرد تخمين، أضف هذا السطر في حدث Form_Open Private Sub Form_Open(Cancel As Integer) Me.hh = Me.hh.Column(0, 0) End Sub
  2. كلام الزميل موسى صحيح، لا بد من التجارب. مع العلم أنه لا يوجد دالة between في الـ vba وعليه يمكن التعويض عنها كما مشاركة الزميل محمد لطفي. ويمكن كذلك تصميم الدالة كما التالي: Function Between(Value As Variant, MinVal As Variant, MaxVal As Variant) As Variant If VarType(Value) = VarType(MinVal) And _ VarType(Value) = VarType(MaxVal) Then Between = CBool(Value >= MinVal And Value <= MaxVal) Else Between = "Var type error" End If End Function ومناداتها كالتالي: If Between(4, 1, 10) then MsgBox "إجابة سليمة" End if
  3. عملت لك دالة vba لحساب أيام الإجازة لكل شهر جرب وأخبرني Option Explicit Function Between(Value As Date, MinVal As Date, MaxVal As Date) As Boolean Between = Value >= MinVal And Value <= MaxVal End Function Function GetVacDays(ByVal StartDate As Date, ByVal EndDate As Date, inMonth As Date) As Variant Dim MinVal As Date, MaxVal As Date Dim yy As Integer, mm As Byte yy = Year(inMonth) mm = Month(inMonth) MinVal = DateSerial(yy, mm + 0, 1) MaxVal = DateSerial(yy, mm + 1, 0) If Between(StartDate, MinVal, MaxVal) Or _ Between(EndDate, MinVal, MaxVal) Or _ Between(MinVal, StartDate, EndDate) Or _ Between(MaxVal, StartDate, EndDate) Then StartDate = IIf(StartDate > MinVal, StartDate, MinVal) EndDate = IIf(EndDate < MaxVal, EndDate, MaxVal) GetVacDays = CInt(EndDate - StartDate + 1) Else GetVacDays = "" End If End Function SL_Data_02.xlsm
  4. وجدت لك هذا الكود في النت: Private Declare Function AddFontResource Lib "gdi32.dll" Alias "AddFontResourceA" ( _ ByVal lpFileName As String) As Long Sub Test() Dim Result As Long Result = AddFontResource(CurrentProject.Path & "\Fonts\Fontname") MsgBox Result & " fonts added" End Sub لم أجربه، جربه واخبرنا.
  5. جرب الآن Database41_02.accdb
  6. بالفاصلة العادية: =IIf(Nz([Notes],0)>=5,"ينتقل",IIf(Nz([Notes],0)<4.5,"معيد","الاستدراك")) بالفاصلة المنقوطة: =IIf(Nz([Notes];0)>=5;"ينتقل";IIf(Nz([Notes];0)<4.5;"معيد";"الاستدراك")) لا تحاول تكتبها فقط قم بنسخ المعادلة ولصقها في مصدر الصندوق. ملاحظة: المعادلة تظهر وكأن كتابتها خاطئة ولكنه تأثير الخصائص، ولكن عند لصقها في مصدر الصندوق سوق تظهر بشكلها الطبيعي.
  7. سامحني أخي لم أستطع فتح قاعدة البيانات لأني أستخدم إصدار أكسس قديم. وموضوعك بسيط أي واحد من الزملاء يستطيع أن يحل موضوعك بسهولة. ولكن تحتاج أن تشرح مطلوبك من المعادلة فهي الحقيقة غير واضحة. كذلك تفسر المصطلحات المستخدمة في المعادلة: ينتقل: هل يقصد فيها النجاح والإنتقال إلى مركز أعلى؟ معيد: هل معيد أي له إعادة الإمتحان أو إعادة السنة؟ الاستدراك: هل هو فرصة إعادة الإمتحان أم يخضع لقانون "استرحام" أي يدفع بدرجات إضافية بدلا من درجات النقص؟ إشرح معادلتك أولا بشكل واضح وحدد لك مصطلح الرقم الذي تريده. مثل: ينتقل: أكبر من أو يساوي 5 معيد: أصغر من 4.5 الاستدراك أصغر من 5 أي (بين 4.5 و 4.99) وهكذا لتسهل على الزملاء مساعدتك بالشكل الصحيح وبأقصر وقت.
  8. لم توضح أين تريد وضع الأرقام انسخ المعادلة ثم عدل عليها، وإذا واجهت مشاكل من غير الأرقام فبدل الفاصلة بالفاصلة المنقوطة. هنا المعادلة مع الفاصلة العادية: =IIf([Notes]>4.99,"Yantaqil",IIf([Notes]<4.5,"Moied","Alistdrak")) وهنا المعادلة مع الفاصلة المنقوطة: =IIf([Notes]>4.99;"Yantaqil";IIf([Notes]<4.5;"Moied";"Alistdrak")) بدلت لك الكلمات من الحروف العربية إلى الحروف الإنجليزية حتى لا تلخبطك، بعد اللصق قم بتبديل الكلمات إلى الحروف العربية.
  9. إذا أردت التخلص من الأصفار لتسهيل القراءة والتركيز استخدم هذا التنسيق في صناديق الإحصاءات: #,##0;-#,##0;"";""
  10. حاول تجعل التاريخ ثابت الطول بضبط خاصية Format تنسيق التاريخ yyyy/mm/dd
  11. من هذه الخاصية يمكن معرفة حدوث تعديل على البيانات أو لا، ولكن أعتقد (كما أتذكر) أنها تعمل مع النماذج التي لها مصدر بيانات أو كما تسمونها كما أعتقد "مرتبطة". If Me.Dirty Then MsgBox "لقد تم التعديل على البيانات" End If
  12. ويمكن كتابة الدالة كالتالي: Function GetColor(Clr As Byte) As Long Select Case Clr Case 1: GetColor = vbBlue Case 2: GetColor = vbGreen Case 3: GetColor = vbYellow Case 4: GetColor = vbRed Case Else: GetColor = vbWhite End Select End Function أو هكذا: Function GetColor(ByVal Clr As Variant) As Long Select Case Nz(Clr, 0) Case 1: Clr = vbBlue Case 2: Clr = vbGreen Case 3: Clr = vbYellow Case 4: Clr = vbRed Case Else: Clr = vbWhite End Select GetColor = Clr End Function
  13. ويمكن اختصار الإجراءين كالتالي: Dim ctl As Control For Each ctl In Me.Controls ctl.Visible = ctl.ControlType <> acTextBox Next ctl Set ctl = Nothing Dim ctl As Control For Each ctl In Me.Controls ctl.Enabled = ctl.ControlType <> acTextBox Next ctl Set ctl = Nothing
  14. قد لا يشعر بعضكم بالتعديل في إضافة صناديق التسميات في قسم رأس الصفحة، عليه بفتح تقرير rptReport2 في طور التصميم وحذف كل صناديق التسميات في قسم رأس الصفحة ثم حفظه، ثم تشغيل الإجراء AddReportPageHeaderLabels وإعادة فتح التقرير لمشاهدة نتيجة إضافة الصناديق. للإستفادة الكاملة من حدث الإضافة ينصح بإضافة التسميات في الخاصية Tag لصناديق قسم التفاصيل . أما من لا يريد استخدام هذا الإجراء ويرغب في إضافة التسميات بنفسه فينصح: بإضافة أسماء صناديق قسم التفاصيل في خاصية ControlTipText لصناديق قسم رأس الصفحة. أما بالنسبة للتقرير rptReport1 فقم بفتحه في طور التصميم وانظر إلى بعثرة صناديق التسميات في قسم رأس الصفحة، ثم أعد فتحه في طور التشغيل لمشاهدة الصناديق وقد صفت بشكل منظم. أعتقد أن هذا حل احترافي ويحتاج إلى عناية من المنتدى وكذلك العناية من أعضاء المنتدى ممن يستوعبون فكرته وجدواه.
  15. موضوعك السابق لا يزال معلقا ويحتاج أن تنهيه وتعلق على الحل المقدم لك فيه.
  16. لإضافة التسميات لقسم رأس الصفحة للتقرير في طور التصميم لتنظيم التسميات لقسم رأس الصفحة للتقرير في طور التشغيل 'AbuuAhmed, Officena.net '2023/06/15 Sub AddReportPageHeaderLabels(rptName As String) Dim acr As Byte, acrs As Byte Dim col As Byte Dim rpt As Report Dim ctl As Control, lbl As Control Dim lblName As String 'لإضافة التسميات في قسم رأس الصفحة للتقارير متكررة الأعمدة في طور التصميم 'On Error Resume Next DoCmd.OpenReport rptName, acViewDesign, , , acHidden Set rpt = Reports(rptName) acrs = rpt.Printer.ItemsAcross With rpt.Section(acPageHeader) Do While .Controls.Count > 0 For Each ctl In .Controls Call DeleteReportControl(rptName, ctl.Name) Next ctl Loop For acr = 1 To acrs col = 0 For Each ctl In rpt.Section(acDetail).Controls col = col + 1 lblName = "col" & Format(col, "00") & Format(acr, "_00") Set lbl = CreateReportControl(rptName, acLabel, acPageHeader, , lblName) lbl.Name = lblName lbl.Caption = IIf(ctl.Tag = "", ctl.Name, ctl.Tag) lbl.ControlTipText = ctl.Name lbl.Left = ctl.Left lbl.Width = ctl.Width lbl.Top = lbl.Height * (acr - 1) lbl.TextAlign = 2 lbl.BorderStyle = 1 lbl.BackStyle = 1 lbl.BackColor = RGB(216, 216, 216) Next ctl Next acr .Height = 0 End With DoCmd.Close acReport, rptName, acSaveYes Set rpt = Nothing Set ctl = Nothing Set lbl = Nothing MsgBox "Done" End Sub Sub ReportOpen4PageHeader(rptName As String) Dim col As Byte, cols As Byte Dim acr As Byte, acrs As Byte Dim rpt As Report Dim ctl0 As Control, ctl1 As Control, ctl2 As Control 'لتنظيم التسميات في قسم رأس الصفحة للتقارير متكررة الأعمدة في طور التشغيل On Error Resume Next Set rpt = Reports(rptName) rpt.Printer.ItemLayout = acPRVerticalColumnLayout rpt.Printer.DefaultSize = False cols = rpt.Section(acDetail).Controls.Count acrs = rpt.Printer.ItemsAcross For Each ctl0 In rpt.Section(acPageHeader).Controls With rpt.Controls(ctl0.ControlTipText) ctl0.Left = .Left ctl0.Width = .Width End With Next ctl0 Set ctl0 = rpt("col" & Format(cols, "00") & "_01") rpt.Width = rpt.WindowWidth For acr = 2 To acrs For col = 1 To cols Set ctl1 = rpt("col" & Format(col, "00") & "_01") Set ctl2 = rpt("col" & Format(col, "00") & Format(acr, "_00")) With ctl2 .Left = ctl0.Left + ctl0.Width + IIf(col = 1, rpt.Printer.ColumnSpacing, 0) .Top = ctl1.Top '.Width = ctl1.Width .Height = ctl1.Height .BackColor = ctl1.BackColor .ForeColor = ctl1.ForeColor .BackStyle = ctl1.BackStyle .Caption = ctl1.Caption End With Set ctl0 = ctl2 Next col Next acr rpt.Width = 0 With rpt.Section(acPageHeader) .Height = 0 .Height = .Height + rpt("col01_01").Top End With Set rpt = Nothing Set ctl0 = Nothing Set ctl1 = Nothing Set ctl2 = Nothing End Sub حل للتقارير متعددة الأعمدة_01.accdb
  17. جرب هذا المثال وبه استعانة بالكود ويمكن عمل كود آخر أثناء التصميم لتكرار صناديق التسميات إذا أحببت. Private Sub Report_Open(Cancel As Integer) Dim col As Byte, cols As Byte Dim acr As Byte, acrs As Byte Dim ctl0 As Control, ctl1 As Control, ctl2 As Control On Error Resume Next Me.Printer.ItemLayout = acPRVerticalColumnLayout Me.Printer.DefaultSize = False cols = Me.Section(0).Controls.Count acrs = Me.Printer.ItemsAcross Set ctl0 = Me("col" & Format(cols, "00") & "_01") Me.Width = Me.WindowWidth For acr = 2 To acrs For col = 1 To cols Set ctl1 = Me("col" & Format(col, "00") & "_01") Set ctl2 = Me("col" & Format(col, "00") & Format(acr, "_00")) With ctl2 .Left = ctl0.Left + ctl0.Width + IIf(col = 1, Me.Printer.ColumnSpacing, 0) .Top = ctl1.Top .Width = ctl1.Width .Height = ctl1.Height .BackColor = ctl1.BackColor .ForeColor = ctl1.ForeColor .BackStyle = ctl1.BackStyle .Caption = ctl1.Caption End With Set ctl0 = ctl2 Next col Next acr Me.Width = 0 With Me.Section(3) .Height = 0 .Height = .Height + Me.col01_01.Top End With Set ctl0 = Nothing Set ctl1 = Nothing Set ctl2 = Nothing End Sub تكرار عنوان التقرير_02.accdb
  18. ويا أخ موسى الإشراف عندك هو حذف كل ما فيه انتقاد للمشرفين؟!!! دع التعليقات إذا لا يوجد بها سباب أو إساءات. ولعلمك هناك الكثير مما لا يقال أو يقال بشكل مباشر مثلا قد تتفاجأ أن ثلاثة معرفات في هذا الموضوع لشخص واحد، يعني ثلاثة في واحد. ولهم رابع لسى ما دخل على الموضوع 🙂
  19. إذا كان فهمي صحيح، فطلبك غير واضح بشكل كاف. أنا بدلت الشرط: [LastEdit]="..." إلى: [LastEdit]<="..." وإذا رأيت أن الفكرة مقولبة فعدل الشرط إلى: [LastEdit]>="..." سجل بجميع التعديلات_02.accdb
  20. ارفع مثال أفضل لكم ولنا 🙂 وخصوصا أن الكود طويل، لاحظت بعض الأخطاء وربما هي ليس أخطاء فارفع مثالك لنعرف السبب وإذا عرف السبب .....
  21. راجعت عمل الزميل دروب مبرمج، وأعجبني أنه أحتاج حقل واحد فقط وهو رقم المجموعة وهذا فيه توفير للمساحة. العمل ممتاز ولكن الزميل لم يلتفت لملاحظة السائل وائل طه والموضحة أعلاه. أما الكود فرأيت أن هذين السطرين لا يعملان، هل هما مطلوبان أم متروكان وتم نسيان أزالتهما؟: DoCmd.RunSQL "ALTER TABLE ]" & Tabel_Name & "] DROP COLUMN Str_Group" DoCmd.RunSQL "ALTER TABLE ]" & Tabel_Name & "] ADD Str_Group Number" أرفق لكم القاعدة لفكرتي فقط حتى لا تشتت الفاحص للمثال. مع ملاحة أني بدلت رقم السجل 4 إلى 400000 وحذف السجل الأخير لزوم التجارب. تقسيم مجموعات_أبو أحمد_03.mdb
  22. تعديل للكود السابق: Private Sub Command1_Click() Dim strDB As String On Error Resume Next Set appAccess = CreateObject("Access.Application") Err.Clear strDB = CurrentProject.Path & "\FolderN\" & Me.n_Folder & "\" & Me.program & ".accdb" appAccess.OpenCurrentDatabase strDB 'If Err.Number <> 0 Then If Err.Number = 7866 Then strDB = CurrentProject.Path & "\FolderN\" & Me.n_Folder & "\" & Me.program & ".mdb" appAccess.OpenCurrentDatabase strDB End If appAccess.DoCmd.OpenForm Me.form_open appAccess.Visible = True Set appAccess = Nothing End Sub
  23. طبعا دالة ترتيب السجل ثلاثة أرباعها أسطر زائدة، وذلك لأني بنيت الدالة على فكرة مختلفة ثم عدلت عنها في آخر الوقت ولم أقم بتنظيف الكود وتنقيحه. الدالة بعد التنقيح: Function GetSeq(ID As Long, Expr As String, Domain As String) As Long GetSeq = DCount(Expr, Domain, Expr & " <= " & ID) End Function سأقوم الليلة إن شاء الله بمراجعة مشاركة الزميل دروب مبرمج وأرجع لكم.
  24. جرب هذا الكود: Private Sub Command1_Click() Dim strDB As String strDB = CurrentProject.Path & "\FolderN\" & Me.n_Folder & "\" & Me.program & ".accdb" Set appAccess = CreateObject("Access.Application") appAccess.OpenCurrentDatabase strDB appAccess.DoCmd.OpenForm Me.form_open appAccess.Visible = True Set appAccess = Nothing End Sub
×
×
  • اضف...

Important Information