اذهب إلى المحتوى

استخدام الشيفرات لتنفيذ العمليات الأساسية في مايكروسوفت إكسل VBA


محمد Albittar

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

  • إضافة صفحة عمل جديدة.
  • تحديد الخلايا.
  • عمليتا النسخ واللصق.
  • إلغاء تحديد الخلايا المنسوخة.
  • عمليتا القص واللصق.
  • إسناد قيمة إلى خلية معينة.

إضافة صفحة عمل جديدة

نُضيف صفحات جديدةً عن طريق التعليمة التالية:

Sub add_sheet ()
Worksheets.add
End Sub

تُضاف الصفحة بالاسم الافتراضي بهذه الطريقة، وذلك حسب الترقيم الافتراضي (… ,sheet1, sheet2, sheet3)؛ أما إذا أردنا وضع اسم معين للصفحة، فيمكننا ذلك عن طريق التعليمة التالية:

Sub add_sheet()
Worksheets.add.name = name
End Sub

حيث تُعبر name عن اسم اختياري للصفحة.

تحديد الخلايا

يمكننا تحديد خلية أو مجموعة من الخلايا عن طريق التعليمة التالية:

Sub selection()
   Range("عنوان الخلية").Select
End Sub

عمليتا النسخ واللصق

لدينا عدة حالات يمكن استخدامها لنسخ ولصق الخلايا:

النسخ واللصق مباشرة

تختلف الآلية هنا باختلاف مكان لصق البيانات المنسوخة، ولدينا عدة أشكال:

  • اللصق في نفس الصفحة.
  • اللصق في صفحة أخرى.
  • اللصق في ملف آخر.

اللصق في نفس الصفحة

الأوامر المسؤولة عن العمليتين هي:

Sub Range_Copy_paste()
    Range("الخلية التي نريد نسخها").Copy Range("الخلية التي سنلصق فيها المحتوى المنسوخ")
    Range("المجال الذي نريد نسخه").Copy Range("المجال الذي سنلصق فيه المحتوى المنسوخ")
    Range("المجال الذي نريد نسخه").Copy Range("بداية مجال اللصق للمحتوى المنسوخ")
End Sub

نلاحظ وجود فراغ يفصل بين التعليمة Range(" ").Copy والتعليمة الخاصة باللصق، ويجب أن تكونا في نفس السطر البرمجي.

مثال

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

001CopyPaste.PNG

Sub Range_Copy_paste()
    Range("A1").Copy Range("C1")
    Range("A1:A3").Copy Range("D1:D3")
    Range("A1:A3").Copy Range("D1")
End Sub

002CopyPaste.gif

نلاحظ أن اللصق يحصل بكامل ما تحتويه الخلية من تنسيقات ومعادلات وبيانات.

اللصق في صفحة أخرى

لاستعمال هذه الطريقة للنسخ من صفحة واللصق في صفحة أخرى تكون التعليمات كما يلي:

Sub Range_Copy_paste_in_other_sheet()
    Worksheets("الصفحة التي سننسخ منها البيانات").Range("الخلية التي نريد نسخها").Copy Worksheets("الصفحة التي سننسخ البيانات إليها").Range("الخلية التي سنلصق فيها المحتوى المنسوخ")
End Sub

اللصق في ملف آخر

نتعامل مع النسخ من ملف إكسل إلى آخر بنفس الأسلوب، وتكون التعليمات كالتالي:

Sub Range_Copy_paste_in_other_workbook()
    Workbooks("اسم الملف الذي سننسخ منه البيانات.xlsx")_
.Worksheets("الصفحة التي سننسخ منها البيانات").Range("الخلية التي نريد نسخها").Copy_
 Workbooks("اسم الملف الذي سننسخ إليه البيانات.xlsx")_
.Worksheets("الصفحة التي سننسخ البيانات إليها").Range("الخلية التي سنلصق فيها المحتوى المنسوخ")
End Sub
مثال

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

Sub Range_Copy_paste_in_other_sheet()

    Worksheets("Sheet1").Range("A1").Copy Worksheets("Sheet2").Range("A1")

    Workbooks("Book1.xlsx").Worksheets("Sheet1").Range("A1").Copy _
        Workbooks("Book2.xlsx").Worksheets("Sheet1").Range("A1")
End Sub

003CopyPaste.gif

اقتباس

ملاحظة هامة: عندما يكون السطر البرمجي طويلًا جدًا ولا تتسع الشاشة لعرضه كاملًا، فيمكننا تقسيمه إلى أسطر بإضافة شرطة سفلية (_) في المكان الذي نريد الانتقال منه إلى سطر آخر، كما في المثال السابق في التعليمة الأخيرة منه (السطر الثالث).

النسخ واللصق عن طريق الإسناد

يمكننا هنا جعل خلية تأخذ قيمة خلية أخرى عن طريق الإسناد، وتكون التعليمات كالتالي:

Sub Paste_Values_Examples()
    Range("الخلية التي نريد النسخ إليها").Value = Range("الخلية التي نريد نسخها").Value
    Range("المجال الذي نريد نسخه").Value = Range("المجال الذي سنلصق فيه المحتوى المنسوخ").Value
End Sub

ونتعامل مع النسخ من صفحة إلى أخرى ومن ملف إلى آخر بنفس الأسلوب.

مثال

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

Sub Paste_Values_Examples()
  النسخ واللصق ضمن نفس الصفحة
    Range("C1").Value = Range("A1").Value
    Range("D1:D3").Value = Range("A1:A3").Value

النسخ واللصق في صفحة أخرى
    Worksheets("Sheet2").Range("A1").Value = Worksheets("Sheet1").Range("A1").Value

النسخ واللصق في ملف آخر
    Workbooks("file2.xlsm").Worksheets("Sheet1").Range("A1").Value  _
    =Workbooks("file1.xlsm").Worksheets("Sheet1").Range("A1").Value        
End Sub

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

004CopyPaste.gif

النسخ واللصق الخاص

يمكننا نسخ البيانات واستعمال اللصق الخاص -كما في مايكروسوفت إكسل- باستعمال التعليمات التالية:

  • عند النسخ واللصق في نفس الصفحة
Sub PasteSpecial_Examples()
    Range("الخلية التي نريد نسخها").Copy
    Range("الخلية التي نريد لصق المحتوى فيها").PasteSpecial Paste: = type_of_paste
End Sub
  • عند النسخ واللصق في صفحة أخرى
Sub PasteSpecial_Examples()
    Worksheets("اسم الصفحة التي تنسخ منها البيانات").Range("المجال الذي نريد نسخه").Copy 
    Worksheets("اسم الصفحة التي سنلصق فيها البيانات").Range("المجال الذي سنلصق فيه البيانات").PasteSpecial Paste: = type_of_paste
End Sub
  • عند النسخ واللصق في ملف آخر
Sub PasteSpecial_Examples()    
    Workbooks("اسم الملف الذي ننسخ منه البيانات.xlsx").Worksheets("اسم الصفحة").Range("المجال الذي نريد نسخه").Copy
Workbooks("اسم الملف الذي سننسخ إليه البيانات.xlsx")_
.Worksheets("الصفحة التي سننسخ البيانات إليها").Range("الخلية التي سنلصق فيها المحتوى المنسوخ")_
.PasteSpecial Paste: = type_of_paste
End Sub

حيث تُعبر type_of_paste عن نوع اللصق الخاص الذي نريده، وفيما يلي أهم أشكاله:

  • xlPasteAll لصق الخلايا مع التنسيقات.
  • xlPasteAllExceptBorders لصق الخلايا مع التنسيقات عدا حدود الخلية.
  • xlPasteColumnWidths لصق عرض العمود المنسوخ.
  • xlPasteComments لصق التعليقات.
  • xlPasteFormats لصق التنسيقات فقط.
  • xlPasteFormulas لصق المعادلات أو الدوال المستخدمة في خلايا المصدر.
  • xlPasteFormulasAndNumberFormats لصق المعادلات أو الدوال المستخدمة في خلايا المصدر بالإضافة لتنسيقات الأرقام.
  • xlPasteValidation لصق عمليات التحقق من صحة البيانات.
  • xlPasteValues لصق المحتوى فقط بدون أية تنسيقات أو معادلات.

مثال

لنَعُد إلى المثال السابق وننسخ الخلية A1، ثم نُلصق البيانات بشكل خاص في خلايا العمود D باستعمال بعض الأنواع السابقة من اللصق الخاص، لذا نكتب التعليمات التالية:

Sub PasteSpecial_Examples()
 Range("A1").Copy
 Range("D1").PasteSpecial Paste:=xlPasteAll
 Range("D3").PasteSpecial Paste:=xlPasteAllExceptBorders
 Range("D5").PasteSpecial Paste:=xlPasteFormats
 Range("D7").PasteSpecial Paste:=xlPasteValues

End Sub

005CopyPaste.gif

اقتباس

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

نعيد كتابة الإجراء الخاص بالمثال السابق بدون التعليمة Paste:= لنجده يعمل دون أية أخطاء:

Sub PasteSpecial_Examples()
 Range("A1").Copy
 Range("D1").PasteSpecial xlPasteAll
 Range("D3").PasteSpecial xlPasteAllExceptBorders
 Range("D5").PasteSpecial xlPasteFormats
 Range("D7").PasteSpecial xlPasteValues
End Sub

006CopyPaste.gif

إلغاء تحديد الخلايا المنسوخة

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

Sub PasteSpecial_Examples()
Application.CutCopyMode = False
End Sub

تأخذ التعليمة إما القيمة True التي تُبقي التحديد وهي القيمة الافتراضية، أو القيمة False التي تُلغيه.

007CopyPaste.gif

عمليتا القص واللصق

يمكننا إجراء عملية القص بنفس الطريقة المباشرة لعملية النسخ، كما يلي:

Sub Range_Copy_paste()
    Range("الخلية التي نريد نسخها").Cut Range("الخلية التي سنلصق فيها المحتوى المنسوخ")
    Range("المجال الذي نريد نسخه").Cut Range("المجال الذي سنلصق فيه المحتوى المنسوخ")
    Range("المجال الذي نريد نسخه").Cut Range("بداية مجال اللصق للمحتوى المنسوخ")
End Sub

ويمكن تنفيذ اللصق في صفحة أخرى، أو في ملف آخر مثل عملية النسخ.

مثال

لنَعُد إلى المثال السابق حيث نريد قص 7 خلايا من العمود A ولصقها في عمود آخر، ثم قصها مرةً أخرى ولصقها في الصفحة الثانية، كما نريد قص 7 خانات من العمود B ولصقها في الملف الثاني، لذا تكون التعليمات كالتالي:

Sub Paste_Values_Examples()
    Range("A1:A7").Cut Range("D1")

    Worksheets("Sheet1").Range("D1:D7").Cut Worksheets("Sheet2") _
    .Range("A1")

    Workbooks("file1.xlsm").Worksheets("Sheet1").Range("B1:B7").Cut _
        Workbooks("file2.xlsm").Worksheets("Sheet1").Range("A1")

End Sub

008CutPaste.gif

إسناد قيمة إلى خلية معينة

نستطيع إسناد قيمة إلى خلية؛ إما بإسناد قيمة مباشرة، أو بإسناد قيمة مساوية لقيمة خلية أخرى، كالتالي:

  • إسناد قيمة مباشرة عن طريق التعليمة التالية:
Range("عنوان الخلية") = "القيمة التي نريد إسنادها"
  • إسناد قيمة مساوية لقيمة خلية أخرى عن طريق التعليمة التالية:
Range("عنوان الخلية") =  Range("عنوان الخلية التي سنُسند قيمتها للخلية الأخرى").value

مثال

لنطبق التعليمتين السابقتين على بياناتنا، بحيث نُسند قيمة الخلية B5 إلى الخلية A3، ونسند القيمة أحمد في الخلية A10، لذا نكتب الإجراء التالي:

Sub attribution()
Range("A3") = Range("B5").Value
Range("c10") = 61
End Sub

009Attribution.gif

خاتمة

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

اقرأ أيضًا


تفاعل الأعضاء

أفضل التعليقات

لا توجد أية تعليقات بعد



انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أضف تعليق

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • أضف...