محمد حجازي قام بنشر أبريل 24, 2005 قام بنشر أبريل 24, 2005 السلام عليكم ... كثرت في الآونة الأخيرة التساؤلات عن كيفية إخفاء أشرطة القوائم و المعلومات و الأدوات وحتى تبويبات ورقة العمل من مصنف الاكسل ، وكان لابد من حسم النقاش بموضوع متكامل يسد هذه الثغرة العويصة ، وسوف أعرض لكم في هذا الموضوع آخر ما توصلت إليه : يمكننا تقسيم التغيرات (الإظهار/الإخفاء) التي يمكننا تطبيقها على مكونات مصنف الاكسل إلى ما يلي : 1.تغيرات لا تؤثر سوى على المصنف المطبق عليها : مثل إخفاء/إظهار ما يلي : أشرطة التمرير العامودية و السفلية ، خطوط الشبكة ، علامات تبويب الأوراق ، رؤوس الصفوف و الأعمدة . ومشكلة هذه المجموعة بسيطة ، وذلك لأن أي تغيير نجريه عليها لا يتأثر به سوى المصنف المعدل ، وعملية إظهار/إخفاء عناصر هذه المجموعة تتم كما يلي : انقر على الخيار Options الموجود ضمن القائمة Tools لتظهر لك نافذة ، وفي علامة التبويب View وتحت Window options توجد عدة خيارات حدد/ألغي تحديد ما تشاء منها و اضغط على OK . 2. تغيرات تؤثر على المستخدم الحالي : مثل إخفاء/إظهار ما يلي : أشرطة الأدوات ، شريط المعلومات ، شريط القوائم ، شريط الصيغة . و المشكلة تكمن في تعديل خصائص أحد العناصر الموجودة في هذه المجموعة ، وذلك لأن أي تغيير نجريه على عناصر هذه المجموعة يؤثر على المستخدم الحالي ، فضلاً عن عدم تخزين هذا التغيير في مصنف العمل المعدل ، كيف ؟ لنفترض أنك تقوم بتسجيل دخولك على نظام التشغيل ويندوز تحت اسم معين (ليكن MAH) ، الآن إذا فتحت الملف Book1 و قمت بإخفاء شريط الأدوات القياسي فإن هذا التغيير سينسحب على جميع مصنفات الاكسل التي تفتحها من داخل المستخدم MAH ، وبنفس الوقت فإن هذا التغيير لن يحفظ في المصنف Book1 السابق (جرب فتح المصنف Book1 من مستخدم آخر لنظام تشغيلك أو من جهاز آخر و لاحظ النتيجة). مما سبق نلاحظ أنه لا مناص من استخدام أكواد الفيجوال من أجل حل هذه المشكلة . ضع الكود التالي في الـ ThisWorkbook : Private Sub Workbook_Open() Call HideCommandBars End Sub Private Sub Workbook_BeforeClose(Cancel As Boolean) Call UnhideCommandBars End Sub و الكود التالي في الـ Module : Dim MyCommandBars_Name() As String Sub HideCommandBars() On Error GoTo OutOfRange Dim cd As CommandBar With Application .DisplayFormulaBar = False .DisplayStatusBar = False For Each cb In .CommandBars If cb.Visible = True Then ReDim Preserve MyCommandBars_Name(UBound(MyCommandBars_Name) + 1) MyCommandBars_Name(UBound(MyCommandBars_Name)) = cb.Name If cb.Name = "Worksheet Menu Bar" Then cb.Enabled = False Else cb.Visible = False End If End If Next cb End With Exit Sub OutOfRange: If Err = 9 Then ReDim MyCommandBars_Name(0) Resume Next Else MsgBox Err.Description End If End Sub Sub UnhideCommandBars() With Application .DisplayFormulaBar = True .DisplayStatusBar = True For i = 0 To UBound(MyCommandBars_Name) If MyCommandBars_Name(i) = "Worksheet Menu Bar" Then .CommandBars(MyCommandBars_Name(i)).Enabled = True Else .CommandBars(MyCommandBars_Name(i)).Visible = True End If Next i End With End Sub الكود HideCommandBars السابق يقوم بما يلي : - إخفاء شريط المعلومات و شريط الصيغة (عند فتح المصنف) . - البحث داخل التطبيق عن أشرطة الأدوات (بما فيها شريط القوائم) الموجودة و الظاهرة و إدراج أسماءها في المصفوفة الديناميكية MyCommandBars_Name ومن ثم القيام بإخفائها (عند فتح المصنف). الكود UnhideCommandBars السابق يقوم بإعادة إظهار شريط المعلومات و شريط الصيغة ، وكما يقوم أيضاً بإظهار أشرطة الأدوات (بما فيها شريط القوائم) بالاعتماد على أسمائها الموجودة داخل المصفوفة MyCommandBars_Name السابقة (عند إغلاق المصنف) ، وبهذه الطريقة فإننا قمنا بإخفاء أشرطة الأدوات (المحددة بواسطة المستخدم) عند فتح المصنف و إعادتها دون زيادة أو نقصان عند إغلاق المصنف ، و بذلك فلن يعاني المستخدم من إشكاليات و ذلك لأن أشرطة الأدوات ستظهر كما حددها هو بنفسه. ملاحظات : 1. انتبه إلى أن سير عمل الكود سيتأثر بشكل كبير فيما إذا فقدت المعلومات الموجودة داخل المصفوفة MyCommandBars_Name ، وتفقد المعلومات من المصفوفة السابقة في إحدى الحالات التالية: تحرير الأكواد ، إغلاق المصنف بشكل غير قانوني ، توقف الجهاز قبل إغلاق الملف (بسبب عطل في التيار الكهربائي مثلاً) . ولذلك فإن عملية الاعتماد على المصفوفات لحفظ هكذا معلومات يعتبر أمراً غير مناسب ، وهنا لك الخيار في اختيار طريقة الحفظ (كحفظ هذه المعلومات في ورقة عمل معينة). 2. لاحظ أخي الكريم أننا اعتمدنا على الخاصية Enabled من أجل إخفاء شريط القوائم ، و على الخاصية Visible من أجل إخفاء أشرطة الأدوات الباقية . أرجو أن أكون قد وفقت في إيصال المعلومة بشكل صحيح مرفق مثال يوضح ما سبق : تحياتي CommandBars.zip
m.hindawi قام بنشر يونيو 1, 2005 قام بنشر يونيو 1, 2005 (معدل) بسم الله الرحمن الرحيم في الكود الذي كتبه الاخ محمد قد تفقد المصفوفة اللتي تم تخزين عدد اشرطة الادوات قيمتها فيها وبالتالي ظهور رسالة خطأ اذا قاك المستخدم بالاغلاق بطريقة غير شرعية او اذا انقطع التيار الكهربائي فجأة لذلك كما اقترح الاخ محممد حجازي قمت بتخزين اسماء وعدد اشرطة الادوات في ورقة عمل معينة اولا كود اخفاء الاشرطة Sub hide() Sheets("data").Cells(1, 1) = 0 Dim cb As CommandBar Dim comd() As String With Application .DisplayFormulaBar = False .DisplayStatusBar = False For Each cb In .CommandBars If cb.Visible = True Then Sheets("data").Cells(1, 1) = Sheets("data").Cells(1, 1) + 1 End If Next End With ''''''''''''''''''''''''''''''''''' tt = Sheets("data").Cells(1, 1) With Application gg = 1 For Each cb In .CommandBars If cb.Visible = True Then Sheets("data").Cells(gg, 4) = cb.Name gg = gg + 1 End If Next End With ''''''''''''''''''''''''''''''''''' With Application .DisplayFormulaBar = False .DisplayStatusBar = False For Each cb In .CommandBars If cb.Visible = True Then ReDim Preserve comd(Sheets("data").Cells(1, 1)) comd(UBound(comd)) = cb.Name If cb.Name = "Worksheet Menu Bar" Then cb.Enabled = False Else cb.Visible = False End If End If Next cb End With End Sub ثانيا كود الاظهار Sub sohw() On Error GoTo errr Application.CommandBars("Worksheet Menu Bar").Enabled = True With Application .DisplayFormulaBar = True .DisplayStatusBar = True End With For YY = 2 To Sheets("data").Cells(1, 1).Value Application.CommandBars(Sheets("data").Cells(YY , 4).Text).Visible = True Next For YY = 1 To Sheets("data").Cells(1, 1).Value Sheets("data").Cells(YY , 4) = "" Next Sheets("data").Cells(1, 1) = 0 errr: If Err = 9 Then For YY = 1 To Sheets("data").Cells(1, 1).Value Sheets("data").Cells(YY , 4) = "" Next Sheets("data").Cells(1, 1) = 0 Exit Sub End If End Sub ثم تضع الكود التالي في الworkbook Private Sub Workbook_BeforeClose(Cancel As Boolean) Sohw End Sub Private Sub Workbook_Open() hide End Sub ولكن لا تنسي ان تنشئ ورقة جديدة باسم data تم تعديل يونيو 1, 2005 بواسطه m.hindawi
محمد حجازي قام بنشر يونيو 1, 2005 الكاتب قام بنشر يونيو 1, 2005 السلام عليكم ... شكراً لك أخ مصعب ، وبالفعل فإن طريقتك هي الأضمن (y) ولكن عندي إضافة بسيطة : قد تتسبب الأكواد السابقة في بعض الأخطاء عند تشغيل أكثر من ملف اكسل معاً ، و الحل يكمن بالاعتماد على اسم الملف الذي يحتوي على الكود عند الإشارة للأهداف المختلفة ، كأن نكتب : Workbooks("Book1").Sheets("data").Cells(1, 1).Value بدلاً من : Sheets("data").Cells(1, 1).Value تحياتي
الردود الموصى بها