إجمالي مرات مشاهدة الصفحة

الاثنين، 2 مايو 2016

حذف ورقة عمل وإلغاء رسائل التحذير Delete Sheet & Disable Alerts

السلام عليكم ورحمة الله وبركاته

أقدم لكم درس بسيط حول كيفية حذف ورقة عمل بالكود وإلغاء الرسائل التحذيرية.

لربما يسأل البعض ما هذا التدني في المستوى في تقديم محتوى بسيط وسهل؟ والبعض قد يلجأ إلى تسجيل الماكرو ويحذف ورقة العمل ليحصل على الماكرو المطلوب بالشكل التالي ، ويظن أن الموضوع قد انتهى لهذا الحد.
Sub Macro1()
'
' Macro1 Macro
'

'
    Sheets("Data").Select
    ActiveWindow.SelectedSheets.Delete
End Sub
في الحقيقة أحببت أن أتناول معكم الموضوع بشكل علمي وعملي وممنهج ، لنرتقي بطريقة التفكير التي نفكر بها إلى مستوى أعلى
إذا أردنا أن نقوم بالبرمجة فعلينا التفكير في كل الاحتمالات الممكنة حتى يكون الكود شامل ولا يحتوي على ثغرات .. فلنبدأ بضرب مثال ، ونفرض الفروض الممكنة ونرى كيف نعالج هذه الاحتمالات

بفرض أن لدينا ثلاثة أوراق عمل Sheet1 و Data و Report ، والمطلوب حذف ورقة العمل المسماة Data

أول نقطة هو أنه عند الحذف يقوم الإكسيل بإظهار رسالة تحذيرية بهذا الشكل

أي أن الإكسيل يقوم بحذف ورقة العمل بشكل نهائي ، هل تود الاستمرار؟ - والتراجع باستخدام Ctrl + Z بعد التأكيد على الحذف لن يجدي ، وعليك إذا كنت تريد التراجع أن تقوم بإغلاق المصنف بدون حفظ وإعادة فتحه من جديد
ما يهمنا في هذه النقطة أننا نريد ألا تظهر رسالة التحذير أثناء تشغيل الكود ، والأمر ببساطة أننا نقوم بإلغاء خاصية رسائل التحذير DisplayAlerts بوضع القيمة False لها في بداية تنفيذ الأمر ، ولا ننسى أن نقوم بإعادة الخاصية مرة أخرى بوضع القيمة True لها بعد انتهاء عمل الكود

النقطة الثانية نفترض أن ورقة العمل المطلوب حذفها غير موجود ، وقمت بتنفيذ الكود ، ستظهر لك رسالة خطأ ، قم بتجربة الكود التالي
Sub Delete_Sheet()
    Dim strSh As String
    strSh = "Data"

    Application.DisplayAlerts = False
        Sheets(strSh).Delete
        MsgBox "Sheet Deleted ...", 64
    Application.DisplayAlerts = True
End Sub
نفذ الكود لمرة ستحذف ورقة العمل Data ، ثم نفذ الكود مرة أخرى ستظهر لك رسالة خطأ بهذا الشكل
ولعلاج الخطأ يجب أن نقوم بفحص ما إذا كانت ورقة العمل موجودة أم لا ، فإذا كانت موجودة نقوم بحذفها ، وإذا كانت ورقة العمل غير موجودة يظهر رسالة لنا تفيد بأنها غير موجودة.
هنا نستخدم دالة Evaluate ، وهذه الدالة تفيد في الحصول على قيمة من تنفيذ معادلة أو دالة من الدوال المبنية داخل الإكسيل ، على سبيل المثال إذا كان لدينا أرقام في الخلايا A1:A3 ، وفي الخلية A4 أردنا جمع الخلايا نقوم باستخدام دالة الجمع Sum يليها النطاق A1:A3 بين قوسين ، يمكن استخدام الدالة Evaluate للحصول على القيمة بتنفيذ المعادلة بها بالشكل التالي
Sub Test_Evaluate()
    MsgBox Evaluate("=SUM(A1:A3)")
End Sub
نلاحظ أننا وضعنا المعادلة بين أقواس ( ) وبين أقواس تنصيص ، ثم بينهما وضعت المعادلة ، وعند تنفيذ الكود نحصل على الناتج أو القيمة.
نرجع لما كنا بصدده ألا وهو أننا نريد فحص ورقة العمل ، وببساطة نستخدم الدالة ISREF والتي ترجع القيمة True إذا كانت ورقة العمل موجودة ، ولذا يمكن تطوير الكود بهذا الشكل لتفادي الخطأ في حالة عدم وجود ورقة العمل
Sub Delete_Sheet()
    Dim strSh As String
    strSh = "Data"

    Application.DisplayAlerts = False
        If Evaluate("=ISREF('" & strSh & "'!A1)") Then
            Sheets(strSh).Delete
            MsgBox "Sheet Deleted ...", 64
        Else
            MsgBox "The Sheet Does Not Exist", vbExclamation
        End If
    Application.DisplayAlerts = True
End Sub
النقطة الثالثة والأخيرة وهي احتمال أن تكون ورقة العمل المطلوب حذفها هي ورقة العمل الوحيدة بالمصنف ، بفرض أننا قمنا بحذف ورقتي العمل Sheet1 و Report وأردنا أن نقوم بحذف ورقة العمل الوحيدة Data والتي لا يوجد غيرها
رغم أننا بالكود وضعنا إلغاء رسائل التحذير إلا أن الأمر لا ينتهي ، إذ أن منطق الإكسيل يخبرنا أنه يجب أن يحتوي المصنف على ورقة عمل واحدة على الأقل ، ولعلاج تلك المشلكة يمكننا إضافة سطر قبل تنفيذ الكود يقوم باختبار عدد أوراق العمل الموجودة ، فإذا كان عدد أوراق العمل = 1 ، نظهر رسالة تفيد بذلك ونستخدم جملة Exit Sub للخروج من الإجراء الفرعي

وها هو الكود بالشكل النهائي له بعد محاولة تفادي كل الاحتمالات الممكنة
Sub Delete_Sheet()
    Dim strSh As String
    strSh = "Data"

    Application.DisplayAlerts = False
        If ThisWorkbook.Worksheets.Count = 1 Then MsgBox "There Is only One Sheet. The Deletion Can't Be Done!", vbCritical: Exit Sub
        If Evaluate("=ISREF('" & strSh & "'!A1)") Then
            Sheets(strSh).Delete
            MsgBox "Sheet Deleted ...", 64
        Else
            MsgBox "The Sheet Does Not Exist", vbExclamation
        End If
    Application.DisplayAlerts = True
End Sub

إعداد / ياسر خليل أبو البراء

هناك تعليقان (2):

  1. أستاذي الكريم ياسر حفظك الله ..
    إني من ناهلي مواركم .. لا فض فوك ..
    عندي ملف متواضع أعمل عليه فكرة جمعية خيرية أنا و أصدقائي ..
    عمل هذه الجمعية يكون باشتراك شهري من المشتركين (قسط شهري) /إجباري/ و من ودائع /اختياري/ ثم قروض و تسديدها و سحب ودائع و هبات ...
    يا ريت تقدملي فكرة بسيطة لعمل جرد شهري لصافي المبلغ الموجود مع تقرير يبين اشتراكات المشتركين بشكل شهري مع إمكانية الاستعلام عن اي شهر مضى ..
    طبعاً أنا عامل ملف اكسس يخدم هذا العمل بشكل كامل ..و أريد أن أعمله بالاكسل اذا صادفك وقت و سأرسللك الملف الاكسل قاعدة البيانات إذا سمحت لي ..
    و شكراً لك على كل الأحوال ..
    تلميذك ...

    ردحذف
  2. أخي الكريم بارك الله فيك
    ليس لدي خبرة في هذا المجال ..ربما يمكنك طرح الموضوع بشكل عام على المنتدى وإرفاق ملف مع وضع تصور للمطلوب وشكل النتائج المتوقعة وإن شاء الله أشارك في الموضوع بقدر وضوحه وبقدر علمي بالأمر

    ردحذف