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

نجوم المشاركات

  1. محمد هشام.

    محمد هشام.

    الخبراء


    • نقاط

      30

    • Posts

      1749


  2. Foksh

    Foksh

    الخبراء


    • نقاط

      16

    • Posts

      3296


  3. عبدالله بشير عبدالله
  4. jjafferr

    jjafferr

    أوفيسنا


    • نقاط

      13

    • Posts

      9926


Popular Content

Showing content with the highest reputation since 05/02/25 in all areas

  1. وعليكم السلام 🙂 معظم قواعد البيانات عبارة عن جداول ، SQL Server او mySQL او ... ، وتستعمل برامج اخرى للواجهة مثل php او asp.NET او ... بينما الاكسس هو عبارة عن قاعدة بيانات تحتوي على الجداول (ونستخدم مصطلح BE عليها) ، و واجهة تحتوي على النماذج والاستعلامات والتقارير والوحدات النمطية (ونستخدم مصطلح FE عليها) ، فخلينا نفرق بينهم: قاعدة بيانات اكسس ، الجداول و الواجهة ، FE and BE: كان اقصى حجم للتخزين 2 جيجا ، بينما في الاوفيس M365 تم رفع الطاقة التخزينية الى 4 جيجا بشرط يكون الوندوز 64 بت (https://support.microsoft.com/en-us/office/what-s-new-in-access-for-microsoft-365-76454345-f85d-47af-ace1-98a456cb3496#:~:text=The 32-bit version of,when running complex Access applications.) Large Address Aware in Access The 32-bit version of Access for Microsoft 365 has been updated to be Large Address Aware (LAA). This increases the maximum address space available to Access from 2 GB to 4 GB when it is running on a 64-bit version of Windows. This is especially helpful when running complex Access applications. قاعدة بيانات اكسس ، الجداول، BE : نفس حجم قاعدة بيانات اكسس ، الجداول و الواجهة، FE and BE قاعدة بيانات اكسس ، الواجهة: يمكنك ربط FE بأي عدد من الجداول ، سواء SQL Server او mySQL او اكسس BE (2,048 للاكسس العادي، و 4,096 للاكسس M365)، بشرط ان لا يزيد حجم كل BE عن الحجم الذي تم توضيحه اعلاه. (https://support.microsoft.com/en-us/office/access-specifications-0cf3c66f-9cf2-4e32-9568-98c1025bb47c) 2 gigabytes, minus the space needed for system objects. Note: You can work around this size limitation by linking to tables in other Access databases. You can link to tables in multiple database files, each of which can be as large as 2GB. لم اواجه مشكلة في حجم 2 جيجا في اي من برامجي ، فاكبرها كان حجم البيانات حوالي 500 ميغا ، ولكن الصور المرتبطة (والتي تم تخزينها في مجلدات الوندوز) كان حجمها حوالي 2 تيرا . جعفر
    4 points
  2. وعليكم السلام ورحمة الله وبركاته أخي @ابو نبأ الأمر بسيط جدا وسأشرح لك خطوة بخطوة كيف تضيف شرطا جديدا (مثل: موقع التحميل في العمود k) إلى الكود بحيث يمكنك لاحقا تعديل أو إضافة أي شرط بنفس الطريقة 1) التحقق من أن العمود الجديد (k) ليس فارغا If Trim(WS.Cells(i, "M").Text) <> "" And _ Trim(WS.Cells(i, "L").Text) <> "" And _ Trim(WS.Cells(i, "K").Text) <> "" And _ <===== (موقع التحميل) العمود الجديد 2) تعديل المفتاح M ليشمل القيمة الجديدة m = Trim(WS.Cells(i, "M").Text) & "|" & Trim(WS.Cells(i, "L").Text) & "|" & Trim(WS.Cells(i, "K").Text) 3) تعديل إخراج البيانات المفككة من المفتاح f = Split(k, "|") a = d(k) dest.Cells(r, 1).Resize(1, 7).Value = Array(f(0), f(1), f(2), a(0), a(1), a(2), a(3)) 4) لا تنسى تعديل رؤوس الأعمدة في الصف الأول لتتناسب مع التغيير dest.Range("A1").Resize(1, 7).Value _ = Array("الشهر", "اسم الشركة", "الموقع", "عدد النقلات", "مجموع المبلغ للسائق", "مجموع مبلغ العقد", "مجموع الكمية (طن)") ليكون الكود النهائي بعد إظافة عمود موقع التحميل على الشكل التالي Option Explicit Sub TEST2() Dim dest As Worksheet, WS As Worksheet Dim m As String, a As Variant, k As Variant, f As Variant Dim d As Object: Set d = CreateObject("Scripting.Dictionary") Dim ShArr As Variant: ShArr = Array("aaa", "bbb") Dim i As Long, lr As Long, r As Long: r = 2 With Application .ScreenUpdating = False: .EnableEvents = False: .Calculation = xlCalculationManual On Error Resume Next Set dest = Sheets("تقرير مفصل") If dest Is Nothing Then Set dest = Sheets.Add dest.Name = "تقرير مفصل" Else With dest.Range("A:G") .ClearContents .Borders.LineStyle = xlNone End With End If On Error GoTo 0 dest.Range("A1").Resize(1, 7).Value _ = Array("الشهر", "اسم الشركة", "الموقع", "عدد النقلات", "مجموع المبلغ للسائق", "مجموع مبلغ العقد", "مجموع الكمية (طن)") For Each WS In Sheets(ShArr) If WS.AutoFilterMode Then WS.AutoFilterMode = False lr = WS.Cells(WS.Rows.Count, "M").End(xlUp).Row For i = 2 To lr If Trim(WS.Cells(i, "M").Text) <> "" And Trim(WS.Cells(i, "L").Text) <> "" And Trim(WS.Cells(i, "K").Text) <> "" Then m = Trim(WS.Cells(i, "M").Text) & "|" & Trim(WS.Cells(i, "L").Text) & "|" & Trim(WS.Cells(i, "K").Text) If Not d.exists(m) Then d(m) = Array(0, 0, 0, 0) d(m) = Array(d(m)(0) + 1, d(m)(1) + tmp(WS.Cells(i, "S").Value), d(m)(2) + tmp(WS.Cells(i, "U").Value), d(m)(3) + tmp(WS.Cells(i, "F").Value)) End If Next i Next WS For Each k In d.Keys f = Split(k, "|") a = d(k) dest.Cells(r, 1).Resize(1, 7).Value = Array(f(0), f(1), f(2), a(0), a(1), a(2), a(3)) r = r + 1 Next k Call ShFormat(dest, "A:G") .ScreenUpdating = True: .EnableEvents = True: .Calculation = xlCalculationAutomatic End With MsgBox "تم إعداد التقرير المفصل بنجاح", vbInformation End Sub "======================================= Private Function tmp(x As Variant) As Double tmp = IIf(IsNumeric(x), x, 0) End Function '======================================= Private Sub ShFormat(ByRef WS As Worksheet, ByVal Col As String) With WS .Activate Dim lastRow As Long lastRow = WS.Cells(WS.Rows.Count, "A").End(xlUp).Row With WS.Range("A1:G" & lastRow).Borders .LineStyle = xlDash: .Weight = xlThin: .ColorIndex = xlAutomatic End With .DisplayRightToLeft = True .Columns(Col).EntireColumn.AutoFit .Columns(Col).HorizontalAlignment = xlCenter .Columns(Col).VerticalAlignment = xlBottom .Range("E:G").NumberFormat = "0" End With End Sub ملاحظة : يمكنك تعطيل تنسيق الجدول النهائي بحذف أو تعليق هذا السطر أو تعديله ليشمل أعمدة أكثر إذا زادت الأعمدة لاحقا Call ShFormat(dest, "A:G") تقرير - حسب - الشهر - والشركة -الموقعV2 .xlsm
    4 points
  3. @محمد هشام. برجاء من كل الاخوة الكرام الي كل من يعرف الاخ محمد هشام او لا يعرفه الي كل من ساعده الاخ محمد هشام او لم يساعده ان يدعو له من كل قلبه و بخالص الدعوات ان يشقي ابنه الغالي واتمنى من الادمن المحترم انه يثبت البوست لفترة وشكرا علي قبول البوست
    3 points
  4. هذا البرنامج هو لحساب المواريث والوصايا بالاكسل يمكن تشغيله بالنقال الذكى ..او الحاسوب نسخة 2024 اعداد الفرضى المهندس خالد الطاهر حدادة عنوان البريد الإلكتروني khaledhadada47@gmail.com ليبيا الفرائض_الربانية_بالجداول_الالكترونية_2024.xlsx
    3 points
  5. تفضل أخي بناء على نفس الفكرة السابقة أرفق لك ملف يحتوي على كودين: الكود الأول: إنشاء مجلدات وملفات بصيغة xlsb للتجربة تم تعديل الكود بحيث يمكنك: 1) اختيار البارتيشن الذي تريد إنشاء الملفات فيه 2) تحديد عدد المجلدات التي سيتم إنشاؤها 3) تحديد عدد الملفات داخل كل مجلد حسب حاجتك الكود الثاني: تحويل جميع ملفات xlsb في البارتيشن المحدد الكود يقوم بـالبحث داخل البارتيشن الذي تحدده وتحويل جميع الملفات ذات الامتداد xlsb إلى صيغة أخرى xlsx داخل البارتشن المحدد حتى وإن كانت مخزنة داخل مجلدات فرعية متداخلة Option Explicit Sub Convertfiles() Dim dl As Object, n As String, ky As String Dim files() As String, i As Long, a As Long Dim startTime As Double, confirm As VbMsgBoxResult n = "F:\" ' لا تنسى تعديل إسم البارتيشن بما يناسبك confirm = MsgBox("سيتم تحويل جميع الملفات بصيغة xlsb إلى xlsx" & vbCrLf & _ "هل تريد المتابعة؟", vbYesNo + vbQuestion, n & " " & "محرك الأقراص") If confirm <> vbYes Then Exit Sub Set dl = CreateObject("Scripting.FileSystemObject") startTime = Timer SupApp True ky = tMps(dl, n) If Trim(ky) = "" Then MsgBox "xlsb" & " " & "لم يتم العثور على أي ملفات بصيغة ", vbInformation GoTo Cleanup End If files = Split(ky, vbCrLf) a = 0 For i = LBound(files) To UBound(files) If Trim(files(i)) <> "" Then If CntFiles(Trim(files(i)), dl) Then a = a + 1 End If End If Next i MsgBox "تم تحويل" & a & " ملف بنجاح" & vbCrLf & _ "استغرق التنفيذ " & Format(Timer - startTime, "0.00") & " ثانية", vbInformation Cleanup: SupApp False End Sub Function CntFiles(filePath As String, dl As Object) As Boolean Dim wb As Workbook Dim newPath As String On Error GoTo ClearApp Set wb = Workbooks.Open(filePath, ReadOnly:=False) newPath = Replace(filePath, ".xlsb", ".xlsx") wb.SaveAs fileName:=newPath, FileFormat:=xlOpenXMLWorkbook wb.Close SaveChanges:=False If dl.FileExists(newPath) Then dl.DeleteFile filePath, True CntFiles = True End If Exit Function ClearApp: CntFiles = False If Not wb Is Nothing Then wb.Close SaveChanges:=False End Function Function tMps(dl As Object, n As String) As String Dim root As Object, list As Collection, item As Variant, result As String On Error Resume Next Set root = dl.GetFolder(n) If root Is Nothing Then Exit Function On Error GoTo 0 Set list = New Collection Call ScanFiles(dl, root, list) For Each item In list result = result & item & vbCrLf Next item tMps = result End Function Sub ScanFiles(dl As Object, folder As Object, ByRef list As Collection) Dim file As Object, subFolder As Object, fName As String fName = LCase(folder.Path) If InStr(fName, "$recycle.bin") > 0 Then Exit Sub If InStr(fName, "system volume information") > 0 Then Exit Sub For Each file In folder.files If LCase(dl.GetExtensionName(file.Name)) = "xlsb" Then list.Add file.Path End If Next For Each subFolder In folder.SubFolders ScanFiles dl, subFolder, list Next End Sub TEST4.xlsm
    3 points
  6. اخي ريان نحاول المساعدة ولكنك لم تكلف نفسك بادراج ملف PDF الموجود لديك لنرى التصميم لديك ولا قاعدة بياناتك ( انت ادرجت لنا مرة اخرى قاعدة بيانات الاستاذ @kkhalifa1960 لنقل بيانات من الاكسس الى PDF : اولا يجب ان يكون لديك برنامج برنامج Adobe Acrobat Pro (وليس Adobe Reader فقط) او برنامج PDFtk ثانيا ملف PDF يجب ان يكون استمارة فردية اي لعرض بيانات فردية وليس نموذج مستمر كما ارفقت انت في مثال اخونا خليفة ثالثا تفعيل المرجع Adobe Acrobat xx.x Type Library (xx = رقم الإصدار مثل 10.0 أو 11.0) رابعا يجب أن يحتوي ملف الـ PDF على الحقول المسماة مثلا : وهذه يم اضافتها عن طريق البرامج المذكورة في اولا "Text1" "Dropdown2" "todaysDate" خامسا استخدام هذه الشيفرة اذا كان البرنامج المستخدم PDFtk ::::::::::::::::::::::::: Sub FillPDF() Dim tempFDF As String Dim pdfInput As String Dim pdfOutput As String Dim shellCmd As String Dim fso As Object Dim fdfContent As String Dim pdftkPath As String Dim appPath As String ' تحديد مسار البرنامج الحالي (نفس مجلد قاعدة البيانات أو ملف الإكسل) appPath = Application.CurrentProject.Path ' Access ' إذا كنت تستخدم Excel بدلاً من Access، استبدل بالسطر التالي: ' appPath = ThisWorkbook.Path ' تحديد مسار الملفات pdfInput = appPath & "\template.pdf" ' اسم ملف PDF بجانب الملف pdfOutput = appPath & "\output_filled.pdf" ' ملف الإخراج بجانب الملف tempFDF = appPath & "\temp_data.fdf" ' ملف FDF مؤقت ' مسار برنامج PDFtk pdftkPath = """C:\Program Files (x86)\PDFtk Server\bin\pdftk.exe""" ' تحضير محتوى FDF fdfContent = "%FDF-1.2" & vbCrLf fdfContent = fdfContent & "1 0 obj<</FDF<< /Fields[" & _ "<< /T (Text1) /V (" & Me.Text0.Value & ") >>" & _ "<< /T (Dropdown2) /V (" & Me.Text2.Value & ") >>" & _ "<< /T (todaysDate) /V (" & Me.Text4.Value & ") >>" & _ "] >> >>endobj" & vbCrLf fdfContent = fdfContent & "trailer<</Root 1 0 R>>" & vbCrLf fdfContent = fdfContent & "%%EOF" ' إنشاء ملف FDF Set fso = CreateObject("Scripting.FileSystemObject") With fso.CreateTextFile(tempFDF, True) .Write fdfContent .Close End With ' تنفيذ الأمر باستخدام PDFtk shellCmd = pdftkPath & " """ & pdfInput & """ fill_form """ & tempFDF & """ output """ & pdfOutput & """ flatten" Shell shellCmd, vbHide MsgBox "تم إنشاء الملف: " & pdfOutput End Sub سادسا استخدام هذه الشيفرة اذا كان البرنامج المستخدم Adobe Acrobat Pro ::::::::::::::::::::::::: Dim AcroApp As Acrobat.CAcroApp Dim theForm As Acrobat.CAcroPDDoc Dim jso As Object Dim path As String Dim field As Object Dim Text1, Dropdown2, todaysDate As String Dim Text0, Text2, Text4 As String Set AcroApp = CreateObject("AcroExch.App") Set theForm = CreateObject("AcroExch.PDDoc") theForm.Open (Me.Label16.Caption) Set jso = theForm.GetJSObject 'write the values to corresponding pdf fields jso.getfield("Text1").Value = Me.Text0.Value jso.getfield("Dropdown2").Value = Me.Text2.Value jso.getfield("todaysDate").Value = Me.Text4.Value theForm.Save PDSaveIncremental, Me.Label16.Caption theForm.Close AcroApp.Exit Set AcroApp = Nothing Set theForm = Nothing سابعا ::: انا دوري انتهى هنا بارك الله فيك
    3 points
  7. تحديث المرفق التحديث الجديد يحتوى على عدم الاعتماد على وسيط بانشاء ملف فى مسار محدد لتمرير اومر الاعدادات ثم حذفه بعد تمرريرها وتطبيقها وتم ذلك فى الداله : LoadInstalledKeyboards فى النموذج : frmLanguageFormatSetting ملاحظة هامة احيانا يتم اضافة تخطيط لغات بشكل وهمى لاعدادت الويندوز فى شريط المهام بجوار الساعه فقط عند فتح احد قواعد البيانات من خلال فتح النموذج : frmLanguageFormatSetting قم باختيار نفس التخطيط للبلد وعدد المفاتيح الذى تم اضافته فى تخطيط لغات لوحات المفاتيح فى شريط المهام من خلال مربع التحرير والسرد الخاص بـ اختيار : لغة اعداد النظام ومن خلال مربع التحرير والسرد الخاص بـ نوع لوحة المفاتيح وطبعا لا تنسي اختيار تنسيق الوقت والتاريخ الى ترغب به ثم قم بعمل تحديث الاعدادات سوف تظهر تخطيطات كل اللغات المستخدمه للوحات المفاتيح فى الجهة اليسرى من النموذج داخل مربع قائمة القيم اختر اللغة التى تريد حذف التخطيط الخاص بها بها وتأكد من عدم اختيار اكثر من تخطيط لانه معد لاختيار متعدد ثم بعد ذلك قم بالضغط على زر الامر " حذف التخطيط ولغة لوحة المفاتيح " لتنهى مشكله تعدد تخطيطات لغات المفاتيح لاكثر من لغة بدون اعادة تشغيل نظام التشغيل LanguageCheck V3.0.2.zip
    2 points
  8. اسمحوا لي بمداخلة صغيرة . أخي الريم عند اضافة أكواد إلى مشاركتك أو أي موضوع لك لاحقاً ، حاول استخدام إشارى <> المخصصة لكتابة أو لصق الأكواد فيه . أما بخصوص هذه المشكلة عند المسميات العربية والتي لا ننصح بها دائماً في برمجة VBA هي :- لاحظ الرموز التي نتجت عند نسخك للكود في الوقت الذي كانت فيه لغة الكيبورد = English في كمبيوترك !! بينما لاحقاً ومستقبلاً عند نسخ أي كود من محرر الأكواد وكان الكود يحتوي مسميات عربية ، حاول تغيير لغة الكتابة الى العربية قبل النسخ واللصق . كل الإحترام والتقدير للأساتذة وخبراء ومعلمي قسم الآكسل . فلا أتعدى ولا أنقص من مجهودكم بقدر ما لفت انتباهي تكرار هذه النقطة عند الكثيرين من الأخوة أصحاب الطلبات بما يخص هذه المشكلة CE??EC??E .
    2 points
  9. اللهم ربّ الناس ، أذهب البأس ، واشفِ أنت الشافي ، لا شفاء إلا شفاؤك ، شفاءً لا يغادر سقمًا . اللهم اشفِ نجل الأخ محمد هشام شفاءً تاماً عاجلاً ، اللهم ألبسه ثوب الصحة والعافية ، وردّه إلى أهله سالماً معافى يا أرحم الراحمين . اللهم اجعل مرضه طهوراً له ، وكفّارةً لذنوبه ، وسبباً لرفع درجته ، وفرّج عن والديه وأهله ، إنك على كل شيء قدير 🤲🏻
    2 points
  10. وعليكم السلام ورحمة الله تعالى وبركاته 1) الصور التي أرفقتها توضح أن ملفك يحتوي على روابط خارجية وهي تشير إلى بيانات في ملفات أخرى عند فتح الملف يحاول تحديث هذه الروابط تلقائيا وإذا لم يجد الملفات المرتبطة أو كانت غير متاحة تظهر هذه الرسائل التحذيرية يمكنك استخدام Break Link لكسر الرابط نهائيا لتفادي ظهورها مجددا 2) مجرد اقتراح الأكواد مكررة بشكل كبير يمكن استبدالها بوظيفة واحدة تقبل اسم المنطقة كمتغير بدلا من 36 ماكرو منفصل Sub filtrage(arrName As String, names As String) On Error GoTo ClearApp If ActiveSheet.AutoFilterMode = False Then Range("A1").AutoFilter ActiveSheet.Range("A1").AutoFilter Field:=1, Criteria1:="=" & arrName, Operator:=xlOr, Criteria2:="=الاجمالى" Range("B5").Value = names Range("A3").Select Exit Sub ClearApp: End Sub ثم تستدعيها مثلا بهذا الشكل Sub صندوق_التمويل() Call filtrage("صندوق التمويل", "صندوق التمويل") End Sub جرب هدا بعد كسر الإرتباطات وتنظيم الأكواد مرتبات لسنة 2025.xls
    2 points
  11. أسأل الله العظيم رب العرش العظيم أن يشفيه شفاء لا يغادر سقما آمين وجميع مرضى المسلمين
    2 points
  12. وعليكم السلام ورحمة الله تعالى وبركاته جرب هدا هل يناسبك Option Explicit Sub FilterByNames() Dim WS As Worksheet, arr(), i&, n&, filterRange As Range Set WS = Sheets("Sheet1") If WS.AutoFilterMode Then WS.AutoFilterMode = False n = WS.Cells(WS.Rows.Count, "I").End(xlUp).Row If n < 2 Then Exit Sub ReDim arr(1 To n - 1) For i = 2 To n arr(i - 1) = WS.Cells(i, "I").Value Next i Set filterRange = WS.Range("B6").CurrentRegion With filterRange .AutoFilter Field:=2, Criteria1:=arr, Operator:=xlFilterValues End With End Sub
    2 points
  13. تم تعديل الكود ............................ Dim db As DAO.Database Dim rsA As DAO.Recordset, rsB As DAO.Recordset Dim rsRooms As DAO.Recordset, rsDays As DAO.Recordset, rsTarget As DAO.Recordset Dim supervisionDate As Date, roomName As String Dim teacherAssignedA As Boolean, teacherAssignedB As Boolean Dim dayKey As String Dim safeName As String Dim teacherName As String On Error GoTo ErrorHandler Set db = CurrentDb() ' 1. التهيئة: مسح الجدول وتصفير العدادات db.Execute "UPDATE Teachers SET SupervisionCount = 0" db.Execute "DELETE FROM TeacherAssignment" ' 2. التحقق من توفر عدد كافٍ من المعلمين Dim totalSupervisionsNeeded As Long Dim availableA As Long, availableB As Long Dim daysCount As Long, roomsCount As Long daysCount = DCount("*", "SupervisionDays") roomsCount = DCount("*", "ExamRooms") totalSupervisionsNeeded = daysCount * roomsCount ' معلم A ومعلم B لكل قاعة ' حساب المعلمين المتاحين مع مراعاة جميع شروط الاستثناء availableA = DCount("*", "Teachers", "TeacherCategory = 'A' " & _ "AND (ExamDate Is Null OR ExamDate Not In (SELECT SupervisionDate FROM SupervisionDays)) " & _ "AND (CorrectionCommittee Is Null OR CorrectionCommittee = '')") availableB = DCount("*", "Teachers", "TeacherCategory = 'B' " & _ "AND (ExamDate Is Null OR ExamDate Not In (SELECT SupervisionDate FROM SupervisionDays)) " & _ "AND (CorrectionCommittee Is Null OR CorrectionCommittee = '')") If availableA < totalSupervisionsNeeded Or availableB < totalSupervisionsNeeded Then Dim response As VbMsgBoxResult response = MsgBox("تحذير: عدد المعلمين غير كافي!" & vbCrLf & _ "المطلوب: " & totalSupervisionsNeeded & " معلم A و " & totalSupervisionsNeeded & " معلم B" & vbCrLf & _ "المتاح: " & availableA & " معلم A و " & availableB & " معلم B" & vbCrLf & _ "هل تريد المتابعة مع وضع 'غير مغطاة' للقاعات غير المكتملة؟", _ vbYesNo + vbExclamation, "تنبيه") If response = vbNo Then MsgBox "تم إلغاء التوزيع بناءً على طلبك.", vbInformation Exit Sub End If End If ' 3. بدء عملية التوزيع Set rsDays = db.OpenRecordset("SELECT * FROM SupervisionDays ORDER BY SupervisionDate", dbOpenDynaset) Set rsRooms = db.OpenRecordset("SELECT * FROM ExamRooms ORDER BY RoomName", dbOpenDynaset) Set rsTarget = db.OpenRecordset("TeacherAssignment") ' إنشاء قاموس لتتبع المعلمين في كل يوم على حدة Dim dailyTeachers As Object Set dailyTeachers = CreateObject("Scripting.Dictionary") ' حلقة على كل الأيام Do While Not rsDays.EOF supervisionDate = rsDays!supervisionDate ' تهيئة القاموس لهذا اليوم فقط (ليسمح بالتكرار في الأيام الأخرى) dailyTeachers.RemoveAll ' حلقة على كل القاعات rsRooms.MoveFirst Do While Not rsRooms.EOF roomName = rsRooms!roomName teacherAssignedA = False teacherAssignedB = False ' تعيين معلم فئة A Set rsA = db.OpenRecordset("SELECT * FROM Teachers WHERE TeacherCategory='A' " & _ "AND (ExamDate Is Null OR ExamDate <> #" & Format(supervisionDate, "mm/dd/yyyy") & "#) " & _ "AND (CorrectionCommittee Is Null OR CorrectionCommittee = '') " & _ "ORDER BY SupervisionCount ASC", dbOpenDynaset) If Not rsA.EOF Then rsA.MoveFirst Do Until rsA.EOF Or teacherAssignedA teacherName = rsA![teacherName] If Not dailyTeachers.Exists(teacherName) Then ' تعيين المعلم A rsTarget.AddNew rsTarget!teacherName = teacherName rsTarget!TeacherCategory = "A" rsTarget!ExamRoom = roomName rsTarget!supervisionDate = supervisionDate rsTarget.Update ' تحديث العداد safeName = Replace(teacherName, "'", "''") db.Execute "UPDATE Teachers SET SupervisionCount = SupervisionCount + 1 WHERE [TeacherName] = '" & safeName & "'" ' إضافة المعلم للقاموس اليومي فقط dailyTeachers.Add teacherName, 1 teacherAssignedA = True End If rsA.MoveNext Loop End If rsA.Close ' إذا لم يتم تعيين معلم A، تسجيل "غير مغطاة" If Not teacherAssignedA Then rsTarget.AddNew rsTarget!teacherName = "غير مغطاة" rsTarget!TeacherCategory = "A" rsTarget!ExamRoom = roomName rsTarget!supervisionDate = supervisionDate rsTarget.Update End If ' تعيين معلم فئة B Set rsB = db.OpenRecordset("SELECT * FROM Teachers WHERE TeacherCategory='B' " & _ "AND (ExamDate Is Null OR ExamDate <> #" & Format(supervisionDate, "mm/dd/yyyy") & "#) " & _ "AND (CorrectionCommittee Is Null OR CorrectionCommittee = '') " & _ "ORDER BY SupervisionCount ASC", dbOpenDynaset) If Not rsB.EOF Then rsB.MoveFirst Do Until rsB.EOF Or teacherAssignedB teacherName = rsB![teacherName] If Not dailyTeachers.Exists(teacherName) Then ' تعيين المعلم B rsTarget.AddNew rsTarget!teacherName = teacherName rsTarget!TeacherCategory = "B" rsTarget!ExamRoom = roomName rsTarget!supervisionDate = supervisionDate rsTarget.Update ' تحديث العداد safeName = Replace(teacherName, "'", "''") db.Execute "UPDATE Teachers SET SupervisionCount = SupervisionCount + 1 WHERE [TeacherName] = '" & safeName & "'" ' إضافة المعلم للقاموس اليومي فقط dailyTeachers.Add teacherName, 1 teacherAssignedB = True End If rsB.MoveNext Loop End If rsB.Close ' إذا لم يتم تعيين معلم B، تسجيل "غير مغطاة" If Not teacherAssignedB Then rsTarget.AddNew rsTarget!teacherName = "غير مغطاة" rsTarget!TeacherCategory = "B" rsTarget!ExamRoom = roomName rsTarget!supervisionDate = supervisionDate rsTarget.Update End If rsRooms.MoveNext Loop rsDays.MoveNext Loop ' 4. التنظيف وإغلاق الموارد rsTarget.Close rsRooms.Close rsDays.Close Set rsTarget = Nothing Set rsRooms = Nothing Set rsDays = Nothing Set rsA = Nothing Set rsB = Nothing Set db = Nothing Set dailyTeachers = Nothing MsgBox "تم الانتهاء من التوزيع بنجاح!" & vbCrLf & _ "تم تعيين معلم A ومعلم B لكل قاعة" & vbCrLf & _ "مع مراعاة الشروط التالية:" & vbCrLf & _ "- عدم تكرار المعلم في نفس اليوم" & vbCrLf & _ "- السماح بتكرار المعلم في أيام مختلفة" & vbCrLf & _ "- استثناء المعلمين الذين لديهم اختبار في نفس اليوم" & vbCrLf & _ "- استثناء المعلمين في لجان التصحيح" & vbCrLf & _ "- العدالة في التوزيع حسب عدد المراقبات السابقة", _ vbInformation, "إنجاز" Exit Sub ErrorHandler: MsgBox "حدث خطأ أثناء التنفيذ: " & vbCrLf & _ "رقم الخطأ: " & Err.Number & vbCrLf & _ "الوصف: " & Err.Description & vbCrLf & _ "في الإجراء: " & Erl, vbCritical, "خطأ" Resume Next اكتب اي عبارة حتى لو رقم المهم الا يكون الحقل فارغ ......
    2 points
  14. لو سألت لماذا الالوات في موضوعك السابق تعمل وعندما نقلت الكود الى ملفك الاصلي لا تعمل لابد ان هناك شئ تغير في موصوعك السابق في شيت معلمين كود الاستاذ محمد هشام الخاص بالتلوين حماية الشيت غير مفعلة وعتدما تقلت الكود الى الملف الاصلى قمت بتفعيل الحماية فمن الطبيعى ان الكود لا يعمل في وجود حماية وستبقى الالوان قي كل الصفحات منساوية الغ الحماية من شيت معلمين في حدث الورقة وستجد الالوان بالتسبة لسرعة الكود جهازي مواصفاته متوسطة الى جيدة استغرق 6 ثواني لك كل التقدير والاحترام
    2 points
  15. أظن أن الأمر ليس بالصعب يمكننا تعديل الكود ليتناسب مع طلبك بحيث يقوم بحدف الملفات سواءا بداخل البارتيشن المحدد مباشرة أو بداخل الملفات الفرعية بما أنه من الصعب تجربة الكود على الملفات الخاصة بي قمت بإنشاء بارتيشن إظافي بإسم F فقط للتجربة يمكنك تغييره بداخل الكود على حسب احتياجاتك مع إظافة كود لإنشاء ملفات بصيغة XLSB للتجربة عليها كما في المثال التالي TEST3.xlsm
    2 points
  16. جرب تبحث هنا 🙂 : https://arbfonts.com/naskh-arabic-fonts/page/15?preview=الجمهورية+الجزائرية
    2 points
  17. جزاكم الله خير الجزاء على دعواتكم الصادقة لابني بالشفاء وأشكر كل من سأل ودعا من القلب فدعاؤكم كان له أثر كبير في رفع معنوياتنا وتخفيف ألمنا أسأل الله أن يكتب لكم الأجر ويجزيكم خيرا اللهم لك الحمد على نعمة الأحبة والأصدقاء الصادقين الذين لم ينسونني من دعواتهم شكرا لكم جميعا وأسأل الله لكم دوام الصحة والعافية وأن لا يريكم مكروها فيمن تحبون
    2 points
  18. ادن لنجرب طريقة أخرى Option Explicit Sub Testxlsb() Dim xPath As String, n As Double Dim startTime As Double, xList As String Dim sCount As Long, confirm As VbMsgBoxResult xPath = "D:\" xList = "" With Application .ScreenUpdating = False: .EnableEvents = False: .Calculation = xlCalculationManual startTime = Timer tmps xPath, xList If xList = "" Then MsgBox "لم يتم العثور على أي ملفات بامتداد xlsb في " & xPath Else sCount = UBound(Split(Trim(xList), vbCrLf)) confirm = MsgBox("تم العثور على " & sCount & " ملف بامتداد xlsb " & vbCrLf & _ "هل تريد حدفها ونقلها إلى مجلد الملفات المحدوفة ؟", vbYesNo + vbQuestion) If confirm = vbYes Then tbl xPath, xList Snames xList MsgBox "تم الحذف وحفظ أسماء الملفات في C:\الملفات المحدوفة\filName.txt" Else MsgBox "تم إلغاء العملية لم يتم حذف أي ملفات" End If End If .ScreenUpdating = True: .Calculation = xlCalculationAutomatic End With n = Timer - startTime MsgBox "تم تنفيذ العملية في: " & Format(n, "0.00") & " ثانية" End Sub Sub tmps(ByVal xPath As String, ByRef xList As String) Dim fso As Object, Folder As Object, file As Object, sFiles As Object Set fso = CreateObject("Scripting.FileSystemObject") On Error Resume Next Set Folder = fso.GetFolder(xPath) If Folder Is Nothing Then Exit Sub On Error GoTo 0 If Not Folder Is Nothing Then On Error Resume Next For Each file In Folder.Files If (file.Attributes And 2) = 0 And (file.Attributes And 4) = 0 Then If LCase(fso.GetExtensionName(file.Name)) = "xlsb" Then xList = xList & file.Path & vbCrLf End If End If Next On Error GoTo 0 On Error Resume Next For Each sFiles In Folder.sFiless tmps sFiles.Path, xList Next On Error GoTo 0 End If End Sub Sub tbl(ByVal xPath As String, ByRef xList As String) Dim fso As Object, Folder As Object, file As Object, sFiles As Object Dim CntFile As String, r As String, ky As Integer CntFile = "C:\الملفات المحدوفة\DeletedXLSB\" Set fso = CreateObject("Scripting.FileSystemObject") If Not fso.FolderExists("C:\الملفات المحدوفة\") Then fso.CreateFolder ("C:\الملفات المحدوفة\") If Not fso.FolderExists(CntFile) Then fso.CreateFolder (CntFile) On Error Resume Next Set Folder = fso.GetFolder(xPath) If Folder Is Nothing Then Exit Sub On Error GoTo 0 On Error Resume Next For Each file In Folder.Files If Err.Number = 0 Then If (file.Attributes And 2) = 0 And (file.Attributes And 4) = 0 Then If LCase(fso.GetExtensionName(file.Name)) = "xlsb" Then r = CntFile & fso.GetFileName(file.Path) ky = 1 While fso.FileExists(r) r = CntFile & "Copy_" & ky & "_" & fso.GetFileName(file.Path) ky = ky + 1 Wend file.Move r End If End If End If Err.Clear Next For Each sFiles In Folder.sFiless tbl sFiles.Path, xList Next On Error GoTo 0 End Sub Sub Snames(xList As String) Dim fileNum As Integer fileNum = FreeFile On Error Resume Next Open "C:\الملفات المحدوفة\filName.txt" For Output As #fileNum Print #fileNum, xList Close #fileNum On Error GoTo 0 End Sub TEST2.xlsm
    2 points
  19. السلام عليكم اخى محمد نعم اريد حذف ملفات الاكسيل ذات الامتداد .xlsb من دريف معين حاول كتابة الكود وسنرى مع التجربة كيف نتلافى البطء ان شاء الله
    2 points
  20. بالنسبة للعربية انظر الصورة لتعديل اسماء التسمية التوضيحية للحقول بالنسبة للعدالة طبعا تقريبية اضف الحقل SupervisionCount في الجدول Teachers نمواصفت ( رقم - القيمة الافتراضية 0 ) ثم استخدم الكود التالي في زر التوزيع Dim db As DAO.Database Dim rsA As DAO.Recordset, rsB As DAO.Recordset Dim rsRooms As DAO.Recordset, rsDays As DAO.Recordset, rsTarget As DAO.Recordset Dim supervisionDate As Date, roomName As String Set db = CurrentDb() ' ? تمهيد: مسح الجدول وتصفير العدادات db.Execute "UPDATE Teachers SET SupervisionCount = 0" db.Execute "DELETE FROM TeacherAssignment" Set rsDays = db.OpenRecordset("SELECT * FROM SupervisionDays ORDER BY SupervisionDate", dbOpenDynaset) Set rsRooms = db.OpenRecordset("SELECT * FROM ExamRooms ORDER BY RoomName", dbOpenDynaset) Set rsTarget = db.OpenRecordset("TeacherAssignment") ' ? تحقق من توفر عدد كافٍ من المعلمين Dim totalSupervisionsNeeded As Long Dim availableA As Long, availableB As Long totalSupervisionsNeeded = DCount("*", "SupervisionDays") * DCount("*", "ExamRooms") availableA = DCount("*", "Teachers", "TeacherCategory = 'A' AND (ExamDate Is Null OR ExamDate Not In (SELECT SupervisionDate FROM SupervisionDays)) AND (CorrectionCommittee Is Null OR CorrectionCommittee = '')") availableB = DCount("*", "Teachers", "TeacherCategory = 'B' AND (ExamDate Is Null OR ExamDate Not In (SELECT SupervisionDate FROM SupervisionDays)) AND (CorrectionCommittee Is Null OR CorrectionCommittee = '')") If availableA < totalSupervisionsNeeded Or availableB < totalSupervisionsNeeded Then Dim response As VbMsgBoxResult response = MsgBox("عدد المعلمين المتاحين قد لا يكون كافياً لتغطية جميع القاعات في جميع الأيام." & vbCrLf & _ "هل ترغب في المتابعة مع ذلك؟", vbYesNo + vbQuestion, "تأكيد التوزيع") If response = vbNo Then MsgBox "تم إلغاء عملية التوزيع بناءً على طلب المستخدم.", vbInformation Exit Sub End If End If ' ?? بدء التوزيع Dim usedA As Collection: Set usedA = New Collection Dim usedB As Collection: Set usedB = New Collection Do While Not rsDays.EOF supervisionDate = rsDays!supervisionDate rsRooms.MoveFirst Do While Not rsRooms.EOF roomName = rsRooms!roomName ' معلم فئة A Set rsA = db.OpenRecordset("SELECT * FROM Teachers WHERE TeacherCategory='A' AND (CorrectionCommittee Is Null OR CorrectionCommittee='') ORDER BY SupervisionCount ASC", dbOpenSnapshot) rsA.MoveFirst Do While Not rsA.EOF If Not InCollection(usedA, rsA!TeacherName & "#" & supervisionDate) And (IsNull(rsA!ExamDate) Or rsA!ExamDate <> supervisionDate) Then rsTarget.AddNew rsTarget!TeacherName = rsA!TeacherName rsTarget!TeacherCategory = rsA!TeacherCategory rsTarget!ExamRoom = roomName rsTarget!supervisionDate = supervisionDate rsTarget.Update On Error Resume Next usedA.Add rsA!TeacherName, rsA!TeacherName & "#" & supervisionDate Err.Clear: On Error GoTo 0 db.Execute "UPDATE Teachers SET SupervisionCount = SupervisionCount + 1 WHERE TeacherName = '" & rsA!TeacherName & "'" Exit Do End If rsA.MoveNext Loop ' معلم فئة B Set rsB = db.OpenRecordset("SELECT * FROM Teachers WHERE TeacherCategory='B' AND (CorrectionCommittee Is Null OR CorrectionCommittee='') ORDER BY SupervisionCount ASC", dbOpenSnapshot) rsB.MoveFirst Do While Not rsB.EOF If Not InCollection(usedB, rsB!TeacherName & "#" & supervisionDate) And (IsNull(rsB!ExamDate) Or rsB!ExamDate <> supervisionDate) Then rsTarget.AddNew rsTarget!TeacherName = rsB!TeacherName rsTarget!TeacherCategory = rsB!TeacherCategory rsTarget!ExamRoom = roomName rsTarget!supervisionDate = supervisionDate rsTarget.Update On Error Resume Next usedB.Add rsB!TeacherName, rsB!TeacherName & "#" & supervisionDate Err.Clear: On Error GoTo 0 db.Execute "UPDATE Teachers SET SupervisionCount = SupervisionCount + 1 WHERE TeacherName = '" & rsB!TeacherName & "'" Exit Do End If rsB.MoveNext Loop rsRooms.MoveNext Loop rsDays.MoveNext Loop rsTarget.Close: rsA.Close: rsB.Close: rsRooms.Close: rsDays.Close Set rsTarget = Nothing: Set rsA = Nothing: Set rsB = Nothing Set rsRooms = Nothing: Set rsDays = Nothing: Set db = Nothing MsgBox "تم توزيع المعلمين بعد تحقق العدالة وشروط الاستبعاد!"
    2 points
  21. مشاركة مع اخي جعفر نصيحة مجرب : ريح راسك واكتب العناوين عادية في التقرير .. اقوى وأحكم الصورة ندرجها عادة من اجل اطار متميز .. او خلفية خاصة .. ولكنها حرة لا علاقة لها بالبيانات
    2 points
  22. الأخ الفاضل @kkhalifa1960 والأخ الفاضل @jjafferr جزاكم الله كل الخير على الرد والاهتمام بموضوعي كلتا الاجابتين تؤديان المطلوب اجابة الأخ @kkhalifa1960 فيها بعض التوسعة والاضافات الجيدة مرة أخرى من القلب أصدق عبارات الشكر والإمتنان و جزاكما الله خيرا و ربي يبارك في هذا المنتدى الرائع ان شاء الله
    2 points
  23. Option Explicit Option Compare Text Sub FilterContractorData() Dim CrWS As Worksheet, dest As Worksheet, c As Long, OnRng, ColArr, a(1 To 4) Const tmp1 = 3, tmp2 = 4, colDate = 1 Dim col As Range, dataRng As Range, lastCol As Long: lastCol = 25 Set CrWS = Sheets("يومية المقاولين") Set dest = Sheets("تقرير تفصيلى") Dim lastRow As Long: lastRow = dest.Rows.Count With Application .ScreenUpdating = False: .Calculation = xlCalculationManual With dest .Range("A11:Y" & lastRow).ClearContents .Range("A11:Y" & lastRow).Borders.LineStyle = xlNone End With OnRng = CrWS.Range("B8:Y" & CrWS.Cells(CrWS.Rows.Count, "B").End(xlUp).Row).Value a(1) = dest.[D3].Value: a(2) = dest.[E3].Value a(3) = dest.[C6].Value: a(4) = dest.[D6].Value ColArr = FiltreTbl(OnRng, a, tmp1, tmp2, colDate, _ Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24)) If Not IsEmpty(ColArr) Then dest.Range("B11").Resize(UBound(ColArr), UBound(ColArr, 2)).Value = ColArr With dest.Range("A11:A" & dest.Cells(dest.Rows.Count, "B").End(xlUp).Row) .Value = Evaluate("ROW(" & .Address & ")-10") End With Call ShFormat(dest, "A:Y") Set dataRng = dest.Range("A11:Y" & lastRow) For c = 1 To lastCol If Application.WorksheetFunction.CountA(dest.Range(dest.Cells(11, c), dest.Cells(lastRow, c))) = 0 Then dest.Columns(c).Hidden = True Else dest.Columns(c).Hidden = False End If Next c Else MsgBox "لا توجد بيانات تطابق الشروط المحددة", vbExclamation End If .ScreenUpdating = True: .Calculation = xlCalculationAutomatic End With End Sub v3-عمالة نظام 2025_2026.xlsm
    2 points
  24. تفضل استاذ @moho58 طلبك حسب مافهمت . ووافني بالرد . BASE_P-1.rar
    2 points
  25. لم افهم ما المقصود بالتنسيق وان كنت تقصد العمود الاخير M غير ظاهر في ملف PDF فاستبدل في الكود نطاق البيانات Range("A1:L" & lastRow).ExportAsFixedFormat _ بهذا المدى Range("A1:M" & lastRow).ExportAsFixedFormat _ يعتى بدل العمود L يصبح M عمالة نظام جديد2025_2026.xlsm
    2 points
  26. وعليكم السلام ورحمة الله تعالى وبركاته Option Explicit Option Compare Text Sub FilterContractorData() Dim CrWS As Worksheet, dest As Worksheet, OnRng, ColArr, a(1 To 4) Const tmp1 = 3, tmp2 = 4, colDate = 1 Set CrWS = Sheets("يومية المقاولين") Set dest = Sheets("تقرير تفصيلى") With Application .ScreenUpdating = False: .Calculation = xlCalculationManual OnRng = CrWS.Range("B8:Y" & CrWS.Cells(CrWS.Rows.Count, "B").End(xlUp).Row).Value a(1) = dest.[D3].Value: a(2) = dest.[E3].Value a(3) = dest.[C6].Value: a(4) = dest.[D6].Value ColArr = FiltreTbl(OnRng, a, tmp1, tmp2, colDate, _ Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24)) If Not IsEmpty(ColArr) Then Dim Lr As Long: Lr = dest.Rows.Count dest.Range("A11:T" & Lr).ClearContents dest.Range("B11").Resize(UBound(ColArr), UBound(ColArr, 2)).Value = ColArr With dest.Range("A11:A" & dest.Cells(dest.Rows.Count, "B").End(xlUp).Row) .Value = Evaluate("ROW(" & .Address & ")-10") End With Else MsgBox "لا توجد بيانات تطابق الشروط المحددة", vbExclamation End If .ScreenUpdating = True: .Calculation = xlCalculationAutomatic End With End Sub Function FiltreTbl(OnRng, a, tmp1, tmp2, colDate, Optional f) Dim cnt(), temp(), b(), n&, j&, i&, k&, r&, vDate n = UBound(OnRng, 2) If IsMissing(f) Then ReDim cnt(0 To n - 1): For k = 0 To n - 1: cnt(k) = k + 1: Next k Else: cnt = f End If j = UBound(cnt): ReDim temp(1 To UBound(OnRng), 1 To j + 1) For i = LBound(OnRng) To UBound(OnRng) vDate = OnRng(i, colDate) If IsDate(vDate) And (a(1) = "" Or OnRng(i, tmp1) = a(1)) And (a(2) = "" Or OnRng(i, tmp2) = a(2)) _ And (vDate >= a(3) And vDate <= a(4)) Then r = r + 1: For k = 0 To j: temp(r, k + 1) = OnRng(i, cnt(k)): Next k End If Next i If r > 0 Then ReDim b(1 To r, 1 To j + 1) For i = 1 To r: For k = 1 To j + 1: b(i, k) = temp(i, k): Next k: Next i FiltreTbl = b Else: FiltreTbl = Empty End If End Function عمالة نظام جديد.xlsm
    2 points
  27. تفضل أخي Sub test() Dim dest As Worksheet, WS As Worksheet Dim m As String, a As Variant, k As Variant, f As Variant Dim d As Object: Set d = CreateObject("Scripting.Dictionary") Dim ShArr As Variant: ShArr = Array("aaa", "bbb") Dim i As Long, lr As Long, r As Long: r = 2 With Application .ScreenUpdating = False: .EnableEvents = False: .Calculation = xlCalculationManual On Error Resume Next Set dest = Sheets("التقرير") If dest Is Nothing Then Set dest = Sheets.Add: dest.Name = "التقرير" Else dest.Range("A:F").ClearContents On Error GoTo 0 dest.Range("A1").Resize(1, 6).Value _ = Array("الشهر", "اسم الشركة", "عدد النقلات", "مجموع المبلغ للسائق", "مجموع مبلغ العقد", "مجموع الكمية (طن)") For Each WS In Sheets(ShArr) If WS.AutoFilterMode Then WS.AutoFilterMode = False lr = WS.Cells(WS.Rows.Count, "M").End(xlUp).Row For i = 2 To lr If Trim(WS.Cells(i, "M").Text) <> "" And Trim(WS.Cells(i, "L").Text) <> "" Then m = Trim(WS.Cells(i, "M").Text) & "|" & Trim(WS.Cells(i, "L").Text) If Not d.exists(m) Then d(m) = Array(0, 0, 0, 0) d(m) = Array(d(m)(0) + 1, d(m)(1) + tmp(WS.Cells(i, "S").Value), _ d(m)(2) + tmp(WS.Cells(i, "U").Value), d(m)(3) + tmp(WS.Cells(i, "F").Value)) End If Next i Next WS For Each k In d.Keys f = Split(k, "|") a = d(k) dest.Cells(r, 1).Resize(1, 6).Value = Array(f(0), f(1), a(0), a(1), a(2), a(3)) r = r + 1 Next k .ScreenUpdating = True: .EnableEvents = True: .Calculation = xlCalculationAutomatic End With MsgBox "تم إعداد التقرير بنجاح", vbInformation End Sub Private Function tmp(x As Variant) As Double tmp = IIf(IsNumeric(x), x, 0) End Function الشهر والشركة.xlsm
    2 points
  28. السلام عليكم حسب فهمى لطلبك وبدون ارفاق ملف منكم اليك الكود Sub RunMacroWithPassword() Dim password As String Dim userInput As String password = "1234" userInput = InputBox("من فضلك أدخل كلمة السر لتشغيل الماكرو:", "كلمة السر") If userInput = password Then MsgBox "كلمة السر صحيحة، سيتم الآن تشغيل الماكرو.", vbInformation Call MyProtectedMacro Else MsgBox "كلمة السر غير صحيحة. لن يتم تشغيل الماكرو.", vbCritical End If End Sub Sub MyProtectedMacro() MsgBox "تم تشغيل الماكرو بنجاح!", vbInformation ' أضف الكود الحقيقي هنا... End Sub الكود الاول Sub RunMacroWithPassword() وفيه المطالبة بكلمة السر وهي 1234 والكود الثاني Sub MyProtectedMacro() وهو الذي سيتم تنفيذه بعد وضع كلمة السر مثال تنفيذ ماكرو مع ادخال كلمة سر.xlsb
    2 points
  29. وعليكم السلام ورحمة الله وبركاته عذرا لعدم استيعابى لطلبك في مشاركنك السابقة تم تطبيق التنسيق الشرطى على الصفوف المرحلة بمعنى كلما تم الترحيل يطبق عليه التنسيق الشرطى تم نوحيد ارتفاع الصفوف للبيانات المرحلة جرب الملف وان هناك شئ لم يحقق ما طلبت فاوضح ثم ابشر يومك طيب ومبارك ترحيل بيانات الموظف المحال للمعاش إلى شيت آخر وحذفه من قاعدة البيانات 7.xlsb
    1 point
  30. اللهم ربّ الناس ، أذهب البأس ، واشفِ أنت الشافي ، لا شفاء إلا شفاؤك ، شفاءً لا يغادر سقمًا . اللهم اشفِ نجل الأخ محمد هشام شفاءً تاماً عاجلاً ، اللهم ألبسه ثوب الصحة والعافية ، وردّه إلى أهله سالماً معافى يا أرحم الراحمين . اللهم اجعل مرضه طهوراً له ، وكفّارةً لذنوبه ، وسبباً لرفع درجته ، وفرّج عن والديه وأهله ، إنك على كل شيء قدير
    1 point
  31. وعليكم السلام ورحمة الله وبركاته ، أخي الكريم @2saad ، الأصل هو تتبع الاستعلامات التي بُنيت عليها الإستعلامات الفرعية ، والأستاذ @ابوخليل مشكوراً أسس لك الإستعلامات بشكل سهل تستطيع منه التتبع والتعديل ... إلخ على العموم ، في البداية يجب إضافة الحقل في الاستعلام الأصلي = qry_master . ثانياً ، إضافة الحقل في الاستعلامين (qry_Temp_term1 و qry_Temp_term2 ) . ثالثاً ، بعد إضافة الحقل Stucod في الجدول ، قمت بالتعديل على زري (اعداد نتيجة الفصل الدراسي الأول و اعداد نتيجة الفصل الدراسي الثاني) بحيث يتم اضافة قيمة الحقل الى الجدول ، كالآتي :- Private Sub ProcessTermData(termNum As Integer, ctrl As Control, includeVHodor As Boolean) On Error GoTo ErrorHandler ctrl.Caption = "انتظر ..." DoCmd.SetWarnings False DoCmd.RunSQL "DELETE FROM tbl_Temp WHERE tbl_Temp.term_Num = " & termNum & ";" If includeVHodor Then DoCmd.RunSQL "INSERT INTO tbl_Temp (term_Num, vHodor, alnesbah, tgyeem1, hala, safType, eldina_id, Stucod) " & _ "SELECT qry_term" & termNum & ".*, qry_Temp_term" & termNum & ".term_Num, " & _ "qry_Temp_term" & termNum & ".hodor, qry_Temp_term" & termNum & ".alnesbah1, " & _ "qry_Temp_term" & termNum & ".tgyeem1, qry_Temp_term" & termNum & ".hala1, " & _ "qry_Temp_term" & termNum & ".safType, qry_Temp_term" & termNum & ".eldina_id, " & _ "qry_Temp_term" & termNum & ".Stucod " & _ "FROM qry_Temp_term" & termNum & " INNER JOIN qry_term" & termNum & " " & _ "ON qry_Temp_term" & termNum & ".Stucard = qry_term" & termNum & ".Stucard;" Else DoCmd.RunSQL "INSERT INTO tbl_Temp (term_Num, alnesbah, tgyeem1, hala, safType, eldina_id, Stucod) " & _ "SELECT qry_term" & termNum & ".*, qry_Temp_term" & termNum & ".term_Num, " & _ "qry_Temp_term" & termNum & ".alnesbah1, qry_Temp_term" & termNum & ".tgyeem1, " & _ "qry_Temp_term" & termNum & ".hala1, qry_Temp_term" & termNum & ".safType, " & _ "qry_Temp_term" & termNum & ".eldina_id, qry_Temp_term" & termNum & ".Stucod " & _ "FROM qry_Temp_term" & termNum & " INNER JOIN qry_term" & termNum & " " & _ "ON qry_Temp_term" & termNum & ".Stucard = qry_term" & termNum & ".Stucard;" End If DoCmd.SetWarnings True ctrl.Caption = "تــم" Exit Sub ErrorHandler: DoCmd.SetWarnings True ctrl.Caption = "خطأ" MsgBox "حدث خطأ أثناء معالجة البيانات", vbCritical + vbMsgBoxRight, "" End Sub ثم الإستدعاء في الزرين :- Private Sub StartBtn_Click() ProcessTermData 1, b, False End Sub Private Sub StartBtn2_Click() ProcessTermData 2, bb, True End Sub ملفك بعد التعديل :- Data18.zip أو البقاء على الاستعلامات الاصلية للزرين كما في التالي :- Private Sub StartBtn_Click() b.Caption = "انتظر ..." DoCmd.SetWarnings False DoCmd.RunSQL "DELETE tbl_Temp.*, tbl_Temp.term_Num FROM tbl_Temp WHERE (((tbl_Temp.term_Num)=1));" DoCmd.RunSQL "INSERT INTO tbl_Temp (term_Num, alnesbah, tgyeem1, hala, safType, eldina_id, Stucod) " & vbCrLf & _ "SELECT qry_term1.*, qry_Temp_term1.term_Num, qry_Temp_term1.alnesbah1, qry_Temp_term1.tgyeem1, " & _ "qry_Temp_term1.hala1, qry_Temp_term1.safType, qry_Temp_term1.eldina_id, qry_Temp_term1.Stucod " & vbCrLf & _ "FROM qry_Temp_term1 INNER JOIN qry_term1 ON qry_Temp_term1.Stucard = qry_term1.Stucard;" DoCmd.SetWarnings True b.Caption = "تــم" End Sub Private Sub StartBtn2_Click() bb.Caption = "انتظر ..." DoCmd.SetWarnings False DoCmd.RunSQL "DELETE tbl_Temp.*, tbl_Temp.term_Num FROM tbl_Temp WHERE (((tbl_Temp.term_Num)=2));" DoCmd.RunSQL "INSERT INTO tbl_Temp (term_Num, vHodor, alnesbah, tgyeem1, hala, safType, eldina_id, Stucod) " & vbCrLf & _ "SELECT qry_term2.*, qry_Temp_term2.term_Num, qry_Temp_term2.hodor, qry_Temp_term2.alnesbah1, " & _ "qry_Temp_term2.tgyeem1, qry_Temp_term2.hala1, qry_Temp_term2.safType, qry_Temp_term2.eldina_id, qry_Temp_term2.Stucod " & vbCrLf & _ "FROM qry_Temp_term2 INNER JOIN qry_term2 ON qry_Temp_term2.Stucard = qry_term2.Stucard;" DoCmd.SetWarnings True bb.Caption = "تــم" End Sub
    1 point
  32. وعليكم السلام ورحمة الله وبركاته بعد اذن استاذنا محمد هشام جرب التعديل التالي تفس الكود والتغديل في السطر arr(i - 1) = WS.Cells(i, "I").Value بالسطر arr(i - 1) = CStr(WS.Cells(i, "I").Value) الكود كاملا Option Explicit Sub FilterByNames() Dim WS As Worksheet, arr(), i&, n&, filterRange As Range Set WS = Sheets("Sheet1") If WS.AutoFilterMode Then WS.AutoFilterMode = False n = WS.Cells(WS.Rows.Count, "I").End(xlUp).Row If n < 2 Then Exit Sub ReDim arr(1 To n - 1) For i = 2 To n arr(i - 1) = CStr(WS.Cells(i, "I").Value) Next i Set filterRange = WS.Range("B6").CurrentRegion With filterRange .AutoFilter Field:=2, Criteria1:=arr, Operator:=xlFilterValues End With End Sub
    1 point
  33. برنامج أرشفة 1- الملفات والمرفقات والمجلدات 2- البرامج المساعدة ومرفقاتها أرجو ابداء رأيكم به ArchiveMyFiles-Folders.rar
    1 point
  34. عمل على جهازي بدون مشاكل الوندز 2010 .. 64 الاوفيس 2010 .. 32
    1 point
  35. الامر بيدك ان اردت مساعدتنا ، وذلك بإرفاق الملف الذي يعمل.
    1 point
  36. اللهم الشفاءالعاجل ... والسلامة الدائمة ... بحق اسمك الاعظم ونبيك المكرم ...
    1 point
  37. السلام عليكم اخوي موسى بالفعل ، عمل لا يخطر على البال ، شكرا لك ولأخوي ابو جودي عندي فكرة في بالي لتطوير العمل ، ولأنك لم ترفق اصل النص المتخربط وانما ارفقت صورة ، فمحتاج منك النص لوسمحت (وخليه في الكود في مرفق) صدقني حاولت انسخه ، ولكن لما الصقه في كود الاكسس يتحول الى نص طبيعي انا مربوش شوي في شغل ، فما عندي بارض احاول اكثر
    1 point
  38. اللهم يا رب بحق اسمك الاعظم الذى اذا ما دعيت به الا و اجبت داعيه اللهم بمجرد كتابة هذا الدعاء ان تكون قد كتبت نعمة الشفاء على ابن صديقنا الغالى محمد هشام اللهم امين يا رب العالمين
    1 point
  39. اللهم امين .. أتم يارب شفاءه على أكمل وجه بالشكل الذى يرضيك يا أكرم الأكرمين واربط على اهله وذويه بالصبر على هذا
    1 point
  40. ما ادري !! عملت مقارنة بخطوط الوندوز اللي عندي (وما عندي خطوط اضافية) ، فالاقرب كان Times New Roman وطلبت من claude.ai يعمل المقارنة :
    1 point
  41. السلام عليكم ورحمة الله وبركاته اليك ما طلبت Sub ExportCertificatesToSinglePDF() Dim lr As Long, i As Long, pageCount As Long Dim pdfPath As String, wsMain As Worksheet, tempWS As Worksheet Dim tempSheetNames As Collection Dim sh As Worksheet Application.ScreenUpdating = False Application.DisplayAlerts = False Set wsMain = ThisWorkbook.Sheets("معلمين") Set tempSheetNames = New Collection wsMain.Range("m2").FormulaR1C1 = "=COUNTA('جدول عام'!R6C1:R22C1)" lr = wsMain.Range("m2").Value i = 1 pageCount = 1 Do Until i > lr wsMain.Range("m2").Value = i wsMain.Copy After:=Sheets(Sheets.Count) Set tempWS = ActiveSheet tempWS.Name = "Temp_" & pageCount tempWS.PageSetup.PrintArea = "$A$1:$i$37" tempSheetNames.Add tempWS.Name i = i + 3 pageCount = pageCount + 1 Loop pdfPath = ThisWorkbook.Path & "\الشهادات.pdf" Dim wsArray() As Variant ReDim wsArray(1 To tempSheetNames.Count) For i = 1 To tempSheetNames.Count wsArray(i) = tempSheetNames(i) Next i ThisWorkbook.Sheets(wsArray).Select ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=pdfPath For i = 1 To tempSheetNames.Count Application.DisplayAlerts = False ThisWorkbook.Sheets(tempSheetNames(i)).Delete Application.DisplayAlerts = True Next i wsMain.Select wsMain.Range("m2").Value = 1 Application.ScreenUpdating = True Application.DisplayAlerts = True MsgBox "تم حفظ الشهادات في ملف PDF بنجاح!", vbInformation, "تم الحفظ" End Sub تحويل الشهادات الى pdf.xlsm
    1 point
  42. وعليكم السلام ورحمة الله تعالى وبركاته جرب الكود التالي اذا ظهر خطا بالكود ربما تحتاج تشغيل تطبيق اكسل كمسؤول Sub DeleteXLSBFromDriveD() Dim folderPath As String folderPath = "D:\" Call DeleteXLSBRecursive(folderPath) MsgBox "تم حذف جميع ملفات .xlsb من الدرايف D (حذف).", vbInformation End Sub Sub DeleteXLSBRecursive(folderPath As String) Dim fs As Object Dim folder As Object Dim subFolder As Object Dim file As Object Set fs = CreateObject("Scripting.FileSystemObject") On Error Resume Next Set folder = fs.GetFolder(folderPath) If folder Is Nothing Then Debug.Print "Cannot access folder: " & folderPath Exit Sub End If On Error GoTo 0 On Error Resume Next Dim fileCount As Long fileCount = folder.Files.Count If Err.Number <> 0 Then Debug.Print "Error accessing files in: " & folderPath & " - " & Err.Description Err.Clear On Error GoTo 0 Exit Sub End If On Error GoTo 0 If fileCount > 0 Then For Each file In folder.Files On Error Resume Next If LCase(fs.GetExtensionName(file.Name)) = "xlsb" Then SetAttr file.Path, vbNormal Kill file.Path If Err.Number <> 0 Then Debug.Print "Failed to delete: " & file.Path & " - Error: " & Err.Description Err.Clear End If End If On Error GoTo 0 Next file End If For Each subFolder In folder.SubFolders DeleteXLSBRecursive subFolder.Path Next subFolder End Sub
    1 point
  43. شكرا جزيلا أخي الفاضل
    1 point
  44. من المتطلبات .. ضبط العمليات الاربع بحيث تجري بسلاسة وتخدم المستخدم .. اعمل 4 ازرار او تبويبات : بيع / شرائ / مرتجع بيع / مرتجع شراء الفورم يفتح افتراضيا على البيع .. لأن 90% من العمليات هي بيع حينها يكون حقل نوع العملية ( بيع ) اجباريا ، ويتم تصفية قائمة العملاء فلا يظهر الا الزبائن فقط وحين تنقر على زر شراء : حينها يكون حقل نوع العملية ( شراء ) اجباريا ، ويتم تصفية قائمة العملاء فلا يظهر الا الموردون فقط وينطبق هذا على الزرين الآخرين ايضا من اجل الاحصاءات والاستعلامات مستقبلا ( وهو غير ملزم ) ادراج حقلي العميل ونوع العملية ضمن جدول التفاصيل
    1 point
  45. وعليكم السلام ورحمة الله وبركاته اسعدتى جدا دعاؤكم لي ولكم مثل ما دعوتم لي وزيادة احبك الله الذي أحببتني فيه وأعزك و أكرمك ورزقك الفردوس الأعلى من الجنة يارب العالمين لكم كل التقدير والاحترام
    1 point
  46. بسم الله الرحمان الرحيم السلام عليكم اصدقائي اعضاء منتدى اوفيسنا تم الانتهاء بحمد لله من قاعدة البيانات تم الاعتماد على الاكسيس كقاعدة البيانات لذى لن يكون هناك اي ثقل او ضغط على الاكسيل فواتير الشراء و فواتير البيع اضافة فاتورة بحث وتعديل او طباعة البحث عن الاصناف باستعمال خاصية النص التنبئي اتبعنا السعر الوسط للاصناف في حال توفر كميات مختلفة باسعار مختلفة في المخزون الاصناف الجديدة تدخل اوتوماتيكيا الى المخزن مباشرة من فاتورة الشراء و كذالك يتم تكويدها اوتوماتيكيا امكانية اضافة القيمة المضافة للفواتير حسب ارادة المستخدم اضهار ان كانت الفاتورة مسددة ام لا و ايضا اضهار ان كان مسدد جزء من الفاتورة و المبلغ المتبقي الموردين و العملاء اضافة بحث وتعديل او حذف اضهار كل الفواتير المتعلقة بالعميل او المود اضهار الفواتير الغير مسددة او الغير مدفوعة للعميل او المورد كشف حساب تفصيلي لكل عميل او مورد طباعة كشف الحساب اضهار عدد الفواتير المتعلقة بكل عميل او مورد و اضهار مجموع المبالغ المدفوعة او المسددة و مجموع المبالغ المستحقة المخزون قائمة كل الاصناف مع امكانية التعديل على اسم الصنف اضهار قائمة بالاصناف القريبة النفاذ وذلك على حسب كمية يحددها المستخدم اضهار قائمة الاصناف التي نفذت من المخزون قائمة بكل عمليات الشراء الخاصة بكل صنف قائمة بكل عمليات البيع الخاصة بكل صنف صافي ربح الصنف امكانية استراد قائمة اصناف من ملف اكسل خارجي جاري العمل عللى مكانية استراد الاصناف من صيغ اخرى كالاكسيس او الملفات النصية سندات الصرف و سندات القبض اضافة بحث وتعديل او حذف + طباعة السندات بحث بواسطة رقم السند او رقم الفاتورة او اسم العميل او المورد او بين فترة زمنية معينة اثناء اضافو السندات سواء قبض او صرف لا تضهر الى الفواتير الغير مسددة عند اختيار الفاتورة يضهر مبلغها اوتوماتيكيا امكانية اختيار طريقة الدفع نقدا او شيك مضهر البرنامج امكانية تغير ثيم البرنامج امكانية تغير لغة البرنامج (عربية انجليزة و فرنسية) يعتمد البرنامج على واجهة الاكسل الرئيسة و اليوزرفورم معا معلومات اخرى امكانية رفع قاعدة بيانات البرنامج على سيرفر محلي او عام (لاخوف على قاعدة البيانات في حال سقوط الونداوز) امكانية العمل على البرنامج من طرف اكثر من مستخدم في وقت واحد هذه بعض الصور المسربة للبرنامج هذا ماتم انجازه بفضل الله الى حد الساعة لذى احتاج من كل الاعضاء ابداء اقتراحاتهم حول الامور المنجزة و ايضا اعطائنا اي اضافات تودون ان اضيفها للبرنامج لانه لم يعد يتوفر في جعبتي اي افكار لذي ارجو من لهم خبرة في التعامل مع هذا النوع من البرامج ان يبدو اقتراحاتهم او يرةني بعض البرامج التي يمكن ان استمد منها افكار اخرى تحياتي للجميع اخوكم في الله شوقي ربيع
    1 point
  47. Dim Sh As Boolean Public Property Get f() As Worksheet Set f = Sheets("Sheet1") <========= إسم ورقة العمل المرغوب جلب إسم المصنف الجديد منها End Property Private Sub UserForm_Initialize() Dim WS As Worksheet, CrWS As Variant, i As Integer ' قم بتعديل أسماء أوراق العمل المرغوب إظهارها CrWS = Array("Sheet1", "Sheet2", "Sheet3") For Each WS In ThisWorkbook.Worksheets For i = LBound(CrWS) To UBound(CrWS) If WS.name = CrWS(i) Then ListBox1.AddItem WS.name Exit For End If Next i Next WS HideBar Me End Sub Private Sub CommandButton1_Click() Dim i As Integer, ShName As String, newWb As Workbook, sPath As String Dim tmps As Integer, shArr As String, sCount As Integer, WBname As String WBname = f.[R2].Value <======= قم بتعديل عنوان خلية الإسم بما يناسبك If WBname = "" Then: MsgBox "الرجاء إدخال إسم المصنف ", vbExclamation, "إنتباه": Exit Sub 'Code........ .............. End Sub Private Sub CommandButton2_Click() On Error GoTo SupApp Dim arr As New Collection, TempWb As Workbook, WS As Worksheet Dim i As Integer, sMsg As Integer, tbl As Boolean Dim WBname As String, sPath As String, shArr As String WBname = Trim(f.Range("R2").Value) If WBname = "" Then MsgBox "الرجاء إدخال اسم المصنف", vbExclamation, "تنبيه": Exit Sub tbl = Me.CheckBox1.Value For i = 0 To Me.ListBox1.ListCount - 1 If tbl Or Me.ListBox1.Selected(i) Then arr.Add Me.ListBox1.List(i) shArr = shArr & Me.ListBox1.List(i) & "- " sMsg = sMsg + 1 End If Next If sMsg = 0 Then MsgBox "الرجاء تحديد ورقة عمل واحدة على الأقل", vbExclamation, "تنبيه": Exit Sub If Len(shArr) > 0 Then shArr = Left(shArr, Len(shArr) - 2) End If If MsgBox("هل أنت متأكد أنك تريد حفظ الأوراق التالية؟" & _ vbNewLine & vbNewLine & shArr, vbYesNo + vbQuestion, "PDF" & " تأكيد الحفظ") = vbNo Then Exit Sub With Application .ScreenUpdating = False: .EnableEvents = False: .DisplayAlerts = False: .Calculation = xlCalculationManual End With Set TempWb = Workbooks.Add(xlWBATWorksheet) For i = 1 To arr.Count ThisWorkbook.Sheets(arr(i)).Copy After:=TempWb.Sheets(TempWb.Sheets.Count) Next sPath = ThisWorkbook.path & "\" & WBname & ".pdf" If Dir(sPath) <> "" Then Kill sPath TempWb.ExportAsFixedFormat Type:=xlTypePDF, fileName:=sPath, Quality:=xlQualityStandard, _ IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=False TempWb.Close False MsgBox "تم حفظ الملفات بنجاح", vbInformation, "PDF حفظ" Unload Me CleanUp: With Application .ScreenUpdating = True: .EnableEvents = True: .DisplayAlerts = True: .Calculation = xlCalculationAutomatic End With Exit Sub SupApp: On Error Resume Next: If Not TempWb Is Nothing Then TempWb.Close False Resume CleanUp End Sub تصدير صفحات v3.xlsm
    1 point
  48. السلام عليكم تفضل المرفق التكرار.xlsx
    1 point
  49. جرب التالي .. لاحظ أن الموضوع الذي اقتبست منه الكود فيه رابط لحلقات افتح الباب وفيه تفصيل أكثر لو احببت الإطلاع عليه Sub Sort_Female() Dim LR As Long LR = Range("M" & Rows.Count).End(xlUp).Row Range("K7:R" & LR).Sort Key1:=Range("R7:R" & LR), Order1:=xlAscending, Key2:=Range("M7:M" & LR), Order2:=xlAscending, Header:=xlNo End Sub Sub Sort_Male() Dim LR As Long LR = Range("M" & Rows.Count).End(xlUp).Row Range("K7:R" & LR).Sort Key1:=Range("R7:R" & LR), Order1:=xlDescending, Key2:=Range("M7:M" & LR), Order2:=xlAscending, Header:=xlNo End Sub يوجد معادلات في النطاق وبعد تنفيذ الأكواد تعطي خطأ VALUE لا أعلم السبب في ذلك ..يرجى مراجعة الملف بشكل جيد والوقت لا يسعني الآن للإطلاع على الملف عموماً أترك الأمر لإخواني بالمنتدى ليدرسوا المشكلة بشكل أعمق تقبل تحياتي
    1 point
×
×
  • اضف...

Important Information