اذهب الي المحتوي
أوفيسنا
بحث مخصص من جوجل فى أوفيسنا
Custom Search

حصريا : دورة كاملة في شرح VBA وتطبيقاته في إكسيل


الردود الموصى بها

طال انتظارى اليك والقلب اشتاق ليك

ارجو التكرم حين التطرق لموضوع الترحيل مرعاة شرح كيفية ترحيل اخر صف باحد الأعمدة بجدول لاخر صف بعمو اخر بجدول اخر

رابط هذا التعليق
شارك

السلام عليكم

مجهود رائع ومميز اخي ابو هاجر

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

مع الشكر

ابو خالد

__________________VBA___________________.rar

رابط هذا التعليق
شارك

أخي العزيز : نزار

ماشاء الله عليك اعداد جيد للمذكرة

واكيد لما تكمل هتبقى أجمل وأكمل ، والكمال لله وحده

شكرا لك وجزاك الله خيرا

واللي انت عايزه انا تحت امرك

رابط هذا التعليق
شارك

الأخ بو عمار مشكور لك جزيلا

وأرجو من الله أن يكون هذا الموضوع فاتحة خير على الجميع

الموضوع مهم للغاية ولا يكفي المادة العلمية عايزين من الأخوة المشرفين الدعم

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

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

والهدف واحد باعتقادي ، اللي ميعرفش يعرف والثمن دعوة عن ظهر قلب

رابط هذا التعليق
شارك

السلام عليكم

اخي ابو هاجر

مشكور على مجهودك الكبير

لي ملاحظة على هذا الجزء قد يفهم بشكل خاطي .

- السطر الثالث والأخير == يقوم بتحديد شكل الخط إلى أسود من خلال خاصية الخط Font Object وتطبيقها على نطاقين من الخلايا في ورقة العمل النشطة ، والنطاقان هما (B1:C1 ، E1:F1 ) ، ومسموح لك فقط بإرجاع نطاقان اثنين فقط كحد أقصى ، وإضافة نطاق ثالث إلى القوسين يرجع القيمة الخطأ run-time error .

للتوضيح ال RANGE

(B1:C1 ، E1:F1 )

عبارة عن المدى من الخلابا B1:C1 الى مدى من الخلايا E1:F1 فهو الى وليس و

يعن نقدر نقول Range(Start,End) eg وال End اختياري

فالموضوع ليس يقبل اثنين او ثلاثة ولكنه من الى فقط

فلو وضعت(" Range("A1","Z1 فمعناه من A الى Z وليس AوZ

لكن لو كتبت(" Range("A1,Z1 فمعناه A وZ

وبهذا ممكن تكتب( "Range("A1,B2,C3:C10,D8,AB5,F3:G8

يعني مدى متقطع

ارجو اكون وفقت اوصل معلومة

تحياتي

رابط هذا التعليق
شارك

بسم الله الرحمن الرحيم

نستكمل أيها الأخوة الأفاضل الجزء الثالث من الجزء الثالث 3/3

I) استخدام خصائص الخلايا ... Using the Cells Property

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

Cells(2,2).Select
هنا فقد اخترت الخلية ( B2 ) في ورقة العمل - لاختيار أو إرجاع خلية في ورقة العمل يجب أن تحددها عن طريق فهرسها أو دليلها ، الفهرس يمكن أن يكون قيمة واحدة تبدأ من الخلايا في أعلى يسار ورقة العمل ( أو أعلى اليمين في النسخة العربية ) ، على سبيل المثال لإرجاع القيمة 5 للخلية D5 ، فإننا يمكننا ذلك عن طريق إما إرجاع فهرس الخلية أو بمدلول الصف والعمود ( مستحسن ) كالتالي :
Cells(1, 4).Value=5
Cells(1, ”D”).Value =5
وذلك هو التدوين المألوف خلال هذه الدورة ، كلا الكودين السابقين سيقومان بإرجاع القيمة ( 5 ) للخلية ( D1 ) على حد سواء لورقة العمل النشطة ، كذلك يمكنك استخدام الأرقام أو السلاسل المرجعية في الإشارة إلى العمود ، ولاحظ أن الإشارة إلى العمود تأتي بعد الإشارة إلى الصف في المثالين ويفصل بينهما فاصلة ( , ) وأنا أوصي باستخدام الطريقة الثانية بالمثال أعلاه حيث أنها تتجنب الغموض في الإشارة إلى العمود ، وقد تكون الإشارة الرقمية أحسن في بعض الأحوال كما سيتبين فيما بعد ، ومع بعض الأمثلة على استخدام خصائص الخلايا في كائنات النطاق :
Range(“C5:E7”).Cells(2, 2).Value = 100
Range(“C5:E7”).Cells(2, “A”).Value = 100
قد تؤدي تلك الأكواد إلى بعض التخبط لديك لأنها تبدو وكأنها ترجع إلى نطاقين مختلفتين ، إلا أن الأمكر ليس كذلك ، ولكن يمكنك استخدام هذه الأمثلة لتوضيح كيف تعمل خصائص الخلايا . - قبل القراءة ، خمن أولا ما هي الخلية في ( ورقة العمل ) التي ستأخذ القيمة ( 100 ) في كلا الكودين ، إذا خمنت أنهما ( B2 ) ، ( A2 ) على التوالي فأنت على خطأ ، فبدلاً من ذلك ، فإن القيمة ( 100 ) ستكون في الخليتين ( D6 ) ، ( A6 ) على التوالي عند استخدام أسطر الأكواد بأعلى ، لماذا ؟؟ لأن خصائص الخلايا استخدمت كائنات نطاق كمرجعية وليس كائنات ورقة العمل ككل (“C5:E7”) ، فأصبح النطاق الحالي كورقة العمل كاملة ، ولذلك فإن الخلية (2, 2) كانت لتشير إلى الخلية B2 لو كان النطاق عبارة عن ورقة العمل ، أما في المثال أعلاه فإنها تشير إلى الصف الثاني والعمود الثاني داخل النطاق ( C5:E7 ) أي الصف السادس والعمود الرابع بورقة العمل ( D6 ) ، وباستخدام السلسلة في خصائص الخلية في الفهرس في المثال الثاني لتقوية اختيار العمود بغض النظر عن النطاق المختار ، يظل الصف كما هو داخل النطاق ، ولكن العمود تم تحديده خارج النطاق ولذلك فإن الفهرس يشير إلى الخلية ( A6 ) . II) طرق ومجموعة خصائص ( الخلايا والصفوف والأعمدة ) ... Method and Properties Range (Cells, Rows and Columns) إليك بعض الأكواد للتجول خلال كائنات النطاق : • Selection , ActiveCell - إن الكائن Selection يشكل ما تم تحديده واختياره ، فيمكن أن يكون خلية مفردة ، أو مجموعة خلايا أو صف أو عمود أو العديد من هذه فعلى سبيل المثال :
Range("A1:A50").Select
Selection.ClearContents 
هذا الكود يقوم بإزالة محتويات الخلايا من A1 إلى A50 ( قيم أو صيغ ) . - أما ActiveCell فهو عبارة عن فكرة مهمة جدا سوف تحتاج لتذكرها عندما تبدأ بتطوير إجراءات أكثر تعقيداً . • Range, Select - لتحديد خلية ..
Range("B1").Select 
- لتحديد خلايا متجاورة ..
Range("A1:A5").Select
- لتحديد خلال غير متجاورة ..
Range("C1,E5,F6").Select
• Columns, Rows, Select, EntireRow, EntireColumn - لتحديد عمود ..
Columns("A").Select
- لتحديد مجموعة من الأعمدة المتجاورة ...
Columns("A:B").Select
- لتحديد أعمدة غير متجاورة ...
Range("A:A,C:C,F:F").Select
- لتحديد صف ...
Rows("1").Select
- يمكنك تحديد الأعمدة والصفوف بأحد الطرق التالية :
ActiveCell.EntireColumn.Select
ActiveCell.EntireRow.Select
Range("B1").EntireColumn.Select
Range("B1").EntireRow.Select
حيث أن ( EntireColumn ) كامل العمود ، و ( EntireRow ) كامل الصف إذا تم تحديد أكثر من خلية فإن الأكواد التالية ستقوم بتحديد كامل الصف أو العمود التي يشملها ذلك التحديد ..
Selection.EntireColumn.Select
Selection.EntireRow.Select
• Cells, CurrentRegion - لتحديد كل الخلايا
Cells.Select
• Offset الطريقة الأكثر استخداما Offset التي تتيح لك التحرك والتنقل أعلى وأسفل يمينا ويسارا .. - على سبيل المثال لو أردت التحرك خليتين إلى اليمين ..
Activecell.Offset(0,2).Select
- ولو أردت التحرك خليتين إلى اليسار..
Activecell.Offset(0,-2).Select
- إذا أردت التحرك خليتين إلى أسف ..
Activecell.Offset(2,0).Select
- إذا أردت التحرك خليتين لأعلى ..
Activecell.Offset(-2,0).Select
- إذا أردت تحديد خلية والتحرك ثلاث خلايا لأسفل ..
Range(Activecell,Activecell.Offset(3,0)).Select
Range("A1",Range("A1").Offset(3,0)).Select
• Column, Row, Columns, Rows, Count - لاحظ أن الأكواد التالية تقوم بإرسال النتيجة إلى متغير ..
myvar = Activecell.Column   ترجع رقم العمود
myvar = Activecell.Row ترجع رقم الصف  

myvar = Selection.Columns.Count ترجع عدد الأعمدة في التحديد  
myvar = Selection.Rows.Count ترجع عدد الصفوف في التحديد  

myvar = Selection.CurrentRegion.Rows.Count ترجع عدد الصفوف في المنطقة الحالية للتحديد  
• Value - عندما تريد أن تدخل قيمة رقمية في خلية ...
Range("C1").Select
Selection.Value = 56
- لاحظ أنه لا يتحتم عليك تحديد الخلية لإدخال قيمة لها ، ففي أي مكان يمكنك كتابة التالي ..
Range("C1").Value = 56
- حتى أنه يمكنك تغيير قيمة خلية في ورقة أخرى تحددها أنت ..
Worksheets("Good").Range("C1").Value = 56
- يمكنك أيضا إدخال قيمة واحدة لعدة خلايا ..
Range("A1:B33").Value = 56
- هذا إذا كانت القيمة المدخلة عبارة عن أرقام ، أما إذا كنت تريد إدخال نص في خلية فعليك استخدام الأقواس المزدوجة ( " " ) ..
Range("C1").Value  = "Nancy"
- إذا كنت تريد أن تدخل نصاً داخل أقواس مزدوجة ، فعليك كتابة النص داخل 3 أقواس مزدوجة في الكود ..
Range("C1").Value  = """Peter"""
• Formula - كي تدخل صيغة في خلية فأنت في حاجة إلى الكود التالي ..
Range("A1").Select
Selection.Formula = "=B8+C8"
- لاحظ أن علامتي التساوي في الكود تندرج أحداهما داخل الأقواس المضاعفة وتقوم بكتابة الصيغة تماما كأنك داخل ورقة العمل ، مرة أخرى أنت لست في حاجة لتحديد خلية ثم كتابة صيغة بداخلها ..
Range("A1").Formula = "=B8+C8"
- أما إذا كتبت الكود التالي ..
Range("A1:A8").Formula = "=C8+C9"
فإن الصيغة في الخلية ( A1 ) = C8+C9 ، وفي الخلية ( A2 ) = C9+C10 .. وهكذا ، أما إذا كنت تريد تحديد صيغة معينة ثابتة للخلايا فإنه يتحتم عليك استخدام العلامة ( $ ) لإيقاف ديناميكية الصيغ داخل النطاق المحدد ..
Range("A1:A8").Formula = "=$C$8+$C$9"
2) تبسيط إرجاع ( الإشارة إلى ) كائن .. Simplifying object references
Application.Workbooks(“Book1.xls”).Worksheets(1).Range(“A1”).Value
- لست بحاجة إلى وصف الخلية أو المدى الذي تريده وصفا كاملاً كالمثال أعلاه ، فإكسيل يوفر لك بعض الاختصارات التي يمكن أن تفيد وتحسن القراءة وتوفر الوقت والكتابة ، بالنسبة للمبتدئين فإن كائنات التطبيق تفترض دائما إهمال الإشارة إلى كائنات التطبيق لاختصار القسم السابق ..
Workbooks(“Book1.xls”).Worksheets(1).Range(“A1”).Value
- ولو كان Book1.xls هو المصنف النشط حاليا ، يمكنك اختصار الإشارة إليه أيضا ...
Worksheets(1).Range(“A1”).Value
- وكذلك لو كانت ورقة العمل الحالية هي الورقة النشطة فإنه يمكن اختصار الإشارة إليها أيضا ..
Range(“A1”).Value
** العمل مع الكائنات Working with Objects ** - لقد تعلمت من خلال أمثلة عديدة تعرضت للكائنات وكيفية إعداد خصائصها وأساليب وطرق إجراء أحداثها ، وهناك بعض الأدوات القليلة التي قد تكون هامة للغاية عند التعامل مع الكائنات ، على سبيل المثال (With/End ) - بنية الكود أو هيكله يعمل على تبسيط الكود ونوع بيانات الكائنات ، التي تتيح لك الإشارة إلى كائن موجود أو إنشاء كائن جديد ، ولنلق نظرة على المثال أدناه .. • With/End - أنا دائما أوصي باستخدام هذه التركيبة أو البنية لأنها تجعل برنامج أكثر قابلية للقراءة والفهم ، كما سوف ترى في كثير من الأحيان With/End في هيكل الماكرو المسجل ، أنظر في الكود التالي ...
Range(“A1:D1”).Select
Range(“A1:D1”).Value = 100
With Selection.Font
       .Bold = True
       .Name = “Times New Roman”
       .Size = 16
End With
With Selection
   .HorizontalAlignment = xlCenter
   .VerticalAlignment = xlCenter
End With
- عند التنفيذ ، يقوم هذا الكود باختيار النطاق A1:D1 من ورقة العمل النشطة باستخدام طريقة أو أسلوب Select() method الخاصة بكائنات النطاق أو المدى ، وفي هذه الحالة فإن خصائص الاختيار الخاصة بكائنات الويندوز قد استخدمت لترجع نطاق من الكائنات ، حيث أن خصائص الخط ترجع كائن الخط المرتبط مع النطاق المختار أو المحدد . - والبيان أو التعبير أو الصيغة يمكن أن تكون بنفس السهولة التي كتبت بدون طريقة Select() وخصائص التحديد ، ويتم الادخال عن طريق خصائص النطاق ليتم إرجاع كائن النطاق المرجو ( على سبيل المثال .. With Range(“A1:D1”).Font ) .. - مرة أخرى داخل البنية ، أي خاصية من خصائص الكائنات يمكن إعدادها ووضعها بدون وصف أو تحديد الكائن في كل سطر من أسطر الكود ، والكائنات التابعة وخصائصها يمكن الوصول إليها أيضا ، كل سطر من أسطر البنية يجب أن يبدأ بنقطة ( . ) متبوعا بخاصية أو اسم كائن ، وبعد ذلك الطريقة Method أو الإحالة . - بعد تعيين الخصائص المرغوبة ، والطرق استخدمت لكائن معين فإننا نختم البنية بـ End With . - ويجب عليك ملاحظة أن With/End With المستخدمة في البناء الثانية استخدمت لتنسيق النطاق المحدد رأسيا وأفقيا ، وبهذه الطريقة يبدو الكود الخاص بك مرتبا مقروءا . - لهذا فإن بنية With/End With تعتبر طريقة واضحة ، ومفيدة بشكل خاص عند استخدام عدد كبير من الخصائص والطرق لمعالجة كائن واحد بالتتابع في البرنامج . 3) نوع بيانات الكائن The Object Data Type . - وأخيرا ، فإن موضوع كائنات إكسيل لن يكتمل بدون مناقشة نوع بيانات الكائنات ، إذا وجدت حالات أو اقتراحات متعددة لنفس الكائن في برنامجك يمكنك استخدام المتغيراتvariables بدلا الإشارة بشكل مستمر عن طريق التحديدات المقيدة ، وأيضا فإن المتغيرات يمكنك أن تسند لها دلالة الأسماء ، مما يجل البرنامج أسهل في تفسيره ، ومتغيرات الكائنات عادة مشابهة لأنواع بيانات كائنات VBA الأخرى وذلك يجب أن يعلن ويوضح في الكود ، على سبيل المثال ...
Dim myObject as Object
- هنا نعلن عن وجود كائن متغير واسمه (myObject ) ، ومع ذلك فتحديد قيمة لكائن متغير تختلف عن تحديدها لأكثر أنواع البيانات شيوعا ، الكلمة الدليلية Set يجب أن تستخدم لتحديد مهام الكائن المتغير ..
Set myObject = Range(“B1:C15”)
- هنا تم تحديد النطاق (B1:C15 ) على أنه ما يمثله المتغير (myObject ) تحديدا ، ويمكن بعد ذلك استخدام خصائص الكائن بالطريقة المعتادة ..
myObject.Font.Bold = True
- وهذا يجعل القيمة في النطاق (B1:C15 ) تعرض بخط أسود غامق ، والأكواد أعلاه يمكن كتابتها بشكل أكثر كفاءة كما يلي ..
Dim myRange as Excel.Range
Set myRange=Range(“B1:C15”)
myRange.Font.Bold = True

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

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

إلى اللقاء مع الجزء القادم ( المتغيرات – أنواع البيانات – الثوابت ... )

رابط هذا التعليق
شارك

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

اخي العزيز ......ابو هاجر المصري ....

الف الف شكر على هذا المجهود المتميز والمعلومات القيمة

بارك اله فيك وزادك من فضله وقرب اليك كل بعيد تتمناه

ونحن في انتظار المزيدمن هذا العطاء الرائع

رابط هذا التعليق
شارك

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

اخي العزيز ......ابو هاجر المصري ....

الف الف شكر على هذا المجهود المتميز والمعلومات القيمة

بارك اله فيك وزادك من فضله وقرب اليك كل بعيد تتمناه

ونحن في انتظار المزيدمن هذا العطاء الرائع

رابط هذا التعليق
شارك

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

اخي العزيز ......ابو هاجر المصري ....

الف الف شكر على هذا المجهود المتميز والمعلومات القيمة

بارك اله فيك وزادك من فضله وقرب اليك كل بعيد تتمناه

ونحن في انتظار المزيدمن هذا العطاء الرائع

رابط هذا التعليق
شارك

السلام عليكم أخي أبو هاجر

جزاك الله كل خير و جعله في ميزان حسناتك

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

جزاك الله كل خير

رابط هذا التعليق
شارك

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

اليكم الجزء الاول

___________.rar

تم تعديل بواسطه أبو هاجر المصري
رابط هذا التعليق
شارك

السلام عليكم

اخي ابو هاجر

مشكور على مجهودك الكبير

لي ملاحظة على هذا الجزء قد يفهم بشكل خاطي .

- السطر الثالث والأخير == يقوم بتحديد شكل الخط إلى أسود من خلال خاصية الخط Font Object وتطبيقها على نطاقين من الخلايا في ورقة العمل النشطة ، والنطاقان هما (B1:C1 ، E1:F1 ) ، ومسموح لك فقط بإرجاع نطاقان اثنين فقط كحد أقصى ، وإضافة نطاق ثالث إلى القوسين يرجع القيمة الخطأ run-time error .

للتوضيح ال RANGE

(B1:C1 ، E1:F1 )

عبارة عن المدى من الخلابا B1:C1 الى مدى من الخلايا E1:F1 فهو الى وليس و

يعن نقدر نقول Range(Start,End) eg وال End اختياري

فالموضوع ليس يقبل اثنين او ثلاثة ولكنه من الى فقط

فلو وضعت(" Range("A1","Z1 فمعناه من A الى Z وليس AوZ

لكن لو كتبت(" Range("A1,Z1 فمعناه A وZ

وبهذا ممكن تكتب( "Range("A1,B2,C3:C10,D8,AB5,F3:G8

يعني مدى متقطع

ارجو اكون وفقت اوصل معلومة

تحياتي

هو كلامك مظبوط بس هو كان المقصود ان اي نطاق بين علامتين تنصيص اكثر من مرتين غير مقبول وجرب انت بنفسك

** يعني تحدد أكثر من خلية بالنطاق كالتالي :

Range("A13,A18,D14:D18,E21,F14,F9,C11:F11").Select

يمشي تمام اخترت اكثر من خلية ونطاقة من الخلايا ضمن التحديد

** وكمان ينفع كده :

Range("A1:E9").Select

طبعا ده عادي نطاق عبارة عن من الى

** لكن اللي كان مقصود التالي :

Range("G20", "G19").Select اختيار مفيهوش مشاكل

Range("G20", "G19", "F8").Select هو دة اللي كان القصد انه ميصلحش لانه محدد 3 نطاقات بين 3 اقواس مضاعفة

ارجو ان يكون التوضيح وصل ، ولو فيه اي غلط ياريت توضحه لينا

تم تعديل بواسطه أبو هاجر المصري
  • Like 1
رابط هذا التعليق
شارك

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

زائر
اضف رد علي هذا الموضوع....

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

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

×   Your previous content has been restored.   Clear editor

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

  • تصفح هذا الموضوع مؤخراً   0 اعضاء متواجدين الان

    • لايوجد اعضاء مسجلون يتصفحون هذه الصفحه
×
×
  • اضف...

Important Information