السلام عليكم ورحمة الله وبركاته
إخواني وأحبابي في الله
الكثير منا يحتاج لوضع أكواد في حدث التغير في ورقة العمل عند حدوث تغيير في خلية أو خلايا معينة ، وقد يبدو الأمر مربك بعض الشيء في بعض الأحيان خصوصاً إذا كان المطلوب إحداث تغييرات في نفس الخلية أو الخلايا
سنأخذ مثال ونقوم بشرحه لتتضح الصورة
هذا هو الكود الي يمكن وضعه في حدث ورقة العمل ، ويتم ذلك بعمل كليك يمين على اسم ورقة العمل ثم View Code ثم ضع الكود
CODE
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("A1:A10")) Is Nothing Or Target.Cells.Count > 1 Then Exit Sub
Application.EnableEvents = False
Target.value = UCase(Target.value)
Application.EnableEvents = True
End Sub
السطر الأول
CODE
Private Sub Worksheet_Change(ByVal Target As Range)<br />
لا يتم في الغالب كتابة هذا السطر بشكل يدوي بل تقوم باختيار الخيار Worksheet من القائمة المنسدلة الموجودة في نافذة الأكواد ، ومن القائمة المجاورة تختار الحدث Change
أي أن الكود سيتم تنفيذه بمجرد إحداث أي تغيير في ورقة العمل
بالطبع إذا ترك الكود بدون تحديد خلايا معينة سيكون عبء على الملف لأنه مع أي تغيير سينفذ الكود ، وفي رأيي إذا كان الأمر كذلك أفضل استخدام المعادلات (إذا كانت بديلاً للأكواد)
عموماً سيتم تحجيم النطاق باستخدام السطر التالي
CODE
If Intersect(Target, Range("A1:A10")) Is Nothing Or Target.Cells.Count > 1 Then Exit Sub
حيث سيتم الخروج من الإجراء إذا كانت الخلية الهدف لا تقع في النطاق من A1 إلى A10 ، كما سيتم الخروج من النطاق إذا كان عدد الخلايا الهدف أكبر من 1
أي إذا حاولت إحداث تغيير على مجموعة من الخلايا في ورقة واحد لن يتم تنفيذ الكود
فقط سيتم التنفيذ في حالة أن الخلية الهدف (المراد التعديل فيها) تقع ضمن النطاق وتكون خلية واحدة فقط
والدالة Intersect تعني تقاطع (أي تقاطع الخلية الهدف مع النطاق المطلوب التعامل معه)
المطلوب في الكود هو أن يقوم الكود بتحويل حالة الأحرف للكلمات المدخلة في الخلية الهدف لأحرف كبيرة بهذا الشكل
CODE
Target.value = UCase(Target.value)<br />
وهذه مشكلة لو فكرت فيها بشكل منطقي ..
حيث أنه في هذا السطر سيقوم الكود بإحداث تغيير في نفس الخلية الهدف ، وهذا سيؤدي إلى تفجير الحدث في ورقة العمل مرة أخرى .. وسينفذ الكود مرة أخرى وحين الوصول لنفس السطر سينفذ الكود مرة أخرى وهذا سيحدث مشكلة كبيرة وربما يتوقف الإكسيل تماماً إلى حين إغلاقه
لذا ستجد في الكود سطرين أحدهما يوقف هذه المشكلة
CODE
Application.EnableEvents = False<br />
حيث يعني إيقاف تمكين الأحداث إلى حين اكتمال عمل الكود ، لكي لا ينفذ الكود مرة أخرى أثناء عملية التغيير في الخلية الهدف
وبالطبع لابد من إرجاع هذه الخاصية مرة أخرى لأنه لو تم تجاهل الخاصية لن يعمل الكود في حدث التغير إلا بعد إغلاق الملف وفتحه مرة أخرى أو تنفيذ هذا السطر في النافذة الفورية أو أي إجراء عادي
CODE
Application.EnableEvents = True<br />
أرجو أن تكون المعلومة مفيدة لكم ، وفقني الله وإياكم لكل خير
رابط الملف من هنا
أخوكم في الله / ياسر خليل أبو البراء