الدليل الكامل للعمل مع الـ Workbook

اولا وقبل كل شيئ يجب ان نتفق على المفاهيم الاتية

عندما أقول مصنف قأنا أعني workbook

وعندما أقول ورقة عمل فأنا أعني worksheet   أو sheet

في Excel: المصنف عبارة عن مجموعة من جدول بيانات أو أوراق عمل واحد أو أكثر يتم حفظها كملف واحد. تتكون كل ورقة عمل داخل مصنف من صفوف وأعمدة يمكن استخدامها لتخزين البيانات ومعالجتها وإجراء العمليات الحسابية وإنشاء المخططات والرسوم البيانية. يمكن أن يحتوي المصنف على أوراق عمل متعددة، ويمكن أن يتضمن أيضا وحدات ماكرو وتنسيقا وميزات أخرى.

في Excel VBA ، المصنف هو كائن يمثل ملف Excel مفتوحا. يمكنك استخدام التعليمات البرمجية ل VBA لمعالجة المصنفات بطرق مختلفة ، مثل فتحها وإغلاقها وإنشاء مصنفات جديدة وحفظها ونسخ البيانات بينها. يمكن الوصول إلى المصنفات ومعالجتها من خلال كائن المصنف في VBA ، والذي يوفر مجموعة متنوعة من الخصائص والأساليب للعمل معها.

عند العمل مع ال workbook     سنجد أننا أمام كائنين مختلفين الكائن الأول وهوا ال workbooks  والكائن الثاني وهو  workbook      

في بيئة Excel VBA، `Workbooks` و `Workbook` يشيران إلى مفاهيم مختلفة، وهما كالتالي:

1. **Workbooks Collection (مجموعة المصنفات):**

   – `Workbooks` هي مجموعة (Collection) تحتوي على جميع المصنفات (Workbooks) المفتوحة حالياً في جلسة Excel.

   – يمكنك استخدام `Workbooks` للوصول إلى مصنف معين من خلال الاسم أو الفهرس (Index)، أو لإجراء عمليات على جميع المصنفات، مثل فتح مصنف جديد أو حفظ جميع المصنفات. Workbooks Collection كمدير لجميع كائنات Workbook التي هي مفتوحة في جلسة Excel الحالية تتيح لك هذه المجموعة القيام بأمور مثل:

  • فتح مصنفات جديدة.
  • إحصاء عدد المصنفات المفتوحة.
  • تكرار المصنفات المفتوحة لتنفيذ إجراءات معينة على كل منها.

الحصول على مرجع لمصنف معين بواسطة الاسم أو الفهرس

`Workbooks` Collection في VBA لبرنامج Microsoft Excel هي المسؤولة عن إدارة مصنفات Excel المفتوحة لعدة أسباب، أساسها نموذج الكائنات في Excel وكيفية تصميمه للعمل مع ملفات العمل:

1. **تنظيم ومركزية الإدارة**:

   `Workbooks` هي مجموعة تُعطي نقطة مركزية لإدارة جميع المصنفات. بدلاً من العمل مع مصنف واحد فقط، يمكنك استخدام `Workbooks` للتأثير على كل المصنفات التي فتحتها خلال جلسة العمل.

2. **تسهيل الوصول**:

   باستخدام `Workbooks`, يمكنك الوصول بسهولة إلى مصنف معين باستخدام الاسم أو الفهرس (index)، وهذا يُسهل البرمجة والتنفيذ الآلي للمهام.

3. **أتمتة الإجراءات**:

   تسمح `Workbooks` بتنفيذ إجراءات بشكل جماعي على جميع المصنفات المفتوحة، مثل إغلاق كل المصنفات دون حفظ، أو تنفيذ ماكرو معين على كل مصنف.

بهذه الطريقة، تُعتبر `Workbooks` أداة مركزية وفعالة في إدارة المصنفات ضمن جلسة  Excel،  المفتوحة فى الوقت الحالى مما يسهل على المطورين إنشاء حلول برمجية متقدمة ومتكاملة.

2. **Workbook Object (كائن المصنف):**

   – `Workbook` هو كائن يمثل مصنفًا مفردًا في Excel.

   – كل مصنف مفتوح في Excel يمثل كائن `Workbook` فردي، ويمكنك استخدام الخصائص والطرق المرتبطة بهذا الكائن للتفاعل مع المصنف المحدد، مثل إضافة ورقة عمل جديدة، أو تغيير اسم المصنف، أو حفظه.

دعونا نمضى قدما وسيتضح كل شيء بالتدريج

كيف  اشير الي مصنف

“Collection_name(“Object_name”)”.

# 1: اسم المجموعة ذات الصلة (collection_name) يكتب أولا .

# 2: Collection_name متبوعا بأقواس ().

# 3: داخل الأقواس ، لديك اسم كائن VBA الفردي (Object_name).

# 4: اسم كائن VBA ضمن علامات الاقتباس (“”).

إذا نسيت علامتي الاقتباس ، فإن Excel يفهم أن اسم كائن VBA هو اسم متغير. لذلك ، لن يتمكن من تحديد الكائن الذي تريده.

يتم الانتقال عبر التسلسل الهرمي للكائنات عبر عامل التشغيل النقطة (تم شرح النقطة وأهميتها فى كتابة الاكواد فى مقال سابق يمكنك الرجوع إلية من هنا

هذا يسمي مرجع مؤهل بالكامل

 

المكتوب باللون الاحمر هو workbooks  المجموعة لتحديد الفئة التي نتعامل معها ثم الذي بين الأقواس باللون الأزرق هوا الكائن الفردي الذي نتعامل معة ثم النقطة (  (.  للإنتقال إلي المستوي الهرمي الادني وهو worksheets    مجموعة ورقات العمل ثم بين الاقواس ورقة العمل المستهدف التعامل معها ثم النقطة مره أخري للإنتقال إلي المستوي الهرمي الادني وهو النطاق الذي سنتعامل معة وهو  الخلية ("A1")

تبسيط مراجع الكائنات المؤهلة بالكامل

في برمجة Excel VBA، التبسيط هو عملية استخدام مراجع مختصرة للكائنات بدلاً من المراجع المؤهلة بالكامل. القدرة على تبسيط مرجع كائن VBA لها العديد من المزايا. بشكل أساسي ، يتيح لك هذا تقصير  كود  VBA الخاص بك وتسهيل قراءته.

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

علي سبيل المثال : المرجع التالي هو مرجع مؤهل بالكامل

يمكن إختصارة الي مايلي

 

Range("A1").value=22

تم اختزال application   حيث انها تشير الي برنامج الاكسيل نفسة وهو بالطبع مفتوح وأعمل علية

  1. يفترض دائما هذا الكائن ؛  و
  2. لا يهم مكان وجود  كود  VBA.

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

تم أختزال Workbooks("Book1.xlsx") حيث انه هو المصنف الوحيد المفتوح حاليا وانا أعمل عليه ومتي لا يمكن أختزالها عندما يكون هناك أكثر من مصنف مفتوح فى جلسة عمل واحدة

هناك طرق مختلفة للإشارة إلى كائن مصنف في VBA.تعتمد الطريقة التي تختارها على ما تريد إنجازه.

في هذا القسم ، سأغطي الطرق المختلفة للإشارة إلى مصنف مع بعض أمثلة الاكواد

تم إختزال Worksheets("Sheet1") حيث انها هي ورقة العمل النشطة فإن لم تكن يجب تحديد اسم ورقة العمل ويمكن أختصارها الي ActiveSheet.Range("A1") ايضا فى حالة ان تكون هي  ورقة العمل النشطة

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

  1. يقوم Excel بإرجاع خطأ.
  2. يقوم Excel بإرجاع نتيجة خاطئة.
  3. ينفذ Excel إجراء خاطئا لا يمكنك التراجع عنه.

تذكر أنه لا يجب عليك تبسيط المراجع المؤهلة بالكامل بشكل أعمى طوال الوقت.

في الواقع ، ربما يجب عليك (كقاعدة عامة):

  • تأهيل مراجع كائن VBA بالكامل ؛ و
  • تجنب الاعتماد على الكائنات الافتراضية، مع استثناءات قليلة.

هناك طرق مختلفة للإشارة إلى كائن مصنف في VBA.

تعتمد الطريقة التي تختارها على ما تريد إنجازه.

في هذا القسم ، سأغطي الطرق المختلفة للإشارة إلى مصنف مع بعض أمثلة الاكواد .

Using Workbook Names

إذا كان لديك الاسم الدقيق للمصنف الذي تريد الرجوع إليه، فيمكنك استخدام الاسم الموجود في التعليمات البرمجية.لنبدأ بمثال بسيط.

إذا كان لديك مصنفان مفتوحان ، وتريد تنشيط المصنف بالاسم – (“Examples.xlsx”)، يمكنك استخدام الكود أدناه:

 


Sub ActivateWorkbook()

Workbooks(“Examples.xlsx”).Activate

End Sub

 

لاحظ أنك تحتاج إلى استخدام اسم الملف مع الامتداد إذا تم حفظ الملف. إذا لم يتم حفظه ، فيمكنك استخدام الاسم بدون امتداد الملف.

إذا لم تكن متأكدا من الاسم الذي يجب استخدامه، فإنظر للصورة التالية وهي مستكشف المشاريع.

ملحوظة هامة

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

 

Sub ActivateWorkbook()

Workbooks(“Examples.xlsx”).Worksheets(“Sheet1”).ActivateRange(“A1”).Select

End Sub

 

لانه يجب تنشيط المصنف أولا ثم تنشيط الخلية ثانيا كما تفعل مع البرنامج اثناء التعامل معه وهذا من عيوب active & selectوعلية فالكود التالي خطأ

 

Workbooks(“Examples.xlsx”).Worksheets(“Sheet2”). Range(“a1”).Select

 

Using Index Numbers

يمكنك أيضا الرجوع إلى المصنفات استنادا إلى رقم فهرسها.  فما هو الفهرس

عند الإشارة إلى مصنف في برمجة Excel، فإن الindex number هو رقمه التسلسلي في قائمة المصنفات المفتوحة حاليًا. يتم ترتيب هذه القائمة حسب ترتيب فتح المصنفات، وليس حسب الترتيب الأبجدي.

على سبيل المثال، إذا قمت بفتح المصنف “الملف الأول” أولاً، ثم المصنف “الملف الثاني”، ثم المصنف “الملف الثالث”، فسيكون الindex number للملفات الثلاثة على التوالي 1، 2، 3

على سبيل المثال، إذا كان لديك ثلاثة مصنفات مفتوحة، فستعرض لك التعليمة البرمجية التالية أسماء المصنفات الثلاثة في مربع رسالة (واحد في كل مرة).

 

Sub WorkbookName()

MsgBox Workbooks(1).Name

MsgBox Workbooks(2).Name

MsgBox Workbooks(3).Name

End Sub

يستخدم الكود  أعلاه MsgBox – وهي وظيفة تعرض مربع رسالة بالنص / القيمة المحددة (وهو اسم المصنف في هذه الحالة).

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

يعامل Excel المصنف الذي تم فتحه أولا ليكون رقم الفهرس 1 ، والرقم التالي على أنه 2 وهكذا.

على الرغم من هذا العيب ، يمكن أن يكون استخدام أرقام الفهرس مفيدا.اذا كنت محتاجة وإلا تجنب استخدامه

على سبيل المثال ، إذا كنت تريد التكرار عبر جميع المصنفات المفتوحة وحفظ الكل ، فيمكنك استخدام أرقام الفهرس.

في هذه الحالة ، نظرا لأنك تريد أن يحدث هذا لجميع المصنفات ، فأنت لست قلقا بشأن أرقام الفهرس الفردية الخاصة بها.

ستتكرر التعليمة البرمجية أدناه عبر جميع المصنفات المفتوحة وتغلق جميعها باستثناء المصنف الذي يحتوي على  كود  VBA هذا.

 

Sub CloseWorkbooks()

Dim WbCount As Integer

WbCount = Workbooks.Count

For i = WbCount To 1 Step -1

If Workbooks(i).Name <> ThisWorkbook.Name Then

Workbooks(i).Close

End If

Next i

End Sub

 

تحسب التعليمة البرمجية أعلاه عدد المصنفات المفتوحة ثم تمر عبر جميع المصنفات باستخدام حلقة for   next .

يستخدم شرط IF للتحقق مما إذا كان اسم المصنف هو نفسه اسم المصنف حيث يتم تشغيل التعليمات البرمجية.

إذا لم يكن هناك  تطابقا ، فإنه يغلق المصنف وينتقل إلى المصنف التالي.

Using ActiveWorkbook

يشير ActiveWorkbook ، كما يوحي الاسم ، إلى المصنف النشط.

سيظهر لك الكود  أدناه اسم المصنف النشط.

Sub ActiveWorkbookName()

MsgBox ActiveWorkbook.Name

End Sub

 

عند استخدام VBA لفتح مصنف آخر ، سيبدأ جزء ActiveWorkbook في VBA بعد ذلك في الإشارة إلى المصنف الذي تم تم فتحة مؤخرا  أنه هو الملف النشط. أو قمت بتنشيطة فسيكون هو أيضا الملف النشط

هنا مثال على ذلك.

إذا كان لديك مصنف نشط وقمت بإدراج التعليمة البرمجية التالية فيه وتشغيله ، فسيظهر أولا اسم المصنف الذي يحتوي على التعليمات البرمجية ثم اسم (“Examples.xlsx”). (الذي يتم تنشيطه بواسطة التعليمات البرمجية).

Sub ActiveWorkbookName()

MsgBox ActiveWorkbook.Name

Workbooks(“Examples.xlsx”).Activate

MsgBox ActiveWorkbook.Name

End Sub

لاحظ أنه عند إنشاء مصنف جديد باستخدام VBA ، يصبح هذا المصنف الذي تم إنشاؤه حديثا تلقائيا المصنف النشط.

Using ThisWorkbook

يشير ThisWorkbook إلى المصنف حيث يتم تنفيذ التعليمات البرمجية.( أي  المصنف الذى يحتوي التعليمات البرمجية التي أكتبها الان )

سيحتوي كل مصنف على كائن ThisWorkbook كجزء منه (مرئي في مستكشف المشروع).

 

يمكن ل “ThisWorkbook” تخزين وحدات الماكرو العادية (على غرار تلك التي نقوم بإضافتها إلى الوحدات النمطية) بالإضافة إلى إجراءات الأحداث. إجراء الحدث هو شيء يتم تشغيله استنادا إلى حدث – مثل النقر المزدوج فوق خلية أو حفظ مصنف أو تنشيط ورقة عمل.

سيكون أي إجراء حدث تقوم بحفظه في هذا “ThisWorkbook” متاحا في المصنف بأكمله ، مقارنة بأحداث مستوى الورقة التي تقتصر على الأوراق المحددة فقط.

على سبيل المثال ، إذا قمت بالنقر نقرا مزدوجا فوق كائن ThisWorkbook في مستكشف المشروع ونسخ ولصق الكود أدناه فيه ، فسيظهر عنوان الخلية كلما نقرت نقرا مزدوجا فوق أي من الخلايا في المصنف بأكمله.

 

 

Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)

MsgBox Target.Address

End Sub

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

سترجع التعليمة البرمجية أدناه اسم المصنف الذي يتم تنفيذ التعليمة البرمجية فيه.

 

Sub ThisWorkbookName()

MsgBox ThisWorkbook.Name

End Sub

تتمثل فائدة استخدام ThisWorkbook (عبر ActiveWorkbook) في أنه سيشير إلى نفس المصنف (الذي يحتوي على الكود فيه) في جميع الحالات. لذلك إذا كنت تستخدم  كود  VBA لإضافة مصنف جديد ، فسيتغير ActiveWorkbook ، لكن ThisWorkbook سيظل يشير إلى المصنف الذي يحتوي على الكود.

Creating a New Workbook Object

ستقوم التعليمة البرمجية التالية بإنشاء مصنف جديد.

Sub CreateNewWorkbook()
Workbooks.Add
End Sub

عند إضافة مصنف جديد، يصبح المصنف النشط.

ستضيف التعليمة البرمجية التالية مصنفا جديدا ثم تعرض لك اسم هذا المصنف (والذي سيكون اسم نوع Book1 الافتراضي).

لانشاء ملف مع تحديد اسمة نستخدم التعليمة البرمجية التالية

Dim newWorkbook As Workbook

Set newWorkbook = Workbooks.Add

newWorkbook.SaveAs Filename:=”MyNewWorkbook.xlsx”

وهنا يتم حفظ الملف في المسار الأفتراضي

من اكسيل option— save

غالباما يكون المسار الافتراضى فى documents  إذ لم تحدد انت موقع أخر لحفظ ملفات الاكسيل به

ولمعرفة المسار الافتراضي من الاكواد نستخدم

 

Dim defaultPath As String 

defaultPath = Application.DefaultFilePath 
MsgBox “The default file path is: ” & defaultPath

او من النافذة الفورية

?Application.DefaultFilePath

C:\Users\asr\Documents

لمعرفة اسم المصنف النشط

Sub activeWorkbook()

MsgBox ActiveWorkbook.Name

End Sub

Open a Workbook using VBA

يمكنك استخدام VBA لفتح مصنف معين عندما تعرف مسار ملف المصنف.

سيفتح الكود  أدناه المصنف Examples.xlsx”) الموجود في مجلد المستندات على نظامي.

Sub OpenWorkbook()

Workbooks.Open (“C:\Users\sumit\Documents\Examples.xlsx”)

End Sub

في حالة وجود الملف في المجلد الافتراضي ، وهو المجلد الذي يحفظ فيه VBA الملفات الجديدة افتراضيا ، يمكنك فقط تحديد اسم المصنف – بدون المسار بأكمله.

Sub OpenWorkbook()

Workbooks.Open (“Examples.xlsx”)

End Sub

 

في حالة عدم وجود المصنف الذي تحاول فتحه ، سترى خطأ.

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

سيتحقق الكود  أدناه من موقع الملف وإذا لم يكن موجودا ، فسيظهر رسالة مخصصة (وليس رسالة الخطأ):

Sub OpenWorkbook()
If Dir("C:\Users\sumit\Documents\Examples.xlsx") <> "" Then
Workbooks.Open ("C:\Users\sumit\Documents\Examples.xlsx")
Else
MsgBox "The file doesn't exist"
End If
End Sub

يمكنك التحقق مما إذا كان المصنف مفتوحا في Excel VBA باستخدام  الكود التالي إليك مثال:

Dim wb As Workbook
Set wb = Nothing
 
‘ Loop through all open workbooks
For Each wb In Workbooks
    ‘ Check if workbook is the one you want
    If wb.Name = “MyWorkbook.xlsx” Then
        ‘ Workbook is open
        MsgBox “Workbook is open”
        Exit For
    End If
Next wb
 
‘ Check if workbook is not open
If wb Is Nothing Then
    MsgBox “Workbook is not open”
End If

 

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

يمكنك أيضا استخدام مربع الحوار فتح لتحديد الملف الذي تريد فتحه.

VBA GetOpenFileName


تقوم طريقة Application.GetOpenFilename الخاصة بـ Excel بأمرين: عرض مربع حوار فتح قابل للتخصيص ؛ ويقوم بإرجاع المسار الكامل / الاسم / الامتداد للملف الذي اختاره المستخدم. لا تفتح طريقة  Application.GetOpenFilename الملف الذي اختاره المستخدم. و مازلت بحاجة إلى الاعتماد على طريقة Workbooks.Open      لفتح الملف المختار بالفعل. تمنحك أداة GetOpenFilename ببساطة آلية لمطالبة المستخدم باسم (أسماء) الملف (الملفات) التي يعمل معها الإجراء. حقيقة أن GetOpenFilename لا يفتح الملف بالفعل يجعل هذه طريقة متعددة الاستخدامات. والسبب هو أن هذا يسمح لك باستخدام هذه الطريقة نفسها بالضبط في الحالات التي تحتاج فيها إلى الحصول على المسار / الاسم / الامتداد الخاص بمصنف Excel لأغراض أخرى غير فتحه. لذلك ، لفتح مصنف Excel من خلال مربع الحوار فتح أثناء استخدام VBA ، تحتاج إلى استخدام كلتا الطريقتين التاليتين:

العنصر 1: ترجع طريقة Application.GetOpenFilename اسم المصنف الذي سيتم فتحه.

العنصر # 2: أسلوب Workbooks.Open يفتح فعليًا المصنف الذي يتم توفير مساره / اسمه / امتداده بواسطة طريقة Application.GetOpenFilename.

ولها خمس معاملات او وسائط او حجج .

File Filter

عامل تصفية الملفات: في هذه الوسيطة ، يمكننا تحديد نوع الملفات التي سيتم عرضها لتحديدها. على سبيل المثال ، إذا ذكرت “ملفات Excel ، *. xlsx” ، فسيتم عرض ملفات Excel فقط المحفوظة بامتداد excel

 “xlsx.” لن يتم عرض أي ملفات أخرى..

وهي تستخدم كما يلي

كما يمكن استخدام الكوما لدمج أكثر من عامل ترشيح كما يلي بهذا الشكل بالطبع النجمة من احرف البدل كما ذكرنا سابقا .

علامات التنصيص هي بداية ونهاية الجملة البرمجية الخاصة بالمعامل File Filter

لو طبقنا ذلك على هذا السطر البرمجي التالي

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

Filter Index

فهرس عامل التصفية: باستخدام هذا ، نقيد المستخدم بتحديد نوع الملف. يمكننا تحديد عدد المرشحات لتكون مرئية تحت File Filter.

في المعامل السابق File Filter تعلمنا طريقة اختيار وكتابة المرشحات التي سيتم تطبيقها في النافذة المفتوحة لاختيار الملفات لكن هذا المعامل   Filter index  هو يحدد أي نوع من المرشحات سيكون هو الافتراضي الذى سيطبق علي الملفات عند فتح النافذة فمثلا في المثال السابق قمنا بتحديد نوعين من الملفات هما

  1. Excel Files(*.xl*;*.xm*)
  2. Text Files (*.TXT; *.CSV)

فإذا كتبنا ان filter index:= 1 سيتم تطبيق الخيار الأول علي الملفات وسيتم اختيار ملفات الاكسيل فقط واذا كتبنا 2 سيتم اختيار الملفات النصية والتي هي الخيار الثاني من نوع المرشحات واذا كانت المرشحات 3 وكتبنا 3 سيتم تطبيق الخيار الثالث ولكن اذا كتبنا عدد اكبر من عدد المرشحات المختارة في المعامل file filter سيتم اختيار المرشح الأول .

Title

العنوان: يعرض عنوان مربع حوار تحديد الملف.

Button Text

نص الزر: هذا فقط لنظام التشغيل Macintosh.

Multi-Select

التحديد المتعدد: صحيح إذا كنت تريد تحديد ملفات متعددة أو خطأ آخر. القيمة الافتراضية هي false.

من ناحية أخرى ، تعرض طريقة Application.GetOpenFilename مربع الحوار فتح ، وهو جزء من نظام التشغيل ويسمح للمستخدم بتحديد ملف لفتحه. لا يحتوي على العديد من خيارات التخصيص مثل  طريقة Application.FileDialog ، ولكنه أسهل في الاستخدام.

فيما يلي مثال على كيفية استخدام الأسلوب Application.GetOpenFilename لمطالبة المستخدم بتحديد ملف واحد لفتحه:

 
Dim selectedFile As Variant
selectedFile = Application.GetOpenFilename(“Excel Files (*.xlsx), *.xlsx”)
If selectedFile <> False Then
    Workbooks.Open selectedFile

End If

في هذا المثال، يتم استدعاء الأسلوب مع وسيطة عامل تصفية التي تقصر التحديد على مصنفات Excel بملحق الملف .xlsx. إذا حدد المستخدم ملفا ، فتحه باستخدام  الأسلوب Workbooks.Open.

باختصار ، يوفر الأسلوب Application.FileDialog المزيد من الخيارات لتخصيص مربع الحوار تحديد الملف ، في حين أن الأسلوب Application.GetOpenFilename هو بديل أبسط لاحتياجات تحديد الملف الأساسية.

Saving a Workbook

لحفظ المصنف النشط ، استخدم الكود  أدناه:

 

Sub SaveWorkbook()
ActiveWorkbook.Save
End Sub

يعمل هذا الكود  مع المصنفات التي تم حفظها مسبقا بالفعل. أيضا ، نظرا لأن المصنف يحتوي على الماكرو أعلاه ، إذا لم يتم حفظه كملف .xlsm (أو .xls) ، فستفقد الماكرو عند فتحه بعد ذلك.

إذا كنت تقوم بحفظ المصنف لأول مرة ، فسيظهر لك مطالبة كما هو موضح أدناه:

عند الحفظ لأول مرة ، من الأفضل استخدام خيار “Saveas”.

سيحفظ الكود  أدناه المصنف النشط كملف .xlsm في الموقع الافتراضي (وهو مجلد المستند في نظام الكمبيوتر ).

 

Sub SaveWorkbook()

ActiveWorkbook.SaveAs Filename:=”Test.xlsm”, FileFormat:=xlOpenXMLWorkbookMacroEnabled

End Sub

إذا كنت تريد حفظ الملف في موقع معين ، فأنت بحاجة إلى ذكر ذلك المسار مع  اسم الملف. يحفظ الكود  أدناه الملف على سطح المكتب الخاص بي.

Sub SaveWorkbook()

ActiveWorkbook.SaveAs Filename:=”C:\Users\sumit\Desktop\Test.xlsm”, FileFormat:=xlOpenXMLWorkbookMacroEnabled

End Sub

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

Sub SaveWorkbook()

Dim FilePath As variant

FilePath =Application.GetSaveAsFilename()

if filepath<> false then

ThisWorkbook.SaveAs Filename:=FilePath &“.xlsm”, FileFormat:=xlOpenXMLWorkbookMacroEnabled

end if 

End Sub

 

لاحظ أنه بدلا من استخدام FileFormat:=xlOpenXMLWorkbookMacroEnabled ، يمكنك أيضا استخدام FileFormat:=52 ، حيث 52 هو الكود  xlOpenXMLWorkbookMacroEnabled.

Saving All Open Workbooks

إذا كان لديك أكثر من مصنف مفتوح وتريد حفظ كافة المصنفات، فيمكنك استخدام التعليمة البرمجية أدناه:

Sub SaveAllWorkbooks()

Dim wb As Workbook

For Each wb In Workbooks

wb.Save

Next wb

End Sub

ما سبق يحفظ جميع المصنفات ، بما في ذلك تلك التي لم يتم حفظها مطلقا.. إذا كان المصنف لم يتم حفظه مطلقًا، فسيتم عرض مربع حوار حفظ باسم. يمكن للمستخدم بعد ذلك تحديد اسم الملف وموقعه. إذا لم يحدد المستخدم اسمًا أو موقعًا، فسيتم حفظ المصنف في الموقع الافتراضي.

إذا كنت تريد فقط حفظ تلك المصنفات التي تم حفظها مسبقا ، فيمكنك استخدام الكود أدناه:

Sub SaveAllWorkbooks()

Dim wb As Workbook

For Each wb In Workbooks

If wb.Path <> “” Then

wb.Save

End If

Next wb

End Sub

Saving and Closing All Workbooks

إذا كنت تريد إغلاق كافة المصنفات ، باستثناء المصنف الذي يحتوي على الكود الحالي فيه ، فيمكنك استخدام الكود  أدناه:

Sub CloseandSaveWorkbooks()
Dim wb As Workbook
For Each wb In Workbooks
If wb.Name <> ThisWorkbook.Name Then
wb.Close SaveChanges:=True
End If
Next wb
End Sub

ستغلق التعليمة البرمجية أعلاه جميع المصنفات (باستثناء المصنف الذي يحتوي على الكود – ThisWorkbook). في حالة وجود تغييرات في هذه المصنفات ، سيتم حفظ التغييرات. في حالة وجود مصنف لم يتم حفظه مطلقا ، سيعرض مربع الحوار حفظ باسم.

Save a Copy of the Workbook (with Timestamp)

عند ألعمل في مصنفات Excel، وتريد إنشاء إصدارات مختلفة من المصنفات. هذا مفيد في حالة حدوث خطأ ما في المصنف الحالي الخاص بك. ستحصل على الأقل على نسخة منه محفوظة باسم مختلف (ولن تفقد العمل الذي قمت به إلا بعد إنشاء نسخة).

إليك  كود  VBA الذي سيقوم بإنشاء نسخة من المصنف الخاص بك وحفظه في الموقع المحدد.

Sub CreateaCopyofWorkbook()

ThisWorkbook.SaveCopyAs Filename:=”C:\Users\sumit\Desktop\BackupCopy.xlsm”

End Sub

ستحفظ التعليمة البرمجية أعلاه نسخة من المصنف في كل مرة تقوم فيها بتشغيل هذا الماكرو.

 

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

للتعامل مع مثل هذه المواقف ، يمكنك استخدام الكود أدناه الذي يحفظ نسخة جديدة من العمل في كل مرة تقوم فيها بحفظه. ويضيف أيضا طابعا تاريخيا وزمنيا كجزء من اسم المصنف. يمكن أن يساعدك هذا في تتبع أي خطأ ارتكبته لأنك لا تفقد أبدا أيا من النسخ الاحتياطية التي تم إنشاؤها مسبقا.

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

ThisWorkbook.SaveCopyAs Filename:=”C:\Users\sumit\Desktop\BackupCopy” & Format(Now(), “dd-mm-yy-hh-mm-ss-AMPM”) & “.xlsm”

End Sub

سيقوم الكود  أعلاه بإنشاء نسخة في كل مرة تقوم فيها بتشغيل هذا الماكرو وإضافة التاريخ والوقت الي إسم المصنف .

Create a New Workbook for Each Worksheet

في بعض الحالات، قد يكون لديك مصنف يحتوي على أوراق عمل متعددة، وتريد إنشاء مصنف لكل ورقة عمل.

قد يكون هذا هو الحال عندما يكون لديك تقارير شهرية / ربع سنوية في مصنف واحد وتريد تقسيمها إلى مصنف واحد لكل ورقة عمل.

أو ، إذا كانت لديك تقارير حسب القسم وتريد تقسيمها إلى مصنفات فردية بحيث يمكنك إرسال هذه المصنفات الفردية إلى رؤساء الأقسام.

إليك الكود الذي سينشئ مصنفا لكل ورقة عمل ، ويعطيها نفس اسم ورقة العمل ، ويحفظها في المجلد المحدد.

Sub CreateWorkbookforWorksheets()
Dim ws As Worksheet
Dim wb As Workbook
For Each ws In ThisWorkbook.Worksheets
Set wb = Workbooks.Add
ws.Copy Before:=wb.Sheets(1)
Application.DisplayAlerts = False
wb.Sheets(2).Delete
Application.DisplayAlerts = True
wb.SaveAs “C:\Users\sumit\Desktop\Test\” & ws.Name & “.xlsx”
wb.Close
Next ws
End Sub

 

في الكود أعلاه ، استخدمنا متغيرين “ws” و “wb”.

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

لاحظ أنني استخدمت عبارة SET لتعيين المتغير “wb” لأي مصنف جديد تم إنشاؤه بواسطة الكود.

يمكنك استخدام هذه التقنية لتعيين كائن مصنف إلى متغير. يتم تناول هذا في القسم التالي.

Assign Workbook Object to a Variable

في VBA ، يمكنك تعيين كائن إلى متغير ، ثم استخدام المتغير للإشارة إلى هذا الكائن.

على سبيل المثال ، في الكود أدناه ، أستخدم VBA لإضافة مصنف جديد ثم تعيين هذا المصنف إلى المتغير wb. للقيام بذلك ، أحتاج إلى استخدام عبارة SET.

بمجرد تعيين المصنف للمتغير ، يتم توفير جميع خصائص المصنف للمتغير أيضا.

Sub AssigntoVariable()

Dim wb As Workbook

Set wb = Workbooks.Add

wb.SaveAs Filename:=”C:\Users\sumit\Desktop\Examples.xlsx”

End Sub

لاحظ أن الخطوة الأولى في التعليمات البرمجية هي إعلان “wb” كمتغير نوع المصنف. يخبر هذا VBA أن هذا المتغير يمكنه الاحتفاظ بكائن المصنف.

تستخدم العبارة التالية SET لتعيين المتغير إلى المصنف الجديد الذي نضيفه. بمجرد الانتهاء من هذه المهمة ، يمكننا استخدام متغير wb لحفظ المصنف (أو القيام بأي شيء آخر به).

Looping through Open Workbooks

لقد رأينا بالفعل بعض الأمثلة على الرموز أعلاه التي تستخدم التكرار في الكود.

في هذا القسم ، سأشرح طرقا مختلفة للتكرار عبر المصنفات المفتوحة باستخدام VBA.

لنفترض أنك تريد حفظ وإغلاق جميع المصنفات المفتوحة ، باستثناء المصنفات التي تحتوي على الكود الموجود فيها ، فيمكنك استخدام الكود أدناه:

Sub CloseandSaveWorkbooks()

Dim wb As Workbook

For Each wb In Workbooks

If wb.Name <> ThisWorkbook.Name Then

wb.Close SaveChanges:=True

End If

Next wb

End Sub

تستخدم التعليمة البرمجية أعلاه حلقة لتصفح كل مصنف في مجموعة المصنفات. للقيام بذلك ، نحتاج أولا إلى إعلان “wb” كمتغير نوع المصنف.

الاعلان

في كل دورة حلقية، يتم تحليل كل اسم مصنف وإذا لم يتطابق مع اسم المصنف الذي يحتوي على ال كود ، إغلاقه بعد حفظ محتواه.

يمكن أيضا تحقيق الشيء نفسه باستخدام حلقة مختلفة كما هو موضح أدناه:

Sub CloseWorkbooks()
Dim WbCount As Integer
WbCount = Workbooks.Count
For i = WbCount To 1 Step -1
If Workbooks(i).Name <> ThisWorkbook.Name Then
Workbooks(i).Close SaveChanges:=True
End If
Next i
End Sub

 

تستخدم التعليمة البرمجية أعلاه حلقة For Next لإغلاق كافة المصنفات باستثناء تلك التي تحتوي على الكود فيها. في هذه الحالة ، لا نحتاج إلى الإعلان عن متغير مصنف ، ولكن بدلا من ذلك ، نحتاج إلى حساب العدد الإجمالي للمصنفات المفتوحة. عندما يكون لدينا العدد ، نستخدم حلقة For Next لتصفح كل مصنف. أيضا ، نستخدم رقم الفهرس للإشارة إلى المصنفات في هذه الحالة.

لاحظ أنه في الكود أعلاه ، نحن نحلق من WbCount إلى 1 مع الخطوة -1. هذا مطلوب كما هو الحال مع كل حلقة ، يتم إغلاق المصنف وينخفض عدد المصنفات بمقدار 1.

Error while Working with the Workbook Object (Run-time error ‘9’)

أحد الأخطاء الأكثر شيوعا التي قد تواجهها عند العمل مع المصنفات هو – خطأ وقت التشغيل “9” – منخفض خارج النطاق.

بشكل عام ، أخطاء VBA ليست مفيدة للغاية وغالبا ما تترك لك معرفة الخطأ الذي حدث.

فيما يلي بعض الأسباب المحتملة التي قد تؤدي إلى هذا الخطأ:

  1. المصنف الذي تحاول الوصول إليه غير موجود. على سبيل المثال ، إذا كنت أحاول الوصول إلى المصنف الخامس باستخدام Workbooks (5) ، ولم يكن هناك سوى 4 مصنفات مفتوحة ، فسأحصل على هذا الخطأ.
  2. إذا كنت تستخدم اسما خاطئا للإشارة إلى المصنف. على سبيل المثال، إذا كان اسم المصنف الخاص بك أمثلة.xlsx وكنت تستخدم مثال.xlsx. ثم سيظهر لك هذا الخطأ.
  3. إذا لم تقم بحفظ مصنف ، وكنت تستخدم الملحق ، فستتلقى هذا الخطأ. على سبيل المثال ، إذا كان اسم المصنف الخاص بك هو Book1 ، وكنت تستخدم الاسم Book1 .xlsx بدون حفظه ، فستحصل على هذا الخطأ.
  4. تم إغلاق المصنف الذي تحاول الوصول إليه.

Get a List of All Open Workbooks

إذا كنت تريد الحصول على قائمة بجميع المصنفات المفتوحة في المصنف الحالي (المصنف حيث تقوم بتشغيل التعليمات البرمجية)، فيمكنك استخدام التعليمة البرمجية أدناه:

Sub GetWorkbookNames()
Dim wbcount As Integer
wbcount = Workbooks.Count
ThisWorkbook.Worksheets.Add
ActiveSheet.Range(“A1”).Activate
For i = 1 To wbcount
Range(“A1”).Offset(i – 1, 0).Value = Workbooks(i).Name
Next i
End Sub

تضيف التعليمة البرمجية أعلاه ورقة عمل جديدة ثم تسرد اسم كافة المصنفات المفتوحة.

إذا كنت ترغب في الحصول على مسار الملف الخاص بهم أيضا ، فيمكنك استخدام الكود أدناه:

Sub GetWorkbookNames()
Dim wbcount As Integer
wbcount = Workbooks.Count
ThisWorkbook.Worksheets.Add
ActiveSheet.Range(“A1”).Activate
For i = 1 To wbcount
Range(“A1”).Offset(i – 1, 0).Value = Workbooks(i).Path & “\” & Workbooks(i).Name
Next i
End Sub

Open the Specified Workbook by Double-clicking on the Cell

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

Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)

Workbooks.Open Target.Value

End Sub

سيتم وضع هذا الكود  في إطار التعليمات البرمجية ThisWorkbook.

لفعل هذا:

  1. انقر نقرا مزدوجا فوق كائن ThisWorkbook في مستكشف المشروع. لاحظ أن الكائن ThisWorkbook يجب أن يكون في المصنف حيث تريد هذه الوظيفة.
  2. انسخ والصق الكود أعلاه.

الآن ، إذا كان لديك المسار الدقيق للملفات التي تريد فتحها ، فيمكنك القيام بذلك ببساطة عن طريق النقر المزدوج على مسار الملف وسيفتح VBA هذا المصنف على الفور.

الان شرح  open method

Parameters Of The Workbooks.Open Method

The following table introduces the 15 optional parameters of the Workbooks.Open method.

PositionNameDescription
1FileNameاسم المصنف المراد فتحه.
2UpdateLinksالطريقة التي يتم بها تحديث المراجع / الروابط الخارجية في الملف.
3ReadOnlyتحديد ما إذا كان المصنف يفتح في وضع القراءة فقط.
4Formatينطبق عند فتح ملف نصي. يحدد حرف المحدد.
5Passwordكلمة المرور مطلوبة لفتح المصنف المحمي.
6WriteResPasswordكلمة المرور مطلوبة للكتابة في مصنف محجوز للكتابة.
7IgnoreReadOnlyRecommendedينطبق عند حفظ مصنف مع تمكين الخيار مستحسن للقراءة فقط. تحديد ما إذا كان سيتم عرض الرسالة الموصى بها للقراءة فقط.
8Originينطبق عند فتح ملف نصي. يشير إلى مكان نشأة الملف.
9Delimiterيتم تطبيقه عند فتح ملف نصي ومعلمة التنسيق أعلاه (رقم 4) هي حرف مخصص. يحدد ما هو الحرف المخصص الذي سيتم استخدامه كمحدد.
10Editableينطبق على: (i) وظائف Excel الإضافية القديمة (التي تم إنشاؤها في Excel 4.0) و(ii) القوالب. عند تطبيقه على وظيفة Excel 4.0 الإضافية، يحدد ما إذا كان سيتم فتح الوظيفة الإضافية كوظيفة مخفية أو مرئية. إذا تم تطبيقه على قالب، فيحدد ما إذا كان القالب مفتوحا للتحرير، أو إذا تم إنشاء مصنف جديد (استنادا إلى القالب).
11Notifyينطبق عندما يتعذر فتح ملف في وضع القراءة/الكتابة. يحدد ما إذا كان يتم إضافة الملف إلى قائمة إعلامات الملفات (أو لا يطلب أي إعلام).
12Converterيحدد محول الملفات الذي يجب تجربته عند فتح الملف.
13AddToMruيحدد ما إذا كان سيتم إضافة الملف إلى قائمة الملفات الحديثة.
14Localيحدد ما إذا كان يتم حفظ الملف مقابل لغة Excel (عادة محلية) أو VBA (عادة ما تكون إنجليزية أمريكية).
15CorruptLoadيحدد معالجة الملف عند فتحه

فيما يلي بعض الخصائص المهمة للمصنف في Excel VBA:

  • Name:
  •  تحصل هذه الخاصية على اسم المصنف.

Dim wb As Workbook

Set wb = ThisWorkbook

Debug.Print wb.Name

wb.Name = “New Workbook Name”

تقوم هذه التعليمة البرمجية بتعيين متغير wb إلى  المصنف الحالي (ThisWorkbook) ثم طباعة اسم المصنف إلى الإطار “immediate“. ثم يقوم بتغيير اسم المصنف إلى “اسم مصنف جديد”.

  • FullName:
  •  تحصل هذه الخاصية على المسار الكامل للمصنف واسمه، بما في ذلك امتداد  الملف.

Dim wb As Workbook

Set wb = Workbooks.Open(“C:\Users\Username\Documents\MyWorkbook.xlsx”)

Debug.Print wb.FullName

تفتح هذه التعليمة البرمجية مصنفا موجودا في “C:\Users\Username\Documents\MyWorkbook.xlsx” وتقوم بتعيين متغير wb إلى هذا المصنف. ثم يقوم بطباعة الاسم الكامل للمصنف، بما في ذلك المسار وامتداد الملف، إلى النافذة immediate.

  • Path:
  • تحصل هذه الخاصية على مسار المصنف( فقط ) بدون اسم المصنف.

Dim wb As Workbook

Set wb = ThisWorkbook

Debug.Print wb.Path

تقوم هذه التعليمة البرمجية بتعيين متغير wb إلى المصنف الحالي (ThisWorkbook) ثم تقوم بطباعة مسار المصنف بدون اسم المصنف إلى الإطار Immediate .

    • ProtectStructure:
    • تحصل هذه الخاصية على قيمة منطقية تشير إلى ما إذا كانت بنية المصنف محمية أم لا.
    • إذا كانت بنية المصنف محمية، فلا يمكن إضافة أو حذف أو إعادة تسمية أو نقل أو إخفاء أو إظهار أوراق العمل داخل المصنف.

    If ThisWorkbook.ProtectStructure Then

        MsgBox “بنية المصنف محمية.”

    Else

        MsgBox “بنية المصنف غير محمية.”

    End if

    • ProtectWindows:
    • تحصل هذه الخاصية على قيمة منطقية تشير إلى ما إذا كانت النوافذ الموجودة في المصنف محمية أم لا.. إذا تم تفعيل حماية النوافذ، فإنه لا يمكن للمستخدمين تغيير حجم أو تحريك أو إغلاق النوافذ داخل المصنف إلا إذا كانت لديهم كلمة المرور المناسبة. من المهم ملاحظة أن خاصية ProtectWindows تؤثر فقط على نوافذ المصنف ولا تحمي محتوى الأوراق نفسها. هذا يعني أنه حتى مع تفعيل ProtectWindows، يظل بإمكان المستخدمين تغيير البيانات والتنسيقات داخل الأوراق إلا إذا تم تطبيق حماية على مستوى الورقة أو الخلايا.

    If ThisWorkbook.ProtectWindows Then

        MsgBox “نوافذ المصنف محمية.”

    Else

        MsgBox “نوافذ المصنف غير محمية.”

    End If

    معلومة علي الهامش
    في Excel، النوافذ في المصنف (Windows in a Workbook) تشير إلى الإطارات المختلفة أو المشاهدات التي يمكن فتح المصنف فيها. كل نافذة تعرض نفس المصنف ولكن يمكن أن تظهر أجزاء مختلفة منه أو بتنسيقات مختلفة. هذا مفيد بشكل خاص عندما تريد مشاهدة أوراق متعددة أو جزء مختلف من الورقة نفسها في نفس الوقت.

    ### كيفية استخدام النوافذ في المصنف:

    1. **فتح نوافذ متعددة لنفس المصنف:**

       – يمكنك فتح أكثر من نافذة لنفس المصنف عن طريق الانتقال إلى علامة التبويب “عرض” (View) واختيار “نافذة جديدة” (New Window). هذا يسمح لك بالعمل على أجزاء مختلفة من المصنف في نفس الوقت.

    2. **ترتيب النوافذ:**

       – يمكنك ترتيب النوافذ بطرق مختلفة (مثل متتالية، أفقي، عمودي) لرؤية محتويات المصنف من زوايا مختلفة.

    3. **حماية النوافذ:**

       – كما ذكرت سابقاً، يمكنك حماية النوافذ لمنع المستخدمين من تغيير حجمها، تحريكها، أو إغلاقها. هذا مفيد للحفاظ على تنظيم معين في العرض أو لمنع التغييرات العشوائية في النوافذ

    ### مثال عملي:

    تخيل أن لديك مصنفًا به ورقة بيانات كبيرة، وتريد أن ترى الرأس (أعلى الورقة) والذيل (أسفل الورقة) في نفس الوقت للمقارنة أو التحليل. يمكنك فتح نافذة جديدة لنفس المصنف، وضبط كل نافذة لعرض جزء مختلف من الورقة.

    • Saved:
    • تحصل هذه الخاصية على قيمة منطقية تشير إلى ما إذا كان قد تم حفظ المصنف منذ آخر تعديل له.:    تحذير المستخدم قبل إغلاق المصنف إذا لم يتم حفظ التغييرات.
    •     تشغيل سيناريوهات معينة في الكود بناءً على ما إذا كانت هناك تغييرات غير محفوظة في المصنف أم لا.
    •     تجنب فقدان البيانات عن طريق التحقق التلقائي من حالة الحفظ قبل إجراء تغييرات كبيرة في المصنف

    Dim wb As Workbook
    Set wb = ThisWorkbook

    If wb.Saved = False Then
    wb.Save
    End If

    تقوم هذه التعليمة البرمجية بتعيين متغير wb إلى المصنف الحالي (ThisWorkbook) ثم تتحقق مما إذا كان قد تم حفظ المصنف منذ آخر تعديل له. إذا لم يتم حفظه، فإنه يحفظ المصنف.

    ReadOnly:

    تحصل هذه الخاصية على قيمة منطقية تشير إلى ما إذا كان المصنف للقراءة فقط أم لا.

    Dim wb As Workbook
    Set wb = ThisWorkbook

    If wb.ReadOnly = True Then
    MsgBox “Workbook is read-only”
    End If

    تقوم هذه التعليمة البرمجية بتعيين متغير wb إلى المصنف الحالي (ThisWorkbook) ثم تتحقق مما إذا كان المصنف للقراءة فقط. إذا كان الأمر كذلك ، فإنه يعرض مربع رسالة يفيد بأن المصنف للقراءة فقط.

    فيما يلي بعض الطرق المهمة لكائن المصنف في Excel VBA:

    • Close:

    في بداية الامر اود ان أقول أن هناك نوعان من الأمر close  الاول والخاص ب workbooks collection وهو يغلق جميع المصنفات المفتوحة فى هذة الجلسة ايا كان عددها ولكن يجب توخي الحذر  علي الرغم من انه تظهر رسالة قبل اغلاق كل مصنف تخبرك هل تريد حفظ التغيرات ام لا ويستخدم هكذا  

    Workbooks.Close

    اما النوع الثاني من الامر close  وهو أحد أساليب الكائن    , workbookويأتي مع ثلاث وسائط يغلق مصنف واحد محدد بعينة ويمكن معرفة النوعين من خلال دراسة اساليب وخصائص workbooks / workbook  من متصفح الكائنات

    ويستخدم بالشكل التالي  

    Dim wb As Workbook
    Set wb = ThisWorkbook

    wb.Close SaveChanges:=False

    تقوم هذه التعليمة البرمجية بتعيين متغير wb إلى المصنف  الحالي (ThisWorkbook) ثم إغلاق المصنف دون حفظ أية تغييرات. يمكنك تعيين الوسيطة SaveChanges إلى True إذا كنت تريد حفظ أية تغييرات تم إجراؤها على المصنف قبل إغلاقه.

    ، والتي تستخدم لإغلاق مصنف في Excel VBA.  يمكن استخدام طريقة الإغلاق مع أو بدون وسيطات.

    عند استخدامها بدون وسيطات،  تغلق الطريقة إغلاق المصنف دون حفظ التغييرات. على سبيل المثال:

    ActiveWorkbook.Close

    عند استخدامها مع الوسيطات، تتيح لك طريقة الإغلاق تحديد ما إذا كنت تريد حفظ التغييرات أم لا، وتنسيق الملف المراد استخدامه، وخيارات أخرى. فيما يلي كل الوسيطات لطريقة الإغلاق  :

    Workbook.Close SaveChanges, Filename, RouteWorkbook

    SaveChanges: معامل اختياري من نوع Variant. يحدد ما إذا كانت التغييرات التي أُجريت على الكتاب ستُحفظ أم لا. القيم الممكنة:

        True: يحفظ التغييرات في المصنف .

        False: يغلق المصنف دون حفظ التغييرات.

        إذا تُرك هذا المعامل فارغًا، سيُطلب من المستخدم اتخاذ قرار إذا كانت هناك تغييرات لم يتم حفظها.

    Filename: معامل اختياري من نوع Variant. يُستخدم فقط عند تعيين SaveChanges إلى True. يحدد اسم الملف الذي سيتم حفظ المصنف به.

    RouteWorkbook: معامل اختياري من نوع Variant. إذا كانت لديك ملفات تم توجيهها إلى مستخدمين آخرين للمراجعة، فإن تعيين هذا المعامل إلى True سيجعل المصنف يُرسل إلى المستخدم التالي في قائمة التوجيه

    • Save:

        عندما تستخدم هذا الأمر، يقوم Excel بحفظ التغييرات التي أجريت على (Workbook) الحالي.

        إذا كان الملف قد تم حفظه مسبقاً وله اسم ملف ومسار، فإن Save سيحفظ التغييرات على هذا الملف نفسه ولن يطلب تغيير الاسم أو الموقع  إذا كان الملف جديدًا (أي لم يتم حفظه مسبقًا)، فإن Excel سيعرض مربع حوار “حفظ باسم” للسماح للمستخدم بتحديد اسم ومكان لحفظ الملف

    Dim wb As Workbook
    Set wb = ThisWorkbook

    wb.Save

     

    تقوم هذه التعليمة البرمجية بتعيين متغير wb إلى المصنف الحالي (ThisWorkbook) ثم يقوم بحفظ المصنف.

    • SaveAs:
    •  

    Dim wb As Workbook
    Set wb = ThisWorkbook

    wb.SaveAs “C:\Users\Username\Documents\MyWorkbook2.xlsx”

    تقوم هذه التعليمة البرمجية بتعيين متغير wb إلى المصنف الحالي (ThisWorkbook) ثم يقوم بحفظ المصنف إلى ملف جديد بالمسار المحدد واسم الملف.

    يحتوي أسلوب SaveAs لكائن المصنف في Excel VBA على العديد من الوسيطات الاختيارية التي يمكنك استخدامها لتحديد تنسيق الملف واسم الملف وخيارات أخرى لحفظ مصنف. فيما يلي بعض الحجج المهمة:

    1. Filename:
      1. تحديد اسم الملف ومسار المصنف المحفوظ. هذه الوسيطة مطلوبة إذا كنت تريد حفظ المصنف إلى اسم ملف أو موقع مختلف.
    2. FileFormat:
      1.  تحديد تنسيق الملف للمصنف المحفوظ. هذه الوسيطة اختيارية، وإذا تم حذفها، فسيقوم Excel بحفظ المصنف بتنسيق الملف الافتراضي (xlOpenXMLWorkbook أو xlWorkbookNormal استنادا إلى إصدار Excel).

    أهم تنسيقات الملفات في Excel VBA

        xlOpenXMLWorkbook (.xlsx):

            تنسيق Excel الافتراضي ابتداءً من Excel 2007.

            لا يتضمن وحدات الماكرو أو Microsoft VBA.

        xlOpenXMLWorkbookMacroEnabled (.xlsm):

            يستخدم لحفظ كتب العمل مع وحدات الماكرو.

            يستخدم بشكل خاص عندما يحتوي كتاب العمل على وحدات ماكرو VBA.

        xlExcel12 (.xlsb):

            تنسيق ثنائي لكتب العمل في Excel.

            يمكن أن يكون أكثر كفاءة في الأداء وأصغر حجمًا مقارنة بـ .xlsx، خاصة للملفات الكبيرة.

            يدعم وحدات الماكرو.

        xlWorkbookNormal (.xls):

            تنسيق Excel التقليدي المستخدم في الإصدارات قبل 2007.

            يفيد عندما تحتاج إلى توافق مع الإصدارات الأقدم من Excel.

        xlCSV (.csv):

            تنسيق ملف القيم المفصولة بفواصل.

            مفيد للتصدير والاستيراد مع الأنظمة التي لا تدعم تنسيقات الملفات الأخرى.

        xlText (.txt):

            لحفظ الملفات كنص بسيط

        xlXMLSpreadsheet (.xml):

            تنسيق XML لكتب العمل في Excel.

            يمكن استخدامه لتبادل البيانات مع التطبيقات الأخرى التي تدعم XML.

    • Password:
      • تحديد كلمة مرور لحماية المصنف المحفوظ. هذه الحجة اختيارية.
    • WriteResPassword:
      •  تحديد كلمة مرور لحماية المصنف من الكتابة فوقه أو تعديله بواسطة مستخدم بكلمة مرور مختلفة. هذه الحجة اختيارية.
    • ReadOnlyRecommended:
      • تحديد ما إذا كان سيتم التوصية بفتح المصنف للقراءة فقط أم لا. هذه الحجة اختيارية.
    • CreateBackup:
      • تحديد ما إذا كان سيتم إنشاء ملف نسخ احتياطي عند حفظ المصنف. هذه الحجة اختيارية.

    فيما يلي مثال على استخدام طريقة SaveAs مع بعض هذه الوسيطات:

    ThisWorkbook.SaveAs Filename:="C:\MyFolder\MyWorkbook.xlsx", _
    FileFormat:=xlOpenXMLWorkbook, _
    Password:="mypassword", _
    WriteResPassword:="mywritepassword", _
    ReadOnlyRecommended:=True, _
    CreateBackup:=False

    في هذا المثال، يتم حفظ المصنف كمصنف Excel مع اسم الملف والمسار C:\MyFolder\MyWorkbook.xlsx. يتم تحديد كلمة مرور للمصنف، بالإضافة إلى كلمة مرور لحماية المصنف من الكتابة فوقه أو تعديله. يوصى أيضا بفتح المصنف للقراءة فقط، ولا يتم إنشاء أي ملف نسخ احتياطي.

    Sure, here are some more arguments for the SaveAs method:

    • AccessMode:
      • يحدد وضع الوصول للمصنف المحفوظ. هذه الوسيطة اختيارية، ويمكن تعيينها إلى xlNoChange (افتراضي) أو xlShared أو xlExclusive .
    • ConflictResolution:
      • يحدد كيفية حل التعارضات إذا كان الملف الذي يتم حفظه موجودا بالفعل. هذه الوسيطة اختيارية، ويمكن تعيينها إلى Excel.XlSaveConflictResolution.xlLocalSessionChanges  (افتراضي) أو Excel.XlSaveConflictResolution.xlUserResolution.
    • AddToMru:
      •  يحدد ما إذا كان سيتم إضافة الملف المحفوظ إلى قائمة الملفات المستخدمة مؤخرا أم لا. هذه الوسيطة اختيارية، ويمكن تعيينها إلى صواب أو خطأ.
    • TextCodepage:
      • تحديد صفحة التعليمات البرمجية لاستخدامها لحفظ المصنف كملف نصي. هذه الوسيطة اختيارية، ويمكن تعيينها إلى رقم صفحة  كود  أو اسم.
    • TextVisualLayout:
      • تحديد ما إذا كان سيتم استخدام التخطيط المرئي لحفظ المصنف كملف نصي أم لا. هذه الوسيطة اختيارية، ويمكن تعيينها إلى xlTextVisualLTR (من اليسار إلى اليمين) أو xlTextVisualRTL (من اليمين إلى اليسار) أو xlTextVisualDefault (  افتراضي).

     

    ThisWorkbook.SaveAs Filename:=”C:\MyFolder\MyWorkbook.txt”, _

                        FileFormat:=xlText, _

                        AccessMode:=xlExclusive, _

                        ConflictResolution:=xlUserResolution, _

                        AddToMru:=False, _

                        TextCodepage:=65001, _

                        TextVisualLayout:=xlTextVisualLTR

    في هذا المثال، يتم حفظ المصنف كملف نصي باسم الملف والمسار C:\MyFolder\MyWorkbook.txt. يتم تعيين وضع الوصول إلى حصري، ويتم تعيين حل التعارض إلى حل المستخدم. لا تتم إضافة الملف المحفوظ إلى قائمة الملفات المستخدمة مؤخرا. يتم تعيين صفحة  كود  النص إلى Unicode (UTF-8) ، ويتم تعيين التخطيط المرئي إلى اليسار إلى اليمين.

    ما الفرق بين حفظ وحفظ باسم

    يتم استخدام أساليب حفظ وحفظ باسم كائن المصنف في  Excel VBA لحفظ المصنفات ، لكنها تختلف في وظائفها.

     يتم استخدام الأسلوب حفظ لحفظ المصنف الحالي باسم الملف الموجود ومساره. إذا لم يتم حفظ المصنف مسبقا،  فستعرض طريقة حفظ مربع الحوار حفظ باسم للسماح للمستخدم بتحديد اسم الملف وموقعه.

    على سبيل المثال، تقوم التعليمة البرمجية التالية بحفظ المصنف الحالي:

    ThisWorkbook.Save

    من ناحية أخرى ، يتم استخدام طريقة SaveAs لحفظ نسخة من المصنف باسم ملف أو موقع أو تنسيق ملف مختلف. عند استخدام  أسلوب SaveAs،  يمكنك تحديد اسم ملف جديد وموقعه، ويمكنك أيضا تحديد تنسيق ملف مختلف، مثل xlCSV أو xlText.

    على سبيل المثال، تقوم التعليمة البرمجية التالية بحفظ نسخة من المصنف الحالي باسم ملف جديد وموقعه:

    ThisWorkbook.SaveAs “C:\MyFolder\MyWorkbook.xlsx”

    لذا ، فإن الاختلاف الرئيسي بين  طرق Save  و  SaveAs  هو أن Save يحفظ المصنف باسم  الملف الحالي وموقعه ، بينما يحفظ SaveAs المصنف كنسخة باسم ملف جديد وموقعه.

    • PrintOut:
    •  

    في Excel VBA، الأمر `PrintOut` يستخدم لطباعة الورقة أو المجموعة المحددة من الورقات من داخل (`Workbook`). هذا الأمر يوفر تحكمًا برمجيًا على عملية الطباعة، مما يتيح لك تحديد مجموعة واسعة من الخيارات مثل عدد النسخ، الصفحات المحددة للطباعة، وغيرها.

    ### الصيغة العامة للأمر `PrintOut`

    Worksheets(“Sheet1”).PrintOut(From, To, Copies, Preview, ActivePrinter, PrintToFile, Collate, PrToFileName, IgnorePrintAreas)

    “`

    ### الوسيطات (المعاملات)

    1. **From**: معامل اختياري. يحدد رقم أول صفحة للطباعة. إذا تُرك فارغًا، يبدأ من الصفحة الأولى.

    2. **To**: معامل اختياري. يحدد رقم آخر صفحة للطباعة. إذا تُرك فارغًا، يطبع حتى آخر صفحة.

    3. **Copies**: معامل اختياري. يحدد عدد النسخ التي ستُطبع.

    4. **Preview**: معامل اختياري. `True` لعرض معاينة قبل الطباعة.

    5. **ActivePrinter**: معامل اختياري. يحدد الطابعة المستخدمة.

    6. **PrintToFile**: معامل اختياري. `True` إذا كنت ترغب في طباعة الملف إلى ملف.

    7. **Collate**: معامل اختياري. `True` لتجميع النسخ.

    8. **PrToFileName**: معامل اختياري. يُستخدم عند `PrintToFile` لتحديد اسم الملف.

    9. **IgnorePrintAreas**: معامل اختياري. `True` لتجاهل أي مناطق طباعة محددة وطباعة الصفحة بأكملها.

    ### مثال على الاستخدام

    طباعة الورقة الأولى من “Sheet1” مع معاينة قبل الطباعة

    Worksheets(“Sheet1”).PrintOut From:=1, To:=1, Copies:=1, Preview:=True

    في هذا المثال، يتم طباعة الصفحة الأولى فقط من ورقة العمل “Sheet1”، ويتم عرض معاينة قبل الطباعة.

    توفر الوسيطات المختلفة المرفقة مع `PrintOut` مرونة كبيرة في التحكم بعملية الطباعة، مما يجعل هذا الأمر مفيدًا جدًا في السيناريوهات التي تتطلب تحكمًا دقيقًا في كيفية طباعة الوثائق.

    Dim wb As Workbook
    Set wb = ThisWorkbook

    wb.Activate

    تقوم هذه التعليمة البرمجية بتعيين متغير wb إلى المصنف الحالي (ThisWorkbook) ثم تنشيط المصنف بحيث يكون الإطار النشط.

    savecopy as

    يتم استخدام الأسلوب SaveCopyAs لإنشاء نسخة من مصنف مفتوح باسم جديد أو في موقع مختلف. تحفظ هذه الطريقة نسخة من المصنف بكل محتوياته وتنسيقاته وصيغه الحالية، ولكنها لا تؤثر على المصنف الأصلي.

    يأخذ الأسلوب SaveCopyAs وسيطة واحدة ، وهي اسم الملف ومسار النسخة المراد حفظها. فيما يلي مثال على كيفية استخدام  طريقة SaveCopyAs:

    ActiveWorkbook.SaveCopyAs “C:\MyFolder\MyWorkbook_Copy.xlsx”

    في هذا المثال، يتم حفظ المصنف النشط كنسخة باسم الملف والمسار C:\MyFolder\MyWorkbook_Copy.xlsx.

    من المهم ملاحظة أن الأسلوب SaveCopyAs لا يغلق المصنف الأصلي. إذا كنت تريد إغلاق المصنف الأصلي ، فأنت بحاجة إلى استخدام طريقة الإغلاق بشكل منفصل.

    أيضا ، على عكس طريقة SaveAs ،  لا تسمح لك طريقة SaveCopyAs بتحديد تنسيق الملف أو الخيارات الأخرى عند حفظ نسخة المصنف. يقوم ببساطة بإنشاء نسخة من المصنف بنفس تنسيق الأصل.

    ــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

    • Protect:

    في Excel VBA، يتم استخدام الأمر Protect لحماية (Workbook). هذا يساعد في منع التغييرات غير المرغوبة أو غير المصرح بها على المصنف، مثل إضافة، حذف، أو تغيير ترتيب الأوراق.

    الصيغة العامة

    Workbook.Protect(Password, Structure, Windows)

    الوسيطات (المعاملات)

        Password: كلمة المرور لحماية المصنف. هذا المعامل اختياري، ولكن بدونه، لن يكون هناك أمان حقيقي.

        Structure: إذا تم تعيينها إلى True, يمنع المستخدمين من إضافة، حذف، إخفاء، إظهار، أو تغيير ترتيب الأوراق في المصنف.

        Windows: إذا تم تعيينها إلى True, يمنع تغيير حجم نافذة المصنف أو نقلها.

    مثال على الاستخدام

    ThisWorkbook.Protect Password:=”myPassword”, Structure:=True, Windows:=False

    في هذا المثال، يتم حماية هيكل المصنف ThisWorkbook بكلمة مرور myPassword. يمكن للمستخدمين تغيير حجم نافذة المصنف ونقلها (لأن Windows معين على False)، لكنهم لن يستطيعوا تغيير ترتيب أو إضافة أو حذف الأوراق.

    نقاط مهمة للأخذ بعين الاعتبار

        أمان كلمة المرور: كلمات المرور في Excel ليست أقوى أشكال الأمان. يمكن كسرها بأدوات متخصصة.

        الحماية المتقدمة: لحماية محتوى الخلايا، يجب استخدام حماية ورقة العمل (Worksheet.Protect).

    • unprotect

    في Excel VBA، يستخدم الأمر Unprotect لإلغاء حماية المصنف (Workbook) الذي تم حمايته سابقًا باستخدام الأمر Protect. إلغاء الحماية يسمح بإجراء تغييرات على هيكل المصنف، مثل إضافة أو حذف الأوراق، أو تغيير ترتيبها، وذلك إذا كانت هذه الأنشطة قد تم منعها بواسطة الحماية.

    الصيغة

    Workbook.Unprotect(Password)

    الوسيطات (المعاملات)

        Password: هذه الوسيطة اختيارية وتستخدم إذا تم تعيين كلمة مرور عند حماية المصنف. يجب أن تكون كلمة المرور هذه مطابقة لكلمة المرور المستخدمة لحماية المصنف

    مثال على الاستخدام

    في هذا المثال، يتم إلغاء حماية المصنفالحالي ThisWorkbook باستخدام كلمة المرور “myPassword”.

    النقاط المهمة

        إذا لم تستخدم كلمة مرور: إذا كان المصنفقد تم حمايته بدون كلمة مرور، يمكنك ببساطة استخدام Workbook.Unprotect() بدون تحديد كلمة مرور.

        أمان كلمة المرور: إذا كان المصنفمحميًا بكلمة مرور ونسيتها، فلن تتمكن من إلغاء الحماية بسهولة. يجب توخي الحذر عند استخدام كلمات المرور لحماية البيانات.

    استخدام Unprotect يعيد القدرة على تعديل هيكل المصنفوهو خطوة ضرورية قبل إجراء تغييرات على المصنفتم حمايته مسبقًا.

     

    اترك تعليقاً

    لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *