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

محمد حجازي

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

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

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

  • Days Won

    2

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

  1. السلام عليكم ... دليل الـ Workbooks هو عبارة عن الاسم أو الرقم الذي يميز ورقة العمل ، مثال : Sheets("Sheet2").Range("A5").Value = 5 Sheets(2).Range("A5").Value = 5 لاحظ أن كل من Sheet2 و 2 هو عبارة عن دليل لورقة العمل ، ولكن الفرق بينهما يكمن في أننا استعنا باسم ورقة العمل Sheet2 في الكود الأول و بترتيبه ضمن أوراق العمل 2 في الكود الثاني ، وذلك طبعاً من أجل الإشارة إلى الورقة المطلوبة. و بالنسبة لباقي الكود ، ستجد شرحاً عن كود مشابه له في الرابط التالي : http://www.officena.net/ib/index.php?showtopic=6292
  2. حاول تغيير العبارة قبل تشغيل الكود. بالنسبة للشق الأول من السؤال : يمكنك ذلك طبعاً عن طريق تغيير الحدث الذي يشغل الكود ، راجع الرابط التالي : http://www.officena.net/ib/index.php?showtopic=7987 بالنسبة للشق الثاني من السؤال : بالفعل يا أخي ، حاولت كثيراً لجعل الكود السابق يستمر في العمل بالتزامن عمل المستخدم (ادخال بيانات و ما شابه) ، ولم أصل إلى نتيجة إلا بعد معاينة المرفق الموجود في مشاركة الأخ LoveCandle : http://www.officena.net/ib/index.php?showtopic=8103 و الكود بعد التعديل : Private Title As String Private i As Integer Private RunWhen As Double Public Sub RunMove() Title = "الميزانية العمومية" & Space(145) RunWhen = Now + TimeSerial(0, 0, 1) Application.OnTime RunWhen, "RunMove", , True i = i + 1 Sheets("ورقة1").Range("A3").Value = Left(Title, i) If i >= Len(Title) Then i = 0 End Sub Public Sub StopMove() On Error Resume Next Application.OnTime RunWhen, "RunMove", , False RunWhen = 0 End Sub مرفق المثال المعدل: TextMove.rar
  3. السلام عليكم ... جرب التعديل التالي : Book11.rar
  4. السلام عليكم ... تفضل الكود : Dim m As Boolean Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 5 Then If m = True Then m = False Exit Sub End If m = True Select Case Len(Trim(Target.Text)) Case Is >= 4 Target.Value = Mid(Trim(Target.Text), Len(Trim(Target.Text)) - 3, 2) & ":" & Right(Trim(Target.Text), 2) Case Is > 2 Target.Value = "0" & Left(Trim(Target.Text), 1) & ":" & Right(Trim(Target.Text), 2) Case Else Target.Value = "00:" & Trim(Target.Text) End Select End If End Sub
  5. السلام عليكم ... بالنسبة للمايكرو الموجود في المرفق السابق ، لم يعمل لسبب بسيط و هو أنك لم تقم بتغيير دليل Workbooks إلى اسم الملف الجديد. مرفق المثال المعدل : ANT_001T.rar
  6. السلام عليكم ... أعطني مجال الخلايا التي تريد تطبيق الكود السابق عليه لأعدله لك
  7. السلام عليكم ... جرب المثال المبدئي التالي و الذي عدلته عن أحد المرفقات الموجودة في المنتدى : اسم المستخدم للمجرر : ahmad كلمة المرور للمحرر : 111 اسم المستخدم للمدقق : ali كلمة المرور للمدقق : 222 اسم المستخدم للمعتمد : samy كلمة المرور للمعتمد : 333 ولكن بقيت لدي مشكلتين : الأولى : أن الشخص يستطيع مسح اسمه قبل إغلاق الملف (يمكن حلها بعدت طرق). الثانية : أن الشخص يمكنه الدخول إلى البرنامج دون كلمة مرور أو متابعة لحركته عن طريق تعطيل وحدات المايكرو قبل الدخول للملف (لايوجد في الوقت الحاضر حل لهذه المشكلة في ذهني). password_m.rar
  8. السلام عليكم ... انسخ الكود التالي ، مع الانتباه إلى مراعاة تغيير الأحداث حسبما تريد : Sub Move() Dim Title As String Dim i As Integer Dim Start As Double Title = "الميزانية العمومية" & Space(145) With Sheets("ورقة1") Do For i = 1 To Len(Title) .Range("A3").Value = Left(Title, i) Start = Timer Do While Timer < Start + 0.2 DoEvents Loop Next i Loop End With End Sub لمزيد من الشرح راجع الروابط التالية : http://www.officena.net/ib/index.php?showtopic=4624 http://www.officena.net/ib/index.php?showtopic=7987 الآن تأكد من تعديل اسم الورقة الموجودة في الكود من ورقة1 إلى ماتريد ، و الخلية صاحبة النص المتحرك من A3 إلى ما تريد ، و النص المخصص من الميزانية العمومية إلى ما تريد. الأن غير الرقم الدال على عدد الفراغات الموجودة في الخلية A3 (الرقم 145) إلى الرقم الحقيقي الذي تستطيع استنتاجه من الصيغة التالية : =LEN(A3) بالتوفيق
  9. السلام عليكم ... جرب هذه الصيغة : =REPLACE(REPLACE(A1;3;1;"");LEN(A1)-3;1;"") و لحذفها مع الأصفار جرب الصيغة التالية : =MID(A1;4;LEN(A1)-6) ملاحظة : هذه الصيغ خاصة لحالتك بالتحديد ....
  10. السلام عليكم ... شرح بالصور للأخ حسام نور تجده على الرابط التالي : http://www.officena.net/ib/index.php?showtopic=3642
  11. السلام عليكم ... ضع الكود التالي في الورقة المطلوبة : Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 2 Then If Target.Value = "مغادر" Then Range(Cells(Target.Row, 1), Cells(Target.Row, 7)).ClearContents End If End If End Sub بالتوفيق
  12. السلام عليكم ... التصفية المتقدمة تعتمد على جدول يشبه إلى حد كبير جدول الشرط المستخدم في دوال قواعد البيانات : http://www.officena.net/ib/index.php?showtopic=8015 راجع الشرح الموجود على الرابط التالي : http://office.microsoft.com/ar-sa/assistan...2001781025.aspx
  13. السلام عليكم ... اقرأ الشرح الموجود في الرابط التالي: http://www.officena.net/ib/index.php?showtopic=6215 و أسئلني عن أي مشكلة تواجهك.
  14. السلام عليكم ... كلامك يا أخ LoveCandle صحيح ، و أعذرني لأني ربما فهمت السؤال بشكل خاطئ.
  15. 7. اختصار التغييرات الغير ضرورية التي تم تسجيلها : رأينا في المشاركة الأولى أن مسجل المايكرو ينتج أكواداً لا تتميز بالكفاءة بسبب قيامه بتسجيل جميع الحركات التي يقوم بها المستخدم حتى و لو كانت غير ذات أهمية (كتنشيط الأهداف) ، و اليوم سنتحدث عن مشاكل أخرى يعاني منها مسجل المايكرو تدفعنا إلى عدم الاعتماد عليه بصورة نهائية في إنتاج الأكواد و ذلك عن طريق تنقيح الأكواد بعد توليدها : أولاً : عدم قدرة مسجل المايكرو على تمييز الخيارات التي تم تعديلها من داخل صناديق الحوار : لنقم بتسجيل المايكرو التالي ، وذلك حتى نستطيع معاينة المشكلة بصورة واضحة : اضغط على الخيار Record New Macro الموجود في القائمة Tools (القائمة الفرعية Macro) لتبدأ عملية تسجيل المايكرو. حدد المجال B9:G17 . الآن انقر على الخيار Cells الموجود في القائمة Format لتظهر لك نافذة : ضمن التبويب Font و تحت Font style اختر نوع الخط مثقل (Bold) و اضغط OK . أوقف تسجيل الماكرو من نفس الخيار السابق (لاحظ تغير اسمه إلى Stop Recording). الآن اضغط على Alt+Enter لتفتح لك نافذة محرر الفيجوال ، افتح الموديل المنشأ لترى فيه الكود الذي تم تسجيله مؤخراً: Sub Macro1() Range("B9:G17").Select With Selection.Font .Name = "Arial" .FontStyle = "Bold" .Size = 10 .Strikethrough = False .Superscript = False .Subscript = False .OutlineFont = False .Shadow = False .Underline = xlUnderlineStyleNone .ColorIndex = xlAutomatic End With End Sub الآن أعد شكل الخط الموجود في خلايا المجال B9:G17 إلى Regular أو Italic و شغل الكود السابق ... بالتأكد ستشعر بالنشوة و ذلك لأن كودك المسجل قد أدى المهمة التي حددتها له سابقاً و قام بتغير شكل الخط إلى Bold :( و لكن مهلاً يا أخي ... لا تتسرع بالحكم و ذلك خوفاً من أن تصيبك صدمة إذا ما قمت بتجريب الكود السابق عدد من المرات الإضافية. :p الآن قم بتغيير نوع الخط الموجود في المجال السابق B9:G17 إلى Andalus و شكله إلى Italic و قم بعدها بتجريب الكود الذي قمت بتسجيله سابقاً : سوف تصرخ قائلاً بأنك لم تحدد للمسجل (عند تسجيل الكود السابق) أن يغير نوع الخط إلى Arial :@ لكي تحدد ماهية المشكلة السابقة يجب أولاً التعرف على الأسلوب الذي يستخدمه مسجل المايكرو في توليد أكواده . كما قلنا سابقاً ، فإن مسجل المايكرو لا يقدر على تمييز الخيارات التي تم تعديلها من داخل صناديق الحوار ، كيف ؟ عندما قمت (في المثال السابق) بتغيير شكل الخط إلى Bold فإن مسجل المايكرو لم يستطيع و للأسف معرفة الخيار الذي قمت بتعديله ، ولتعويض عن هذا النقص قام المسجل (عندما قمت بالضغط على الزر OK) بإدراج قيم جميع الخيارات الموجودة في التبويب Font. مما لا شك فيه أن المشكلة السابقة تسبب قصورين خطيرين في الكود المنشأ : زيادة حجم الكود ، و عدم القدرة على تنفيذ مهام محددة و مفصلة . حل هذه المشكلة بسيط جداً ، و يتلخص في حذف جميع التغييرات الغير ضرورية من الكود و الإبقاء على الأسلوب المطلوب فقط ، لاحظ التعديل التالي للكود السابق : Sub Macro1() Range("B9:G17").Font.FontStyle = "Bold" End Sub ثانياً : عدم قدرة مسجل المايكرو في كثير من الأحيان على توليد أكواد مختصرة : كما تعودنا ، لنقم بتسجيل مايكرو يتضمن المشكلة موضوع البحث : اضغط على الخيار Record New Macro الموجود في القائمة Tools (القائمة الفرعية Macro) لتبدأ عملية تسجيل المايكرو. حدد المجال B9:G17 . الآن انقر على الخيار Cells الموجود في القائمة Format لتظهر لك نافذة : ضمن التبويب Border قم بإحاطة جميع خلايا المجال بخط ذو سماكة و لون قياسيين ، و من ثم اضغط OK . أوقف تسجيل الماكرو من نفس الخيار السابق (لاحظ تغير اسمه إلى Stop Recording). الآن اضغط على Alt+Enter لتفتح لك نافذة محرر الفيجوال ، افتح الموديل المنشأ لترى فيه الكود الذي تم تسجيله مؤخراً: Sub Macro2() Range("B9:G17").Select Selection.Borders(xlDiagonalDown).LineStyle = xlNone Selection.Borders(xlDiagonalUp).LineStyle = xlNone With Selection.Borders(xlEdgeLeft) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With With Selection.Borders(xlEdgeTop) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With With Selection.Borders(xlEdgeRight) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With With Selection.Borders(xlInsideVertical) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With With Selection.Borders(xlInsideHorizontal) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With End Sub لاحظ أخي أن الكود السابق يقوم بإدراج الخطوط في كل موضع بصورة مستقلة عن الموضع الآخر. يمكننا اختصار الكود السابق إلى ما يلي : Sub Macro2() With Range("B9:G17").Borders() .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With End Sub و لكن هل يمكننا اختصار الكود السابق بصورة أكثر ؟ يمكننا عمل ذلك فقط عندما تكون الخيارات المحدد ة من نوع Default ، كيف ؟ عندما تبحث داخل التعليمات البرمجية تجد أن الثوابت xlContinuous ، xlThin ، xlAutomatic الخاصة بالمعاملات السابقة LineStyle ، Weight ، ColorIndex هي من النوع Default ، أي أن الخط المستمر و العرض الرفيع و اللون التلقائي تعتبر من الخصائص الافتراضية في الأسلوب Borders ، و بما أن جميع الخصائص المستخدمة في الكود السابق تعتبر من و جهة النظر البرمجة خصائص افتراضية ، فيمكننا بذلك حذف هذه الخصائص و الإبقاء على خاصية واحدة منها فقط ، وذلك لأن الاكسل سيدرجها بصورة افتراضية ، لاحظ التعديل التالي على الكود السابق : Sub Macro2() Range("B9:G17").Borders().LineStyle = xlContinuous End Sub بالتوفيق
  16. السلام عليكم ... ما ينقصك هو تغيير ترتيب الشروط في الصيغة التي طرحها الأخ hussein_abd : =IF(D1=0;"مسدد";IF(D1>H1;"زيادة";IF(D1<H1;"انخفاض";IF(AND(D1=H1;D1<>0);"متجمد";""))))
  17. السلام عليكم ... لنفترض أن تاريخ الحق موجود في الخلية B1 فإن الصيغة التي تعطيك التاريخ المعدل ستكون على الشكل التالي : =IF(WEEKDAY(B1)=6;B1+2;IF(WEEKDAY(B1)=7;B1+1;B1)) أما بقية الشروط فيمكنك إضافتها كما تشاء .
  18. السلام عليكم ... جرب الكود المبدئي التالي : Dim m As Boolean Private Sub Worksheet_Change(ByVal Target As Range) If m = True Then m = False Exit Sub End If m = True Select Case Len(Trim(Target.Text)) Case Is >= 4 Target.Value = Mid(Trim(Target.Text), Len(Trim(Target.Text)) - 3, 2) & ":" & Right(Trim(Target.Text), 2) Case Is > 2 Target.Value = "0" & Left(Trim(Target.Text), 1) & ":" & Right(Trim(Target.Text), 2) Case Else Target.Value = "00:" & Trim(Target.Text) End Select End Sub و أخبرني في حال كان هذا طلبك حتى نتابع فيه.
  19. السلام عليكم ... جرب الدالة البيسطة التالية بشكلها المبدئي: Function alarm(MyData As Range, Account As Double, Criteria As Double) As String Dim MyText As String If Account >= Criteria Then For Each m In MyData.Cells MyText = MyText & m.Value & vbNewLine Next m MsgBox prompt:=MyText, Title:="تحذير" alarm = "تجاوز الحد" Else alarm = "لم يتجاوز الحد" End If End Function حيث : MyData : هو مجال البيانات التي تريد ظهورها في الرسالة . Account : رصيد العميل . Criteria : حد التنبيه.
  20. السلام عليكم ... على اعتبار أن البيانات الموجودة في أي سجل لن يكون لها قيمة مع عدم وجود اسم الموظف ، فقد آثرت أن يكون الحقل الذي نعتمد عليه في إيجاد عدد الموظفين هو الاسم.
  21. السلام عليكم ... أخي ، يمكن عمل ذلك ، ولكن أخبرني أولاً : هل ستقوم بإدخال الساعات أيضا؟ ، أم أن عملية الإدخال مقتصرة على الثواني و الدقائق.
  22. السلام عليكم ... الكود السابق يأخذ وقتاً و لكن نتيجته مضمونة . يمكنك التقليل من الزمن عن طريق تضيق المجال A4:F3249 الموجود في الكود.
  23. السلام عليكم ... أخي ، يمكنك عمل ذلك عن طريق الـ VBA و بالأخص التعليمة MsgBox ، و لكن يجب قبل كل شيء تحديد الحدث الذي سيشغل الإجراء المكتوب : - هل سيكون الحدث عبارة عن الضغط على زر أمر معين؟ - أم سيكون مثلاً عند تحرير أحد الخلايا؟ - أم سيكون عند تغيير محتويات أحد الخلايا بواسطة تحريرها أو بواسطة صيغة معينة (أعتقد أن هذا ماتريده) ، و في هذه الحالة فإنك بحاجة لكتابة دالة محددة . لي عودة إن شاء الله بعد تعقيبك
  24. السلام عليكم ... راجع الرابط التالي : http://www.officena.net/ib/index.php?showtopic=8015
  25. السلام عليكم ... من المحتمل جدااااااً أنك تجيد التعامل مع دوال بسيطة من قبيل MAX ، COUNT ، COUNTA ، SUM ، AVERAGE ، PRODUCT ، .... ، الخ 😞 ولكن هل سبق لك أن تعاملت مع دوال من هذا الشكل : DSUM ، DMAX ، DCOUNTA ، DAVERAGE ، ... ، الخ ؟ . لا تقلق إذا كانت الإجابة بالنفي ، وذلك لأنني سأقوم إن شاء الله بشرح هذا النوع من الدوال بشكل سريع. :pp: الدوال السابقة تعرف باسم دوال قواعد البيانات..... من المعروف أن قاعدة البيانات في الاكسل هي عبارة عن جدول يحتوي على مجموعة من الأعمدة التي تسمى حقول ومجموعة من الأسطر التي تسمى سجلات ، وأن السطر الأول في الجدول يدعى بالـ الترويسة والذي يحتوي على أسماء الحقول في ذلك الجدول. إن الدالات المختصة بقواعد البيانات تحتوي على ثلاثة أنواع رئيسة من الوسائط ، وهي: قاعدة البيانات الحقل المعيار ، أو ما يدعى بجدول الشرط وبذلك فإن الشكل العام لهذا النوع من الدوال يكون كما يلي: =DCOUNTA(---جدول الشرط---;---الحقل---;---قاعدة البيانات---) قاعدة البيانات Database : نطاق الخلايا الذي تتألف منه قاعدة البيانات. الحقل Field : اسم رأس الحقل الذي توجد فيه القيم المطلوب تطبيق الشرط عليها ، ويمكن أن يكون المدخل عبارة عن مرجع لخلية تتضمن اسم الحقل أو يكون اسم الحقل موضوع ضمن علامتي اقتباس مزدوجة أو يكون عبارة عن رقم يدل على ترتيب الحقل ضمن قاعدة البيانات. جدول الشرط Criteria : وهو عبارة عن جدول مصاحب لقاعدة البيانات ويحدد شرط معين فإذا تحقق هذا الشرط يتم تنفيذ الوظيفة . ولجدول الشرط نفس رأس جدول قاعدة البيانات (أي أن أسماء الحقول في جدول الشرط هي نفسها أسماء الحقول في قاعدة البيانات) إلا أن جدول الشرط خال من البيانات حيث تجد فقط تحت اسم الحقل الشرط المطلوب مكتوباً ، مثال: استخدمنا في المثال السابق الدالة DCOUNTA والتي تقوم بنفس عمل الدالة COUNTA ولكن على قواعد البيانات . لاحظ وضع الحرف D في بداية اسم الدالة ، وهذه سنة عامة في تسمية أغلب الدوال المخصصة لقواعد البيانات ، أمثلة: DAVERAGE ، DSUM ، DMAX ، ... ، الخ ملاحظات و ارشادات: 1. من الشكل السابق نلاحظً أن جدول الشرط يحتوي فقط على الحقول التي تتضمن الشروط ، حيث أننا نستطيع استبعاد أي حقل لا يفيدنا في عملية التصفية من جدول الشرط ، 2. كما ذكرنا سابقاً فإنه يمكن أن يكون الوسيط الثاني Field عبارة عن رقم يدل على ترتيب الحقل الذي ينبغي أن تطبق العملية الحسابية عليه : =DCOUNTA(A1:E8;2;G2:I3) هذه الدالة تقوم بنفس وظيفة الدالة السابقة رغم اختلافهما بالشكل 3. يمكننا استخدام عوامل المقارنة > ، < ، = ، <> ، >= ، <= في كتابه الشرط الموجودة في جدول الشرط . 4. يمكنك التحكم بـجدول الشرط و توسيعه كيفما تشاء ، ولكن انتبه : إلى أنه يتم الربط بين الشروط الموجودة في نفس السطر بالعلاقة المنطقية و . ويتم الربط بين مجموعات الشرط المختلفة (السطور في جدول الشرط) بالعلاقة المنطقية أو . لاحظ المثال التالي : بالتوفيق
×
×
  • اضف...

Important Information