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

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

  1. Ali Mohamed Ali

    Ali Mohamed Ali

    المشرفين السابقين


    • نقاط

      22

    • Posts

      11641


  2. الدكتور خضر الرجبي

    الدكتور خضر الرجبي

    المشرفين السابقين


    • نقاط

      10

    • Posts

      919


  3. Moosak

    Moosak

    أوفيسنا


    • نقاط

      9

    • Posts

      2206


  4. أ / محمد صالح

    أ / محمد صالح

    أوفيسنا


    • نقاط

      8

    • Posts

      4474


Popular Content

Showing content with the highest reputation on 05/28/22 in all areas

  1. وعليكم السلام-يمكنك استخدام هذه المعادلة =IF(YEAR($B4)<YEAR(Table1[[#Headers],[Jan-22]]),1,IF(AND(YEAR($B4)=2022,MONTH(Table1[[#Headers],[Jan-22]])>=MONTH($B4)),1,"")) 1مقارنة التاريخ.xlsx
    5 points
  2. تفضل شاهد هذا الموضوع
    4 points
  3. حسب فهمي للمطلوب * لعرض أسماء الشيتات في القائمة يمكنك حذف هذا الكود من حدث إلغاء تفعيل Worksheet_Deactivate لشيت database Dim w As Worksheet UserForm1.Co1.Clear For Each w In ThisWorkbook.Worksheets UserForm1.Co1.AddItem w.Name Next w ووضعه في حدث تفعيل النموذج UserForm_Activate * ولفتح الشيت الذي يتم اختياره من القائمة نستعمل هذا الكود في حدث تغيير القائمة بالضغط دبل كلك عليها في النموذج ولصق السطر الأوسط من هذا الكود فقط Private Sub Co1_Change() Sheets(Co1.Value).Select End Sub بالتوفيق
    4 points
  4. انتهيت ولله الحمد 😄 للتحميل من المرفقات ( دعوة للتجربة وإبداء الرأي ) 😊: الروزنامة الأسبوعية.accdb
    4 points
  5. شكرا لله ثم لصاحب اليد العليا والفضائل الكثيرة في هذا المنتدى الرائع أقل ما يمكن أن أقدمه لك كلمة شكر رقيقة تحمل خالص المشاعر الطيبة والصادقة تقديرًا لك على كل ما قدمته لي
    3 points
  6. يمكنك استعمال هذا الكود على افتراض أن مربع النص اسمه textbox1 Private Sub TextBox1_Enter() TextBox1.Value = "" End Sub بالتوفيق
    2 points
  7. تفضل كان عليك بدء المشاركة بالتحية ... السلام عليكم , يمكنك استخدام هذه المعادلة ,كما تم عمل التنسيق الشرطى اللازم كما تريد اذا كان هناك اختلاف - كما تـــم ضبط الملف والغاء وحذف الخلايا المدمجة بالجدول (على الرغم ان هذا أتعبنى كثيراً الى ان تم على خير) فهذا يصعب من أعمال اى شيء على الإكسيل ..ورجاءاً لا تقوم بعمل اى خلايا مدمجة بعد ذلك فى ملفاتك , وذلك حتى لا تجعل الجميع يبتعد عن مساعدتك فى طلبك لأنه سيأخذ ويستغرق وقت طويل منهم =IF(OR(SUM(K16:N16)<>$O16,SUM(F16:J16)<>$O16,SUM(B16:E16)<>$O16),"هناك اختلاف","") 1OutPatientStatistic.xlsx
    2 points
  8. جرب هذا ...... DoCmd.SelectObject acReport, "اسم التقرير", True DoCmd.PrintOut , , , , 2
    2 points
  9. وعليكم السلام ورحمة الله وبركاته contrac.accdb
    2 points
  10. وذلك بسببك لأنك لاغى ذلك بالكود وذلك بالأسطر الموجودة باللون الأخضر فعليك بحذف الفاصلة العليا على يسار كلمة Me من جميع الأسطر ليصبح الكود كالتالى : Me.ListBox1.AddItem Me.TextBox4.Value Me.ListBox1.List(al, 1) = Me.TextBox5.Value Me.ListBox1.List(al, 2) = Me.TextBox6.Value Me.ListBox1.List(al, 3) = Me.TextBox7.Value Me.ListBox1.List(al, 4) = Me.TextBox8.Value Me.ListBox1.List(al, 5) = Me.TextBox9.Value Me.ListBox1.List(al, 6) = Me.TextBox10.Value Me.ListBox1.List(al, 7) = Me.TextBox11.Value Me.ListBox1.List(al, 8) = Me.TextBox12.Value Me.ListBox1.List(al, 9) = Me.TextBox13.Value 1dwork.xlsm
    2 points
  11. تفضل هذا التعديل DateVal.mdb
    2 points
  12. السلام عليكم -لابد من بدء اى مشاركة بالتحية ... تفضل لك ما طلبت ولكن عند ادخال الوقت يجب عليك مراعاة كتابته كما تم تعديله بالملف .. وشكرا معرفة فرق الوقت لكل سيارة1.xlsx
    2 points
  13. في أحد برامجي صممت شيء مشابه لذا الموضوع نوعا ما .. ولكنه يحتاج لشغل محترم للتنفيذ 👌🏼 سأحاول أن أمشي معك خطوة خطوة للتنفيذ ..
    2 points
  14. الكود شغال عندي يطبع نسختين ( نسخة كاملة ثم نسخة كاملة اخر ) أي مرتبة ........
    1 point
  15. تسبم اخي بارك الله فيك.. تحياتي
    1 point
  16. أشكرك جزيل الشكر أستاذي الكريم على تعبك ومجهودك ..وجميع ملاحظاتك على العين والراس أسعدتني أسعدك الله في الدنيا والآخرة
    1 point
  17. اتوقعت انهم كلهم واحد راح يكون عندك مجلدين مجلد : ملفات الأفراد مجلد : ملفات المكلفين بنفس الجدول و نفس النموذج اتفضل التعديل sa1.2.zip
    1 point
  18. ما فهمت عليك .... كيف نسخة واحدة ؟؟؟؟؟ والزرار ظاهر ؟؟؟؟؟ وضح !!!!
    1 point
  19. شرح البحث الذكى والمراجعة فى الاكسل الجزء الرابع
    1 point
  20. شكراً جزيلاً للجميع عاشت ايدك اخوي مبرمج سابق Ahmed عاشت ايدك اخوي
    1 point
  21. تمت معالجة هذا الأمر كثيرا في المنتدى ربما يفيدك هذا الرابط
    1 point
  22. ممتاز استاذ مجدى بارك الله فيك وجزاك الله كل خير
    1 point
  23. اخي العزيز @ابو عبد الله العراقي السلام عليكم الاسم الرباعي وحتى اللقب وارد التكرار وخصوصا في بلدنا العزيز انا مع رأي الاخوة بوضع ID اكمفتاح اساسي غير قابل للتكرار اما لتجنب تكرار الاسم الرباعي فيمكن عمل ذلك من خصائص الجدول تجعله مفهرس (نعم (التكرار غير مقبول) او بوضع كود في النموذج يظهر لك رسالة ان الاسم الرباعي موجود هل تريد التكرار ام لا تحياتي للجميع
    1 point
  24. ما ذا تقصد بالطرح في التاريخ ؟ (فالتواريخ المراد وضعها فى العمود الجديد تمثل أكبر ناتج طرح للتواريخ) لو اردت حساب مدة بين تاريخين استخدم التالي DateDiff(«interval»; «date1»; «date2») حيث ان interval تعبر عن معيار الحساب مثلا لو اردت حساب عدد الأيام بين تاريخين يكون بالطريقة التالية DateDiff("D"; [date1]; [date2]) و لو اردت حساب عدد الأشهر تكون بالطريقة التالية DateDiff("M"; [date1]; [date2]) و لو اردت حساب عدد السنوات تكون بالطريقة التالية DateDiff("YYYY"; [date1]; [date2]) و لو اردت حساب عدد الأسابيع تكون بالطريقة التالية DateDiff("WW"; [date1]; [date2]) و لو اردت حساب الربع سنوي تكون بالطريقة التالية DateDiff("Q"; [date1]; [date2])
    1 point
  25. تفضل هذا التعديل لتجاوز الخطأ Public Function importExcel(Tablename As String, FilePath As String) On Error Resume Next Dim xlApp As Excel.Application Dim xlWb As Excel.Workbook Dim xlWs As Excel.Worksheet Dim intLine As Long Dim strSqlDml As String Dim strColumn1 As String, strColumn2 As String, strColumn3 As String Set xlApp = New Excel.Application xlApp.Visible = False Set xlWb = xlApp.Workbooks.Open(FilePath) Set xlWs = xlWb.Worksheets(1) intLine = 2 'سيتم استيراد الصفوف بدء من الصف رقم 2 Do strColumn1 = Trim(xlWs.Cells(intLine, 1).Value) 'رقم 1 يعني العمود رقم 1 في ملف الاكسل strColumn2 = Trim(xlWs.Cells(intLine, 2).Value) 'رقم 2 يعني العمود رقم 2 في ملف الاكسل strColumn3 = Trim(xlWs.Cells(intLine, 3).Value) 'رقم 3 يعني العمود رقم 3 في ملف الاكسل strSqlDml = "INSERT INTO [" & Tablename & "] VALUES('" & strColumn1 & "', '" & strColumn2 & "', '" & strColumn3 & "')" CurrentDb.Execute strSqlDml, dbFailOnError xlWs.Cells(intLine, 1).Select intLine = intLine + 1 Loop Until IsEmpty(xlWs.Cells(intLine, 1)) xlWb.Close False xlApp.Quit Set xlApp = Nothing Set xlWb = Nothing Set xlWs = Nothing End Function
    1 point
  26. شكر وتقدير واحترام من اخيك
    1 point
  27. مشاركة معي استاذنا @د.كاف يار جزاه الله خيرا استخدم هذا الكود فقط بدون مكتبات TablName= MyAccessTbleName 'ضع بدل هذا المتغير اسم الجدول الموجود بالأكسس ExlFilPath= MyExelFileFullName 'ضع بدل هذا المتغير مسار ملف الاكسل بالكامل مثل: D:\Exel1.xlsx "A1:F2000" ' هذا المدي الموجود به البيانات بشيت الاكسل غيره حسب ما هو موجود عندك Docmd.TransferSpreadsheet(acImport,acSpreadsheetTypeExcel12,TablName,ExlFilPath,true,"A1:F2000") هذا والله أعلم
    1 point
  28. وعليكم السلام-من فضلك عليك بمعرفة ودراسة المعادلة بتفسك وان لا تغير المدى بها وعليك ان تتأكد انها تبدأ من الصف الرابع وليس العاشر كما قمت انت بتغييرها.وشكراً =SUMIF(مشتريات!$C$4:$C$585,مخزن!A3,مشتريات!$D$4:$D$585)-SUMIF(مبيعات!$C$4:$C$582,مخزن!A3,مبيعات!$D$4:$D$582) اسعار المنتجات فاتورة2.xls
    1 point
  29. اتفضل السبب فى الخطأ ان حضرتك وضعت فى مصدر بيانات مربع النص fullName التعبير الاتى =[firstName] & " " & [secondName] & " " & [thirdName] & " " & [fourthName] ولذلك تم بالفعل نجميع الاسم الرباعى ولكن اصبح مربع النص fullName غير منضم ترى فيه النتيجة بالفعل ولكن لم تتم ادراج القيمة فى الجدل فى الحقل المطلوب fullName.accdb
    1 point
  30. شوف دا How To Get And Insert The Last Modified User Name In Excel?
    1 point
  31. مما فهمت هل هذا ما تريد datex.accdb
    1 point
  32. بارك الله فيك وزادك الله من فضله
    1 point
  33. اخي البرنامج لا يفتح ويبقى المؤشر على الاسم فقط
    1 point
  34. تفضل يمكنك استخدام هذه المعادلة (Ctrl+Shift+Enter) =IFERROR(INDEX($C$3:$C$40,SMALL(IF(($C$3:$C$40<=$I$3)*($C$3:$C$40>=$I$2)*($B$3:$B$40=$K$2),MATCH(ROW($C$3:$C$40),ROW($C$3:$C$40)),""),ROW(A1)),COLUMN(A1)),"") Item Card1.xlsx
    1 point
  35. احسنت استاذ أبو عيد عمل ممتاز جعله الله فى ميزان حسناتك
    1 point
  36. وعليكم السلام-يمكنك جعل المعادلة هكذا =SUMIFS($C$3:$C$7,$D$3:$D$7,$I3,$B$3:$B$7,J$2,$A$3:$A$7,">="&H3,$A$3:$A$7,"<="&EOMONTH(H3,0)) work1.xlsx
    1 point
  37. 1 point
  38. بسم الله الرحمن الرحيم الحمد لله الواحد القهار، العزيز الغفار، مكور الليل على النهار ، تذكرة لأولي القلوب والأبصار وتبصرة لذوي الألباب والاعتبار ، الذي أيقظ من خلقه من اصطفاه فزهدهم في هذه الدار، وشغلهم بمراقبته وإدامة الأفكار ، وملازمة الاتعاظ والاذكار، ووفقهم للدؤوب في طاعته والتأهب لدار القرار، والحذر مما يسخطه ويوجب دار البوار، والمحافظة على ذلك مع تغاير الأحوال والأطوار. أحمده أبلغ حمد وأزكاه، وأشمله وأنماه. أما بعد: رأيت أن أقدم عملا خالصا لوجه الله الكريم لعل الله يتغمدنا برحمته ولذا رأيت أنا الفقير إلى الله المحمدي عبد السميع عبد الغني أن أجمع الأكواد بطريقة منظمة تسهل للجميع الحصول عليها عند استخدام محرك البحث ، ولهذا ساقدم سلسلة من الأكواد كل كود بعنوان واضح يسهل الوصول له في موضوع مستقل وسأشرح كيفية استخدام الكود ماتيسر لي إن شاء الله وعلى الله قصد السبيل ****************************************** هذا كود التنقل الى اي صفحة في ملف اكسيل طريقة الاستفادة من الكود افتح ملف اكسيل اضغط على الرز ALT وانت ضاغط على الزر اضغط على F11 الموجود أعلا لوحة المفاتيح ستظهر شاشة الماكرو اضغط على موديول 1 سيتم فتح الموديول الصق فيه الكود الموجود تحت هذا السطر [/center] ' ' هذا الكود للعالم العلامة عبد الله باقسير Sub GO_TO() On Error Resume Next Application.CommandBars("Workbook Tabs").Controls("More Sheets...").Execute If Err.Number > 0 Then Err.Clear Application.CommandBars("Workbook Tabs").ShowPopup End If Activewindow.ScrollColumn = 1 Activewindow.ScrollRow = 1 On Error GoTo 0 End Sub في هذا الكود البسيط والمفيد عند الضغط على الزر ستنسدل قائمة بأسماء كل الصفحات الموجوده بالملف اختر منها الورقة التي تبعاها ودمتم في حفظ الله التنقل بين الصفحات.rar
    1 point
  39. الموضوع : كود ترحيل البيانات بشكل مميز سأتناول أولا : شرح الكود حتى يسهل على الجميع أستخدامة داعيا الله ان يوفقنى الى ما يحبة ويرضة أ - سأقوم بدرب مثال يفضل ان تنفذة معى لكى تصل لكيفية عمل الكود وتطويعه لما تريد عملة أبدأ بفنح ملف أكسيل جديد : قم بتسمية ورقة العمل الاولى بأسم ادخال بيانات والورقة الثانية فواتير ثم فى صفحة العمل الاولى والتى تسمى بـ ادخال البيانات قوم بتصميم جدول كما هو موضح فى الصورة ثم تصميم زر فى نفس الصفحة حتى يصبح بنفس الشكل هذا لم لا يعرف كيفية تصميم زر يمكنة ذلك من خلال : ----------------------------------------------------- اصدار 2003 من مربع أدوات التحكم > ادارج زر ------------------------------------------------------ اصدار 2007 من المطور > ادراج زر ------------------------------------------------------- وفى الصفحة الثانية التى تم تسميتها باسم فواتير نصممها على هذا الشكل بعد تصميم تسمية الصفحتين والزر فى الصفحة الاولى يمكنك اضافة الكود من خلال اختيار وضع التصميم والضغط على الزر الذى سبق تصميمة دبل كليك ايسر على الماوس ثم نضع الكود التالى وسأقوم بشرحة تفصيليا كما بالصورة (الكود مرفق ) الجزء الاولى من الكود الجزء الثانى من الكود الجزء الثالث من الكود الجزء الرابع من الكود الجزء الخامس من الكود الجزء السادس والأخير ملاحظة : الكود يرحل بترتيب الادخال . لتحميل الشرح مصور + ملف المثال + الكود من هنا فى النهاية أسالكم الدعاء اذا افادكم ذلك
    1 point
  40. السلام عليكم إخواني وأخواتي ، بارك الله فيكم جميعا ، ونكمل درسنا مع نفس المثال السابق ولكن بتقنية ADO المثال يصبح كما يلي : Private Sub Command0_Click() Dim Cnn As ADODB.Connection Dim rst As ADODB.Recordset Dim strCnn As String Set Cnn = New ADODB.Connection strCnn = CurrentProject.Connection Cnn.Open strCnn Set rst = New ADODB.Recordset rst.Open "SELECT EmpNotes FROM Employees WHERE DepId='10'; ", Cnn, adOpenKeyset, adLockOptimistic MsgBox rst.RecordCount & " عدد السجلات هنا صحيح وهو " rst.MoveLast rst.MoveFirst MsgBox rst.RecordCount & " عدد السجلات في المجموعة المختارة " Do While Not rst.EOF rst.Edit rst!EmpNotes = "مسافر في مهمة" rst.Update rst.MoveNext Loop rst.Close End Sub الملاحظات : 1. كما ذكرنا سابقا Dynaset في DAO يقابلها Keyset في تقنية ADO هذا بالنسبة للتعريفات . 2. مشكلة أسلوب الحصول على عدد السجلات في المجموعة التي اضطررنا إلى الذهاب فيها إلى أخر سجل ثم إلى أول سجل ، قد اختفت هنا ولا حاجة سوى للذهاب إلى أول سجل قبل الدخول في الحلقة ولكنني أبقيتها هنا حتى تتأكدوا من ذلك بأنفسكم . 3. بالنسبة لإستخدام with أو عدم استخدامها لا علاقة لها بتقنية ADO أو DAO ويبقى الهدف من استخدمها ان استخدمت كما ذكرت سابقا هو تسهيل عملية الوصول إلى الخصائص مباشرة بكتابتها بعد النقطة وبدون كتابة اسم مجموعة التسجيلات كما أوضحت ذلك في الدرس السابق. 4. لا يوجد هنا خاصية Edit. ولا داعي لإستخدامها كما في DAO أما بالنسبة لخاصية التحديث Update. فسواءً تم وضعها أو لا النتيجة واحدة. أملا لكم التوفيق في فهم الدروس . في الدرس القادم سنتحدث عن خاصية Bookmark وأهميتها. المرفق التالي يشمل الست أمثلة التي تم مناقشتها حتى الأن. مع الاحترام والتقدير RecordsetLesson_6_Examples.rar
    1 point
  41. السلام عليكم أخواني وأخواتي ، بارك الله فيكم جميعا الأن ننتقل لدرس تحديث السجلات بتقنية DAO في مثالنا التالي سنقوم بوضع ملاحظة لجميع الموظفين الذين يعملون في قسم الإدارة التي رقمها 10 والملاحظة هي أن الموظف مسافر في مهمة. Private Sub Command0_Click() Dim db As Database Dim rst As DAO.Recordset Set db = CurrentDb Set rst = db.OpenRecordset("SELECT EmpNotes FROM Employees WHERE DepId='10'; ", dbOpenDynaset) MsgBox rst.RecordCount & " هذا العدد لا يشير إلى عدد السجلات " rst.MoveLast rst.MoveFirst MsgBox rst.RecordCount & " عدد السجلات في المجموعة المختارة " Do While Not rst.EOF rst.Edit rst!EmpNotes = "مسافر في مهمة" rst.Update rst.MoveNext Loop rst.Close End Sub ملاحظات : 1. في جملة الفتح نلاحظ أننا نستطيع استعمال جملة sql مباشرة وفي هذه الحالة نوع مجموعة التسجيلات يكون Dynaset. 2. نلاحظ أن العدد الذي سنحصل عليه من recordcount قبل عملية الذهاب إلى أخر سجل movelast وثم الرجوع إلى أول سجل هو ليس عدد السجلات الصحيح ، وحتى نحصل على عدد السجلات الصحيح يجب إتباع هذا الأسلوب دائما وبعدها فقط نستطيع أن نعرف عدد السجلات الناتجة من التعريف. 3. قبل تعديل أي حقل في مجموعة التسجيلات يجب جعل السجل في وضع التعديل edit وبعد التعديل يجب عمل Update (تحديث) وإلا لن يتغير شيء. 4. يمكن كتابة الأوامر بدون ذكر اسم مجموعة التسجيلات كل مرة باستخدام with كما يلي Private Sub Command0_Click() Dim db As Database Dim rst As DAO.Recordset Set db = CurrentDb Set rst = db.OpenRecordset("SELECT EmpNotes FROM Employees WHERE DepId='10'; ", dbOpenDynaset) With rst MsgBox .RecordCount & " هذا العدد لا يشير إلى عدد السجلات " .MoveLast .MoveFirst MsgBox .RecordCount & " عدد السجلات في المجموعة المختارة " Do While Not .EOF .Edit !EmpNotes = "مسافر في مهمة" .Update .MoveNext Loop .Close end with End Sub يعني عمل with هو تمكيينا من الرجوع للخصائص العائدة لمجموعة التسجيلات بدون كتابة اسم مجموعة التسجيلات rst في كل مرة. سيلحق هذا الدرس (بإذن الله) نفس المثال ولكن بإستخدام تقنية ADO . مع الاحترام والتقدير Edit_Update_DAO.rar
    1 point
  42. السلام عليكم إخواني ، بارك الله فيكم بينما أنتم في انتظار درس مجموعات التسجلات التالي ، ارجو منكم مطالعة هذا الدرس الخفيف والمهم أولا يوجد 3 أنواع من القيم يجب أن نميز بينها : null : تشير أن المتغير أو الحقل يحتوي على بيانات غير صحيحة . empty : تشير أن المتغير لم يتم إعطاءه قيمة إبتدائية حتى ولو تم تعريفه "" : تعني أن المتغير له قيمة ولكنها النص الفارغ. يعني لكل واحدة معناً مختلف تماما عن الأخرى ، وحتى نفهم الفرق جيدا للنظر إلى المثال التالي : Private Sub example_Click() 1) Dim x As Variant 2) If IsNull(Null) Then MsgBox "Null" Else MsgBox "not null" 3) If IsEmpty(Empty) Then MsgBox "empty" Else MsgBox "not empty" 4) If IsEmpty("") Then MsgBox "empty" Else MsgBox "not empty" 5) If IsNull("") Then MsgBox "Null" Else MsgBox "not null" 6) If IsNull(x) Then MsgBox "Null" Else MsgBox "not null" 7) If IsEmpty(x) Then MsgBox "empty" Else MsgBox "not empty" 8) x = "" 9) If IsNull(x) Then MsgBox "Null" Else MsgBox "not null" 10) If IsEmpty(x) Then MsgBox "empty" Else MsgBox "not empty" 11) x = Null 12) If IsNull(x) Then MsgBox "Null" Else MsgBox "not null" 13) x = Empty 14) If IsNull(x) Then MsgBox "empty" Else MsgBox "not empty" 15) x = Null 16) If IsEmpty(x) Then MsgBox "empty" Else MsgBox "not empty" End Sub في السطر الأول تم تعريف المتغير x في السطر الثاني ستكون النتيجة Null وهذا يعني أنه يوجد قيمة معروفة في أكسيس تسمى Null في السطر الثالث ستكون النتيجة Empty وهذا يعني أن هناك قيمة معروفة في أكسيس تسمى Empty في السطر الرابع ستكون النتيجة not empty لأن "" هو ثابت مع أنه النص الفارغ إلا أنه يعتبر empty حيث أني empty كما ذكرت تعني عدم تعريف المتغير وليس الفراغ. في السطر الخامس النتيجة not null لأن القيمة "" لها معناً وهو النص الفارغ. في السطر السادس النتيجة not null ، صحيح أنه تم تعريف المتغير x ولم يتم تحديد قيمة ابتدائية له وهذا لا يجعل قيمته Null لأنه لا يحتوي على بيانات سواءً صحيحى أو غير صحيحة. في السطر السابع النتيجة empty حيث أن المتغير x منذ تعريفه لم يتم اسناد قيمة له حتى الآن. في السطر الثامن في هذه الجملة تم اسناد قيمة النص الفارغ "" للمتغير x في السطر التاسع وبكل تأكيد هنا النتيجة ليست null حيث أنه يوجد قيمة للمتغير x وهي النص الفارغ "" في السطر العاشر وهنا أيضا النتيجة ليست empty حيث يوجد قيمة تم اسنادها للمتغير x وبغض النظر عن ما هي . في السطر الحادي عشر ، شيء رائع الآن أصبحت قيمة x = null في السطر الثاني عشر وهنا بالتاكيد ستكون النتيجة null في السطر الثالث عشر واللآن لاحظوا بدقة ماذا سنفعل جعلنا قيمة x = empty في السطر الرابع عشر ، هنا ربما تستغربون من النتيجة فالبرغم من قيمة x هي empty من الجملة السابقة إلا أن النتيجة not empty ! أتعرفون لماذا ؟ لأن Isempty يسأل فيما إذا كان المتغير اسند له قيمة أو لا بغض النظر عن القيمة حتى ولو كانت empty. في السطر الخامس عشر وأيضا مرة أخرى نجعل قيمة x= null وذلك لأتبت لكم القاعدة السابقة في السطر السادس عشر ، لاحظو وهنا أيضا قيمة x أيضا not empty لأنه تم اسناد قيمة للمتغير x وهي null. كيف نحفظ هذه القواعد بعد أن فهمنها وجربنا نتائجها : لا تدعو ترجمة المعنى الحرفية تخدعكم حيث أن null ، empty ، "" إذا ترجمت ستعطي معناً واحدأ وهو (لا شيء أو فراغ) هذا الكلام خطأ وهو الخطأ الذي يقع به الكثيرين . تذكروا دائما التعريفات التي بدأت فيها الدرس ولن تخطئوا باستخدام هذه القواعد أبداً. مرفق التطبيق . مع الاحترام والتقدير Null_Empty_DblQoutes.rar
    1 point
  43. السلام عليكم إخواني وأخواتي ، بارك الله فيكم جميعاً درسنا اليوم حول نفس الموضوع السابق وهو استنساخ مجموعة التسجيلات بواسطة Recordsetclone ولكن هذه المرة مع ADO . قد يظن البعض أن الأمر في غاية البساطة وذلك باستخدم نفس المثال السابق مع تغيير السطر التعريف الأساسي Dim rstEmployees As DAO.Recordset إلى Dim rstEmployees ADODB.Recordset حسناً هكذا يبدو الأمر ، جربوه ولن ينجح حيث ستحصلون في الجملة Set rstEmployees = Me.Form.RecordsetClone على الخطأ Type mismatch أي أن الأنواع غير متوافقة يعني المجموعة المستنسخة من نوع أخر وهذا صحيح ! ، أنسيتم السطرين السابقين باللون الأحمر ، فأنا لم ألونهما جزافاً واعيدهما هنا مرة أخرى للتذكير من المهم ملاحظة أن نوع مجموعة التسجيلات التي يتم تعريفها في وضع التصميم في قاعدة البيانات mdb. هي بشكل تلقائي DAO Recordset ، أما في مشروع أكسيس فتكون ADO Recordset إذاً هذا هو السبب أن مصدر السجلات الذي عرفنه في النموذج والذي سيمثل مجموعة التسجيلات سيكون من النوع DAO . حسناً ، الحل بسيط نرجع للمراجع ونجعل مرجع ADO يسبق مرجع DAO بالتعريف وهكذا يتم تحديد نوع مجموعة التسجيلات من نوع ADO ، جربوه وللأسف لن ينجح ، و ياليت الحل كان بهذه البساطة! ماذا نجري الأن ؟ لم يبقى لنا إلا أن نفعل شيء واحد ونأمل أن ينجح وهو حذف المرجع DAO (عدم اختياره من ضمن المراجع) ، جربوا ذلك ، ويا للعجب ، حتى أننا بعد حذف المرجع كاملا لم يتم تعريف مجموعة التسجلات المرتبطة بالنموذج من نوع ADO . ماذا سنعمل إذن ، أولا سنحفظ القاعدة التي في اللون الأحمر حتى لا نتعب أنفسنا أكثر حيث لا يوجد طريقة نهائيا في وضع التصميم لجعل النموذج يرتبط بمجموعة تسجيلات غير DAO . ثأنيا ، لا تبتأسوا كثيرا حيث يوجد حل وهو رائع جدا وهو كما يلي وأيضاً يمكن اعتباره قاعدة ويجب حفظه غيباً. إذا أردنا أن نجعل مجموعة التسجيلات لنموذج في قاعدة mdb. تعمل بتقنية ADO يجب عمل الخطوات الثلاث التالية. 1. في وضع التصميم للنموذج نلغي مصدر السجل Record source للنموذج (أي نجعله بدون مصدر) . 2. في حدث الفتح للنموذج نضع الكود التالي بدون تغيير سوى بمصدر السجل الذي هو في مثالنا جدول employees : Private Sub Form_Open(Cancel As Integer) Dim rst As ADODB.Recordset, cn As ADODB.Connection Set rst = New ADODB.Recordset rst.ActiveConnection = CurrentProject.Connection rst.CursorType = adOpenDynamic rst.CursorLocation = adUseClient rst.Open "employees", , adOpenKeyset, adLockOptimistic, adCmdTable Set Me.Recordset = rst End Sub 3. في حدث الإغلاق للنموذج نضع الكود التالي : Private Sub Form_Close() Dim cn As ADODB.Connection Set cn = Me.Recordset.ActiveConnection cn.Close Set cn = Nothing End Sub وبعدها سيختفي الخطأ Type mismatch الذي تحدثنا عنه في بداية الدرس وإليكم الحل كاملا كما طرحته تماما هنا في المرفق التالي : مع احترامي وتقديري لكم RecordsetLesson2.rar
    1 point
  44. السلام عليكم ، إخوان وأخواتي ، بارك الله فيكم جميعاً في هذا الجزء من الدرس سيتم إلقاء الضوء على تقنيات طرق التعامل مع مجموعات التسجيلات المختلفة في فيجوال بيسك وهي بشكل من الجديد إلى القديم ADO و DAO و RDO : في فيجول بيسك ، يتوفر هذه الواجهات (تقنيات اتصال) للوصول للبيانات : 1. ActiveX Data Objects (ADO) 2. Data Access Objects (DAO) 3. Remote Data Objects (RDO) وكل من هذه الثلاثة تمثل كائن من كائنات الوصول للبيانات بوجوه مختلفة ، وباستخدام VBA بإمكانك برمجيا التحكم بالاتصال ، بنى الجمل ، والبيانات التي سيتم إرجاعها للاستخدام في التطبيق. السؤال هو ؟ لماذا هناك 3 طرق للوصول للبيانات في الفيجوال بيسك ؟ من المعروف أن طريق الوصول للبيانات تتطور بشكل متواصل وكل طريقة من هذه الطرق تمثل مرحلة من المراحل الفنية في هذا التطور . الأخيرة (الأحدث) هي ADO ، والتي من خصائصها البساطة - ورغم البساطة الأكثر مرونة – من كلا RDO أو DAO . للمشاريع الجديدة ، ينصح بشدة اعتماد ADO كواجهة (تقنية) الوصول للبيانات. هذه النصيحة ليست من خضر الرجبي ولكن من ميكروسوفت نفسها وهنا المرجع http://msdn.microsoft.com/library/default....dwithrdodao.asp أما بالنسبة لي فكما ذكرت سابقا أن أنصح الجميع بمعرفة القديم والجديد وقد وضعت المبررات لذلك وأنا ماض بتعريفكم على ADO و DAO بإذن الله كما وعدت سابقا. لماذا نستخدم ADO ؟ تم تصميم ADO بأبسط مستوى اتصال في ميكروسوفت مع OLE DB ، و OLE DB توفر كفاءة عالية في الوصول إلى أي مصدر بيانات ، سواءً في قواعد البيانات العلائقية أو غير العلائقية (لعلمكم يوجد قواعد بيانات تسمى الشبكية و المهيكلة وهي الجيل السابق من قواعد البيانات) ، وكذلك من مصادر البيانات أنظمة الملفات والبريد الإلكتروني ، والبيانات النصية والرسومية ، وكائنات الأعمال المخصصة ، وغيرها من المصادر. ADO صممت لملائمة الحد الأدنى من التراسل عندما نتعامل مع بيئة وسيناريوهات الإنترنت ، وأيضا تضع الحد الأدني من الطبقات بين واجهة التطبيق النهائية يعني للمستخدم وبين مصدر البيانات – كل ذلك ضمن واجهة خفيفة ذات كفاءة عالية. وكذلك ADO تستعمل طرق محادثة وخصائص مشابهة لتلك في DAO و RDO ، مع تبسيط منطق هذه الطرق وذلك من أجل التسهيل على المستخدم . ماذا بشأن DAO و RDO ؟ من أجل التوافقية (compatibility) ولدعم المشاريع السابقة استمرت فيجوال بيسك بدعم DAO و RDO للمشاريع القائمة. مقارنة ADO مع RDO و DAO : ADO ليست متواقة-الكود تلقائيا مع تطبيقاتك التي تستعمل طرق الوصول للبيانات السابقة . بينما كبسلة (encapsulation) تتضمن العمليات المتوفرة في كل من ADO و RDO ، يجب عليك تحويل الكثير من عناصر اللغة لاستعمال قواعد ADO في مشروع كان يستخدم DAO إن أحببت التحويل. في بعض الحالات ، هذا يعني تحويل بعض الإقترانات فقط ، وفي البعض الأخر قد تحتاج لبناء التطبيق كاملا من جديد باستخدام خصائص ADO الجديدة. DAO (Data Access Objects) : هي أول واجهة كائنات-مرئية object-oriented تعامل به محرك قاعدة بيانات ميكروسوفت Jet والتي مكنت مستخدمي فيجوال بيسك من الوصول إلى الجداول الأكسيس مباشرة وكذلك لقواعد بيانات أخرى من خلال ODBC . لا شك أن DAO هي الأنسب لتطبيق يعمل على جهاز واحد وكذلك الأنسب لمؤسسة صغير منفردة. RDO (Remote Data Objects) : هو كائن-مرئي يستخدم في التواصل مع ODBC بشكل موحد ومستثمرا لسهولة DAO، للكائن RDO حدوديات ، ورغم ذلك ، أثبت أفضلية استعماله مع بعض المحركات المشهورة مثل SQL Server, Oracle . ADO هو الجيل الجديد واللاحق DAO/RDO . عمل ADO أقرب ما يكون من RDO ، وعادة يوجد الكثير من التشابه في طرق الاستعمال. نستطيع القول بأن ADO حل محل الكائنين معا . ومن الممكن في البداية أن تظن أن التعامل مع ADO صعبا إلا أنك ستكتشف بإن طريقة بناءه المهيكلة ستجعل من السهولة بمكان التعامل مع ببساطة شديدة . من المهم ملاحظة أيضا أن ADO حالياً لا يدعم جميع إقترانات DAO ، وهو يحتوي اسلوب الدعم أكثر المتوفر في RDO للتفاعل مع مصادر بيانات OLE DB بالإضافة لدعم المصادر البعيدة وكذلك تكنولوجية DHTML. بشكل عام ، ربما ما زال مبكرا الرحيل إلى استعمال ADO بشكل كامل (بإستثناء أولئك الذين يستعملون ODBCDirct) ، حيث أن ADO لا تدعم بشكل كامل data definition (DDL)، المستخدمين, المجموعات ، على كل الأحول إذا كنت تستخدم DAO فقط في تطبيقات client-server الخادم-الزبون ولا تعتمد عليه في لغة تعريف البيانات بشكل اساسي ، فربما حان الوقت. خلاصة القول : وهذا رأيي الشخصي ، أنه قد حان الوقت بالتأكيد لمن لم يعرف عن الاثنين للتعرف على الاثنين معا حتى يواكب القديم والحالي والقادم من التطبيقات . ولكم مني كل الاحترام والتقدير
    1 point
  45. السلام عليكم إخواني وأخواتي ، بارك الله فيكم جميعا الملحق 2 : نهاية درس الحلقات التكرارية . 1. يجدر الإشارة إلى تركيب أخر دوراني يندر استعماله حيث أن كفاءة الدورانات السابقة أكثر منه ولأنه لا يحتوي على طريقة للخروج إلا بتحقق شرطه وهو التركيب التالي : While condition [statements] Wend ويعمل طالما تحقق الشرط condition وبقي محققا يعني true فسيستمر تنفيذ التعليمات statements وعندما يصبح الشرط false يتنهي الدوران ولنأخذ مثالا عليه : لو أردنا أن نقوم بقراءة مجموعة كلمات وطباعة هذه الكلمات في النهاية على شكل جملة بحيث تنتهي القراءة عند إدخال كلمة توقف فيكون المثال كما يلي : Private Sub PrintStatement_Click() Dim W, Stat As String Stat = "" W = "" While Not W = "توقف" W = InputBox("أدخل كلمة") Stat = Stat & " " & W Wend MsgBox Left(Stat, Len(Stat) - 4) End Sub لاحظوا أننا طبعنا في النهاية قيمة state المتغير النصي الذي سيحتوي على كل الكلمات ولكن - 4 أي بدون الأربعة الحروف الأخيرة لأنها ستكون الكلمة توقف . 2. الخروج من الحلقات الدورانية: بشكل عام وكما لاحظنا في الدرس الأول فإن الخروج من الحلقة المشروطة يتم عندما يتحقق الشرط المطلوب للخروج وكذلك الحال بالنسبة للحلقات غير المشروطة for ... next فإن الخروج يتم عند اتمام عدد المرات للدوران. يمكن في كل الأحول ما عدا في (while ... wend) استخدام الخروج المباشر exit for أو exit do ومن أي مكان داخل الحلقة ، ويتم الخروج إلى الجملة التي تلي الحلقة مباشرة. فمثلا في مثال تحديد فيما إذا كان نموذج ما (معروف اسمه) مفتوحا أو لا سيترتب علينا عمل دورة ندور بها في كل النماذج ونفحص بها إذا كان النموذج مفتوحا أو لا ، والسؤال المفيد الذي يطرح نفسه هنا لماذ نستمر في الدوران إذا وجدنا النموذج المطلوب مفتوحاً، بكل تأكيد أن الجواب هو لا داعي للإستمرار في الدوران لأن ذلك سيكون مضيعة للوقت ، ويجب الخروج الفوري من الدوران . وللنظر إلى الإقتران التالي : Function IsOpen(ByVal MyFormName As String) As Boolean Dim i IsOpen = False For i = 0 To Forms.Count - 1 If Forms(i).FormName = MyFormName Then IsOpen = True Exit For End If Next i End Function وطريقة طلب الإقتران ستكون كما يلي : Private Sub FormCmd_Click() MsgBox IsOpen("form1") End Sub لاحظ أيضا أن هذا المثال يبين أنه يمكن استخدام exit من داخل if ، وكذلك يمكن استعمالها داخل جملة select إذا كان داخل دوران. 3. التكرار (الدوران) المتداخل Nested Loops مما لا شك فيه أن الدوران يمكن أن يتداخل ولنأخذ مثال على ذلك : نريد أن نقرأ من المستخدم كلمة فإذا كانت واحد يطلب منا إدخال رقم وإذا كانت أثنين يطلب منا إدخال رقمين وهكذا حتى خمسة وإذا طبعنا أي شيء غير واحد إلى خمسة يتوقف العمل وفي النهاية يطبع لنا مجموع جميع الأرقام التي تم إدخالها Private Sub AddAll_Click() Dim w As String Dim out As Boolean sum = 0 Do w = InputBox("الرجاء إدخال عدد الأرقم التي تريد جمعها واحد إلى خمسة أو اي شيء اخر للخروج") Select Case w Case "واحد": last = 1 Case "اثنين": last = 2 Case "ثلاثة": last = 3 Case "اربعة": last = 4 Case "خمسة":: last = 5 Case Else: last = 0 out = True End Select For i = 1 To last sum = sum + InputBox("أدخل رقم") Next i Loop Until out MsgBox "المجموع هو " & sum End Sub لاحظوا أنه في case else 1> تم تعيين قيمة out = true وذلك للخروج من الحلقة الخارجية المسؤولة عن إدخال الكلمات حيث ان هذه الحالة case يتم الدخول إليها في حال أدخلنا كلمة غير من واحد إلى خمسة. 2> تم تعيين قيمة last =0 حتى لا يتم تنفيذ الدوران for .. next لأنه يبدأ من 1. أترككم الآن مع هذا الدرس وسأذهب لأعد لكم درس جديد سيكون عن مجموعة التسجيلات فانتظروني ... :d مع الاحترام والتقدير ex1_re2.rar
    1 point
  46. السلام عليكم إخواني ، بارك الله فيكم وشكراً على تثبيت الموضوع ملحق الدرس الأول : بالنسبة للحلقات المشروطة لا يوجد طرق أخرى . وقاعدة كتابة هذه الجمل بشكلها المتكامل هو كما يلي : Syntax Do [{While | Until} condition] [statements] [Exit Do] [statements] Loop Or, you can use this syntax: Do [statements] [Exit Do] [statements] Loop [{While | Until} condition] بالنسبة للحلقات غير المشروطة على غرار for ... next يوجد أيضا تركيب أخر مهم لا نستطيع تجاهله وهو for each ... next وكمثال عليه أقدم لكم ما يلي : هذا الموضوع يتماشى مع Access 2002 و Access 2003 يستفاد من هذا الموضوع معرفة طريقة إضافة الطابعات المحملة (المعرفة) لجهاز الحاسوب إلى مربع تحرير وسرد (combo box) باستخدام البرمجة بلغة(VBA) . خطوات الطريقة هي : 1. ندخل إلى خصائص مربع التحرير والسرد ونضغط لسان التبويب الكل (All tab). 2. نغير قيم الخصائص كما يلي : نضع في خاصية الاسم (Name) الاسم dPrinter نختار في خاصية نوع مصدر الصف (Row Source Type) قائمة الحقول (Value List) نضع في حدث عند التحميل للنموذج (On Load) الكود التالي: Private Sub Form_Load() Dim prt As Printer For Each prt In Application.Printers Me!dPrinter.AddItem prt.DeviceName Next End Sub ملاحظة(1): عندما نضيف (نحمل) عناصر لمربع التحرير والسرد بالبرمجة (كما في المثال السابق) فإن العناصر لا تترتب أبجديا وإنما حسب ترتيب التحميل طبعا هناك حل لهذا الأمر أيضا، أرجو من الإخوة الأعضاء التفكير في الحل. ملاحظة(2): انتبه إلى طريقة استخدام (AddItem). الخلاصة : تم إضافة الطابعات المعرفة إلى مربع التحرير والسرد برمجيا وهذا مجرد مثال لأفكار كثيرة يمكن تطبيقها بنفس التقنية والشيء الممتع في هذه التقنية أن نتيجتها متواصلة التغير (Dynamic) أي كلما تغيرت تعريفات الطابعات تتغير محتويات مربع التحرير والسرد. مع الاحترام والتقدير
    1 point
×
×
  • اضف...

Important Information