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

محمد حجازي

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

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

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

  • Days Won

    2

كل منشورات العضو محمد حجازي

  1. السلام عليكم ... تتطلب هذه الدالة وجود الوظيفة الإضافية Analysis ToolPak
  2. السلام عليكم ... إذا كان قصدك جعل التاريخ يظهر كالأرقام العشرية ، فيمكنك ذلك عن طريق تغيير إعدادات الويندوز ، فقط اتبع الخطوات التالية : Control Panel > Regional and Language Options في علامة التبويب Regional Options اضغط على الزر Customize ليظهر لك فورم جديد : تحت لسان التبويب Time : - في المربع Time format ضع التنسيق التالي : h:m:s tt - في المربع Time separator ضع الرمز الذي تريد استخدامه للفصل بين الساعات و الدقائق و الثواني . الكلام السابق كان تحت نظام الويندوز XP. بالتوفيق
  3. السلام عليكم ... انقر على الخيار Options الموجود في القائمة Tools لتظهر لك نافذة : تحت لسان التبويب Mail Setup و ضمن المجموعة Data Fils انقر على الزر Data Fils لتظهر لك نافذة جديدة تحتوي على مسار المجلد الخاص بالمعلومات . اضغط على الزر Open Folder ليفتح لك المجلد . قم بنسخه على هارد آخر و عاود لصقه بعد فرمتة الجهاز وتنزيل النظام (مع مراعاة عنوان المجلد على النسخة الجديدة) . ملاحظة : هذه الطريقة مجربة على البرنامج Outlook Express و لا أعرف فيما إذا كانت فعالة على Microsoft Office Outlook ، و كما أنصحك قبل الفورمات بأن تحفظ عناوين الأشخاص المسجلين عندك بواسطة خيارات التصدير المختلفة ، وذلك لأن الطريقة السابقة تحتفظ بمجلدات الرسائل الموجودة في الـ Outlook Express دون العناوين.
  4. السلام عليكم ... طيب جرب هذه محبوكة أكتر :d Exam.zip
  5. السلام عليكم ... الأخ أحمد العيسى ، لا أعرف بالضبط إذا كان هناك إصدار خاص بهذه النسخة من الويندوز . على أية حال فالملف حصلت عليه من الوصلة التالية : http://toolbar.google.com/gmail-helper/ و لمزيد من الأدوات راجع الرابط التالي : http://www.google.com/downloads تحياتي
  6. السلام عليكم ... الأخوة skyblue و hussein_abd ، تم إرسال الدعوات.
  7. السلام عليكم ... عند استخدام المحرر و لصق النص الناتج في المربع الموجود في المنتدى تظهر عندي الحروف بصورة غير مفهومة . الرجاء مساعدتي لحل مشكلة الاختلاف في الترميز .
  8. السلام عليكم ... أرجو إرفاق مثال لمشكلتك في قسم التحميل المؤقت للأعضاء ، وذلك حتى يتمكن الأعضاء من فهم المشكلة بصورة واضحة.
  9. السلام عليكم .... جرب التعديل التالي : Public NewWorkbok As Object Sub SaveSheet() On Error GoTo NoSave Dim NumberSheets() As Integer Set NewWorkbok = Workbooks.Add Workbooks("Book1").ActiveSheet.Copy Before:=Workbooks(NewWorkbok.Name).Sheets(1) ReDim NumberSheets(2 To NewWorkbok.Worksheets.Count) For i = 2 To NewWorkbok.Worksheets.Count NumberSheets(i) = i Next i Application.DisplayAlerts = False With NewWorkbok .Sheets(NumberSheets).Delete Application.DisplayAlerts = True .SaveAs Filename:=Workbooks("Book1").Path & "\" & Workbooks("Book1").ActiveSheet.Range("A1").Value .Close End With Exit Sub NoSave: If Err = 1004 Then Application.DisplayAlerts = False NewWorkbok.Close Application.DisplayAlerts = True Else MsgBox Err.Description End If End Sub و لكن انتبه إلى أن المصنف هو باسم Book1 و أن اسم المصنف الجديد موجود في الخلية A1 من الورقة النشطة (التي تريد حفظها).
  10. السلام عليكم ... شكراً لك يا أخي على هذه الميزة التي أفادتني كثيراً . و إليك هذه الميزة (الإبلاغ عن الرسائل الجديدة دون الدخول إلى الـ GMAIL). الحقيقة فإن الـ gmail يقدم مزايا مبهرة في كل مرة . GmailInstaller.rar
  11. السلام عليكم ... بالنسبة لمشكلتك الثانية : يمكنك حلها عن طريق الدالة DSUM ، مرفق المثال معدل (بالنسبة للمشكلة الثانية) : customers.rar
  12. السلام عليكم ... يجب أن يكون لديك مساحة في إحدى السيرفرات لكي تستطيع عرض الصور . سجل في موقع جيران أو الياهو و حمل الصور و ضع رابطها عندما يحتاجها محرر المنتدى . هذه المشكلة تكمن في تحويل نظام الترميز الموجود في الاكسل من A1 إلى R1C1 ، الرجاء مراجعة الأكواد لمعرفة السطر الذي يقوم بهذا العمل و العمل على معالجته.
  13. راجع الرابط التالي : http://www.officena.net/ib/index.php?showtopic=7876 جرب الكود : Public NewWorkbok As Object Sub SaveSheet() On Error GoTo NoSave Dim MyPath As String Dim NumberSheets() As Integer MyPath = Application.GetSaveAsFilename(InitialFileName:="officena", FileFilter:="Excel Files (*.xls), *.xls", Title:="أدخل اسم الملف الذي تريد حفظه") If MyPath = "False" Then Exit Sub Set NewWorkbok = Workbooks.Add Workbooks("16834").ActiveSheet.Copy Before:=Workbooks(NewWorkbok.Name).Sheets(1) ReDim NumberSheets(2 To NewWorkbok.Worksheets.Count) For i = 2 To NewWorkbok.Worksheets.Count NumberSheets(i) = i Next i Application.DisplayAlerts = False With NewWorkbok .Sheets(NumberSheets).Delete Application.DisplayAlerts = True .SaveAs Filename:=MyPath .Close End With Exit Sub NoSave: If Err = 1004 Then Application.DisplayAlerts = False NewWorkbok.Close Application.DisplayAlerts = True Else MsgBox Err.Description End If End Sub الموجود في الرابط ارابط التالي : http://www.officena.net/ib/index.php?showtopic=7581 لا أعتقد أنك بحاجة لهذا الكود ، وذلك لأن الرسائل التي سيظهرها الكود لن تختلف أبدأ عن معالج الطباعة الخاص بالاكسل .
  14. السلام عليكم ... جرب الكود التالي : Sub MyPrint() Application.ScreenUpdating = False With Sheets("Sheet1") With .Range("A4:F3249") .Sort Key1:=.Cells(1, 2), Order1:=xlAscending For i = 1 To .Rows.Count If Application.WorksheetFunction.CountIf(.Rows(i), "") >= 6 Then .Rows(i).Hidden = True End If Next i End With .PrintOut .Rows.Hidden = False End With Application.ScreenUpdating = True End Sub ولكن انتبه إلى ما يلي : 1. لا حظ (من الكود) أن اسم الورقة هو Sheet1 (يمكن تغييره). 2. بالنسبة لتكرار الصفوف الثلاثة الأولى ، يمكنك ذلك عن طريق ما يلي : انقر على الخيار Page Setup الموجود ضمن القائمة File لتظهر لك نافذة : ضمن علامة التبويب Sheet حدد الصفوف المراد تكرارها عند طباعة كل صفحة (وكذلك الأعمدة) .
  15. السلام عليكم ... في علم الذكاء الاصطناعي ، هناك لعبة تسمى لعبة الشجرة و الأغصان . اللعبة مفادها أنه يتم قطع الغصن الذي لا يحقق الشرط (حذف الاحتمال المستحيل) من الاختبار ، وبذلك فإن مساحة الاختبار لا تنفتئ أن تتقلص . هذه الطريقة استخدمت في بناء لعبة الشطرنج التي غلبت كسباروف. الخلاصة : لا يوجد ضرورة لاختبار المجال من اليمين و اليسار (عن طريق التعليمة AND) و يكتفى بالاختبار من جهة واحدة. راجع الرابط : http://www.officena.net/ib/index.php?showtopic=7757
  16. السلام عليكم ... بالنسبة لي ، لم تظهر عندي أي رسالة خطأ . قد يكون الخطأ (كما قال الأخ هنداوي) في تعريف مراجع الفيجوال.
  17. 3. الفرق بين Range و Cells : - يستخدم الأسلوب Range للإشارة إلى مجال الخلايا و ذلك عن طريق كتابة المجال باستخدام نظام الترميز A1 (تتم الإشارة إلى خلية ما بإدخال حرف العمود متبوعاً برقم الصف) ، لاحظ الأكواد التالية : Sub Test1() Sheets("Sheet1").Range("A1").ClearContents End Sub الكود السابق يقوم بمسح القيم الموجودة في الخلية A1 . Sub Test2() Sheets("Sheet1").Range("B2:C5").ClearContents End Sub الكود السابق يقوم بمسح القيم الموجودة في المجال B2:C5 . Sub Test3() Sheets("Sheet1").Range("A2:B3,D3,E5:G7,H11").ClearContents End Sub الكود السابق يقوم بمسح القيم الموجودة في المجالات A2:B3 ، D3 ، E5:G7 ، H11 . - أما الأسلوب Cells فيستخدم للإشارة إلى الخلايا المختلفة عن طريق كتابة رقم صف الخلية يليه رقم العامود ، لاحظ الكود التالي : Sub Test4() Sheets("Sheet1").Cells(2, 5).ClearContents End Sub الكود السابق يقوم بمسح القيم الموجودة في الخلية الواقعة في الصف الثاني و العامود الخامس من الورقة Sheet1 (أي الخلية E2). بالنسبة لقدرة الأسلوب Cells على الإشارة للمجالات المختلفة فهي محدودة ، ولا يستطيع ذلك إلى عن طريق الاستعانة بالأسلوب Range ، لاحظ الكود التالي : Sub Test5() Sheets("Sheet1").Range(Cells(2, 3), Cells(5, 7)).ClearContents End Sub الكود السابق يقوم بمسح القيم الموجودة في المجال C2:G5 الموجود في الورقة Sheet1 . مما سبق فإنه يبدو لنا أن التعامل مع الأسلوب Range هو أسهل بكثير من التعامل مع مثيلها Cells ، ولكن مهلاً ....... فالأسلوب Cells يمتلك مرونة عالية في التعامل مع الأهداف المتغيرة ، لاحظ الكود التالي : Sub MultiplicationTable1() Dim i As Byte, ii As Byte With Sheets("Sheet1") For i = 1 To 10 For ii = 1 To 10 .Cells(i, ii) = i * ii Next ii Next i End With End Sub الكود السابق هو كود مدرج في أحد مشاركاتنا السابقة ، ويقوم بإنشاء جدول الضرب في الورقة Sheet1 . لاحظ مقدار المرونة الذي يوفره لنا الأسلوب Cells ، و فكر بالصعوبات التي من المحتمل أن تواجهنا عند استخدام الأسلوب Range (و خصوصاً عند التعامل مع ترتيب الأعمدة) . مثال آخر يظهر مرونة الأسلوب Cells : بفرض أن لدينا جدول متوضع بين العامودين B و E ، ونريد إنشاء زر أمر لمسح قيم أي سجل بالاعتماد على رقمه . بالاعتماد على الأسلوب Cells فإننا نستطيع كتابة الكود التالي : Sub DeleteRecord1() Dim NumberRow As Long NumberRow = Application.InputBox(prompt:="ادخل رقم الصف", Title:="رقم الصف", Type:=1) If NumberRow = False Or NumberRow > 65536 Then Exit Sub Sheets("Sheet1").Range(Cells(NumberRow, 2), Cells(NumberRow, 5)).ClearContents End Sub الآن إذا أردنا الاعتماد على الأسلوب Range في الكود السابق عوضاً عن الأسلوب Cells ، فإننا سنحتاج لتعريف متغير إضافي MyRange من نوع نص و كتابة سطر إضافي لإنشاء المرجع المطلوب قبل استخدامه في الأسلوب Range ، لاحظ الكود التالي : Sub DeleteRecord2() Dim NumberRow As Long Dim MyRange As String NumberRow = Application.InputBox(prompt:="ادخل رقم الصف", Title:="رقم الصف", Type:=1) If NumberRow = False Or NumberRow > 65536 Then Exit Sub MyRange = "B" & NumberRow & ":E" & NumberRow Sheets("Sheet1").Range(MyRange).ClearContents End Sub بنظرة بسيطة نلاحظ أ الكود الأول هو أكثر كفاءة من الكود الثاني . لأخذ العلم ، فإن الطريقة السابقة أدرجت لتبيان الفرق بين الأسلوبين ، وذلك مع العلم بأنه يمكن حل المشكلة السابقة بطريقة أكثر بساطة و ذلك إذا ما اعتمدنا على الأسلوب Offset . ملاحظات هامة جداً عن الأسلوبين Cells و Range : 1. عندما تجري عملية مناقلة بين خلايا معينة ، فإنه لا يشترط استخدام نفس الأسلوب للإشارة إلى الخلايا أو النطاقات في كلتا المجموعتين : فمثلاً إذا أردنا لصق قيم المجال A1:A5 في المجال B1:B5 فإننا نستطيع عمل ذلك باستخدام أي طريقة من الطرق التالية : Sub Test6() With Sheets("Sheet1") Range("B1:B5").Value = Range("A1:A5").Value End With End Sub Sub Test7() With Sheets("Sheet1") Range(Cells(1, 2), Cells(5, 2)).Value = Range(Cells(1, 1), Cells(5, 1)).Value End With End Sub Sub Test8() With Sheets("Sheet1") Range(Cells(1, 2), Cells(5, 2)).Value = Range("A1:A5").Value End With End Sub Sub Test9() With Sheets("Sheet1") Range("B1:B5").Value = Range(Cells(1, 1), Cells(5, 1)).Value End With End Sub 2. قدرة كلا الأسلوبين Cells و Range على التكيف مع مجموعات الأهداف المختلفة : وهذه برأيي أهم ميزة يمتلكها هذين الأسلوبين ، وتقوم هذه الميزة على أن الأسلوب يشير للموضع النسبي للهدف المحتضن بالاعتماد على الهدف الحاضن له . لفهم هذه الميزة بشكل أوضح لاحظ الكودين التاليين : Sub Cells_Place1() Dim MyRange As Range Set MyRange = Sheets("Sheet1").Range("C5:H10") Sheets("Sheet1").Cells(1, 1).Value = "هذه الخلية الأولى من الورقة Sheet1" MyRange.Cells(1, 1).Value = "هذه الخلية الأولى من المجال MyRange" End Sub Sub Cells_Place2() Dim MyRange As Range Set MyRange = Sheets("Sheet1").Range("C5:H10") Sheets("Sheet1").Range("A1").Value = "هذه الخلية الأولى من الورقة Sheet1" MyRange.Range("A1").Value = "هذه الخلية الأولى من المجال MyRange" End Sub نلاحظ أن الأسلوبين Cells و Range قد اعتمدا على كل من الهدفين Sheet1 و MyRange ـ (C5:H10) من أجل تحديد الهدف الناتج (المحتضن) . بالنسبة لي ، فإنني أعتقد أن الأسلوب Cells أقدر على التعامل مع هذه الميزة بصورة أكثر كفاءة ، لاحظ الكود التالي : Sub Cell_Index() On Error GoTo NoRange Dim MyRange As Range Dim NumberRow As Long Dim NumberColumn As Long Set MyRange = Application.InputBox(prompt:="أدخل مجال الخلايا الذي تريده", Title:="مجال الخلايا", Type:=8) On Error GoTo 0 For NumberRow = 1 To MyRange.Rows.Count For NumberColumn = 1 To MyRange.Columns.Count MyRange.Cells(NumberRow, NumberColumn).Value = NumberRow & "×" & NumberColumn Next NumberColumn Next NumberRow Exit Sub NoRange: If Err = 424 Then Exit Sub Else MsgBox Err.Description End If End Sub الكود السابق يقوم بإدراج ترتيب كل خلية (رقم صفها و عامودها) وذلك بالنسبة للهدف الحاضن MyRange . لا تقلق أخي إذا لم تفهم هذه الميزة بصورة كاملة ، وذلك لأن لنا عودة معها عندما نقوم بشرح الأسلوبين CurrentRegion و UsedRange . تحياتي
  18. السلام عليكم ... حسب فهمي لسؤالك فإن حل مشكلتك يكمن في السطرين التاليين : Sheets("Result").Cells(EndRow + 1, 1) = .Cells(ii, 1).Value Sheets("Result").Cells(EndRow + 1, 2) = .Cells(ii, 2).Value و يمكنك هنا إضافة أسطر بعدد الأعمدة الموجودة لديك ، وذلك طبعاً مع الانتباه لتغيير ترتيب العامود (المتغير الثاني في الأسلوب Cells). جرب ما قلته لك و أخبرني بالنتيجة. تحياتي
  19. السلام عليكم ... الأخ صالح ، تم ارسال الدعوة
  20. السلام عليكم ... تم نقل الموضوع لقسم الوورد العام
  21. 6. طرق أخرى لتجنب الهدر الناتج عن إبقاء العديد من الجمل داخل الحلقات التكرارية : تحدثنا في المشاركة السابقة عن كيفية استخدام الجملة With من أجل التقليل من الاستدعاء المتكرر للأهداف و الأساليب داخل الحلقات التكرارية ، و بقي لدينا في هذا الدرس ذكر بعض الطرق الفنية الإضافية التي يمكننا من خلالها التقليل من استدعاء هذه الأهداف و الأساليب من داخل الحلقات التكرارية : قارن بين الكودين التاليين : Sub Test1() Dim i As Integer With Sheets("Sheet1") For i = 2 To 100 .Cells(i, 1).Value = .Cells(1, 1).Value * i Next i End With End Sub Sub Test2() Dim i As Integer Dim MyNumber As Double With Sheets("Sheet1") MyNumber = .Cells(1, 1).Value For i = 2 To 100 .Cells(i, 1).Value = MyNumber * i Next i End With End Sub لاحظ أخي أننا في الكود الأول قمنا باستدعاء القيمة الموجودة داخل الخلية A1 باستخدام الجملة التالية : .Cells(1, 1).Value و قد اضطررنا إلى استدعاء نفس الأسلوب السابق (و بالتالي نفس القيمة) 99 مرة في الكود الأول ، وهذا طبعاً سيقلل من سرعة هذا الكود. لحل المشكلة السابقة قمنا في الكود الثاني بتعريف المتغير MyNumber و تخصيص القيمة الموجودة في الخلية A1 بداخله ، وبهذا فإننا لم نضطر للتعامل مع الهدف A1 بصورة مباشرة سوى مرة واحدة فقط ، واستبدلنا ذلك بالتعامل مع القيمة المخزنة داخل المتغير MyNumber ، وهذا بالطبع سيزيد من سرعة الكود . هذه حالة أخرى أكثر تعقيداً ، يمكنك التعرف عليها بصورة أدق عن طريق مراجعة الشرح الموجود في الملف المرفق : الكود الأول : Sub Test3() With Sheets("Sheet2") For Each MyCell In .Range("B2:B11").Cells If MyCell.Value > 90000 Then .Cells(MyCell.Row, 3).Value = .Cells(2, 8).Value * 0.3 .Cells(MyCell.Row, 4).Value = .Cells(3, 8).Value * 0.7 .Cells(MyCell.Row, 5).Value = .Cells(4, 8).Value * 0.85 ElseIf MyCell.Value > 60000 Then .Cells(MyCell.Row, 3).Value = .Cells(2, 8).Value * 0.25 .Cells(MyCell.Row, 4).Value = .Cells(3, 8).Value * 0.4 .Cells(MyCell.Row, 5).Value = .Cells(4, 8).Value * 0.65 Else .Cells(MyCell.Row, 3).Value = .Cells(2, 8).Value * 0.2 .Cells(MyCell.Row, 4).Value = .Cells(3, 8).Value * 0.3 .Cells(MyCell.Row, 5).Value = .Cells(4, 8).Value * 0.5 End If Next MyCell End With End Sub الكود الثاني (المعدل) : Sub Test4() With Sheets("Sheet2") Group1 = Array(.Cells(2, 8).Value * 0.2, .Cells(3, 8).Value * 0.3, .Cells(4, 8).Value * 0.5) Group2 = Array(.Cells(2, 8).Value * 0.25, .Cells(3, 8).Value * 0.4, .Cells(4, 8).Value * 0.65) Group3 = Array(.Cells(2, 8).Value * 0.3, .Cells(3, 8).Value * 0.7, .Cells(4, 8).Value * 0.85) For Each MyCell In .Range("B2:B11").Cells If MyCell.Value > 90000 Then .Range(Cells(MyCell.Row, 3), Cells(MyCell.Row, 5)).Value = Group3 ElseIf MyCell.Value > 60000 Then .Range(Cells(MyCell.Row, 3), Cells(MyCell.Row, 5)).Value = Group2 Else .Range(Cells(MyCell.Row, 3), Cells(MyCell.Row, 5)).Value = Group1 End If Next MyCell End With End Sub بالتوفيق Loops.zip
  22. السلام عليكم ... استخدم الكود التالي : Sub MyRefresh() Sheets("Sheet1").Range("A1:A10").QueryTable.Refresh BackgroundQuery:=False End Sub الكود السابق يقوم بتحديث البيانات المرتبطة بالجدول A1:A10 الموجود في الورقة Sheet1 . تحياتي
  23. السلام عليكم ... جرب الكود التالي : Private Sub Worksheet_Change(ByVal Target As Range) If Me.Cells(Target.Row, 2).Value > 0 Then Me.Columns("A:B").Sort Key1:=Range("B2"), Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom End If End Sub المشكلة السابقة كانت تكمن في تنشيط الهدف قبل فرزه ، راجع الرابط التالي : http://www.officena.net/ib/index.php?showtopic=5827 بالتوفيق
  24. السلام عليكم ... بالنسبة للفاصلة العادية و الفاصلة المنقوطة ، فإن استخدام أحداهما في الصيغ يتبع لإعدادات نظام التشغيل الذي يعمل عليه الاكسل ، راجع الرابط التالي : http://www.officena.net/ib/index.php?showtopic=5119
×
×
  • اضف...

Important Information