اذهب الي المحتوي
أوفيسنا

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

قام بنشر (معدل)

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

فى هذا الموضوع سأحاول قدر الامكان الرد على بعض استفسارات الاخوة الموجوده بالمنتدى

عن استخدام وشرح بعض اوامر الفجوال بيسك للتطبيقات او شرح بعض التراكيب اللغوية ل ( VBA )

التى يتسأل عنها الاخوة فى بعض الموضوعات

ولكن لن يكون هنا مجال لشرح برامج او اكواد سابقة لبعض الاخوة فمن الافضل والاكفء

ان يقوم صاحب الكود بشرحة

ولن يتم ادراج اى اسئلة فى هذا الموضوع

بل سأقوم بإلتقاط اسئلة الاخوة من المنتدى التى استطيع الرد عليها و تتناسب مع قدراتى

من الموضوعات التى يكون السطر الاول من عنوانها بالنص التالى ( سؤال فى VBA )

حتى يسهل الوصول اليها مع اتاحة الفرصة للجميع بالرد عليها

ولتتعلم ال VBA اخى العزيز يجب عليك اولا اجادة التعامل مع الصيغ والمعادلات داخل جداول الاكسيل

والا كيف ستتعامل مع ال VBA بدون اجادة استخدام الجداول

فإستخدام ال VBA مرتبط ارتباط وثيق بصيغ ومعادلات الجدول

ويجب عليك ايضا قبل توجية سؤال الفجوال بيسك ان يكون لديك الحد الادنى من المعرفة ب VBA وهذه المعرفة

عبارة عن معرفة كيفية التعامل مع محرر البيسك

وايضا معرفة انواع المتغيرات وكيفية التعامل معها

فلن استطيع او غيرى من الاخوة شرح الفجوال بيسك من البداية حتى النهاية

فيجب عليك بذل الجهد فى البحث عن المعرفة من هنا وهناك مع الاستعانه بالكتب المتاحة

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

ومرة اخرى اذكرك اخى انه لن يتم ادراج اى اسئله فى هذا الموضوع للبعد عن المعوقات

بل ضع سؤالك فى موضوع مستقل يكون السطر الاول من عنوانه هو ( سؤال فى VBA )

حتى يتاح للجميع المشاركة بالرد عليك ولا توجه السؤال الى اسمى الشخصى

وسأقوم بالرد هنا على المشاركات التى استطيع الرد عليها

فلم ادرس الفجوال بيسك سابقا ولكنه اجتهاد شخصى فى التعلم والاستفادة وافادة الاخوة فيما انعم الله علينا

والله المستعان

تم تعديل بواسطه أبو تامر
قام بنشر (معدل)
بسم الله الرحمن الرحيم

والصلاة والسلام على اشرف المرسلين نبينا محمد صلى الله عليه وسلم



المدى و تعريفه : كيف نعرف المدى Range او النطاق

بسؤال استفتاحى من اخونا ابو اسامة العينبوسي

ابدا بالسؤال عن المدى (Range) ؟
هل اذا سميت مدى في و رقة العمل احتاج الى تعرفه او تسميته مره اخرى في محرر البيسك كى استخدمه في الكود
ام استطيع كتابة اسمه مباشرة ؟
:fff:


وهذا رابط سؤال اخونا ابو اسامة العينبوسي لمن اراد الاستفسار عن بعض النقاط او التعليق

على هذه المشاركة التى تخص الموضوع المشار اليه ::

المدى و تعريفه : كيف نعرف المدى Range او النطاق

هذا الشراح الهدف منه ابتغاء مرضاة وجه الله سبحانه وتعالى ودعوة صالحة

اعتقد والله اعلم انه اذا تم تسمية مدى او نطاق فى ورقة العمل

يمكن التعامل معه مباشرة فى الاكواد بدون الحاجة الى اعادة تسميتة مرة ثانية

و المدى او التطاق عبارة عن خلية واحدة او عدة خلايا متجاورة او متفرقة

فيمكن ان يكون خلية واحدة

او عمود او صف او جزء منهما

او مجموعه من الصفوف والاعمدة كأى جدوال بيانات

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

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

ويشترط فى اسم المدى او النطاق ان لا يكون احد الاسماء المحجوزة والخاصة بالاكسيل كمراجع الخلايا

فلا يمكنك تسمية مدى بالاسم ( A1 )


المثال رقم 1 :

لا تنسى تسمية المدى A1: A10 من داخل الجدول بأسم MyRng_1 لإستخدامه فى هذا المثال

وللأشارة الى المدى واختيارة نستخدم الامر Range مع اسم المدى بين علامتى تنصيص

متبوعا بالامر Select لأختياره

ويجب وضع اسم المدى بين علامتى التنصيص على الصورة التالية :

Sub Ex_1()
Range("MyRng_1").Select
End Sub
المثال رقم 2 : اما اذا تم وضع اسم المدى فى متغير نصى يمكنك هنا التجاوز عن علامتى التنصيص واستخدام اسم المتغير النصى بدلا من اسم المدى على الصورة التالية :
Sub Ex_2()
TestMe = "MyRng_1"        
Range(TestMe).Select        
End Sub
المثال رقم 3 : لا تنسى تسمية المدى C1: C10 بأسم MyRng_2 والمدى E1: E10 بأسم MyRng_3 ويمكن الجمع بين عدة امدية او نطاقات فى مدى واحد والتعامل معهم كأنهم مدى او نطاق واحد فأذا كان هناك ثلاثة امدية مسماه فى الجدول كالاتى : MyRng_3 MyRng_2 MyRng_1 يمكنك التعامل معهم دفعه واحدة كأنهم مدى واحد بوضع اسمائهم فى جملة Range وتفصل بينهم بالفاصلة كالمثال التالى :
Sub Ex_3()
Range("MyRng_1,MyRng_2,MyRng_3").Select
End Sub
المثال رقم 4 : ويمكن ايضا كما فى المثال الثانى وضع عدة نطاقات فى متغير نصى واحد والتعامل مع المتغير النصى الذى يشير اليهم كالاتى :
Sub Ex_4()
TestMe = "MyRng_1,MyRng_2,MyRng_3"
Range(TestMe).Select
End Sub
المثال رقم 5 : ولسهولة التعامل مع الامدية او النطاقات فى الاكواد واختصارها : يفضل الاعلان عن المدى المراد التعامل معه بأستخدام جملة
Dim anyname As Range
هنا تم الاعلان عن الاسم anyname كمدى او نطاق داخل الكود ثم نخصص له المدى المراد التعامل معه بجملة Set بأستخدام المراجع :
Set anyname = Range("G1:G10")
او بأستخدام اسماء الامدية او النطاقات :
Set anyname = Range("MyRng_4")
وهنا يمكنك الاستغناء عن الامر Range عند التعامل مع هذا المدى واستخدام الاسم المباشر له كمدى anyname ويكون المثال رقم 5 على ذلك كالاتى : السطر الاول هو الاعلان عن بدأ الروتين او الماكرو ذو الاسم Ex_5 السطر الثانى هو الاعلان عن الاسم anyname كمدى السطر الثالث تخصيص المدى لهذا الاسم بأستخدام المراجع او السطر الرابع تخصيص المدى لهذا الاسم بأستخدام اسماء الامدية او النطاقات السطر الخامس هو التعامل مع المدى بأستخدم الاسم النائب عنه anyname واختيار المدى السطر السادس هو انهاء الروتين
Sub Ex_5()
Dim anyname As Range
Set anyname = Range("G1:G10")
'Set anyname = Range("MyRng_4")
anyname.Select
End Sub
ويجدر ملاحظة الاتى : اولا : عند الاشارة الى المدى بأستخدام هذا الاسلوب لا نستخدم الامر Range الذى عادة يسبق اى مدى بل نستخدم الاسم النائب عن المدى مباشرة وهو anyname لانه تم تعريفة كمدى فى جملة Dim anyname As Range وهو اسهل فى التعامل مباشرة ثانيا : الاسم النائب anyname غير معتمد داخل الجدول اى لا يمكن ان تتعامل مع كأسم مدى لانه خاص بالكود فقط المثال رقم 6 : واحب ان اشير الى شئ هام وهو : يمكن من خلال الكود تسمية اى مدى او نطاق بأسم كما نفعل داخل الجداول ويعتمد التعامل معه فى الجدول وتتم تسمية المدى من خلال الكود بعدة طرق : الطريقة التى يستخدمها معظم المبرمجين بأستخدام الجمله RefersTo كالمثال التالى :
Sub Ex_6()
ActiveSheet.Names.Add Name:="MyRng_5", RefersTo:="=$J$1:$J$10"
Range("MyRng_5").Select
End Sub
ولا احبذ استخدام هذه الطريقة المطولة التى قد تسبب بعض الخلط بعدم اجادة استخدامها بين المدى العام والمحلى المثال رقم 7 : افضل الطريقة السهلة المبسطة التى تجنبنا الخلط بين نوعى الامدية Global Range / Local Range وليس الان مجال التعرض لشرح التفرقة بينهما وتتم التسمية بأستخدام جملة مكونه من ثلاثة اوامر وهى الامر الاول : اسم الورقة التى ستحتوى على المدى متبوعا بنقطة للفصل بين الامر التالى الامر الثانى : تحديد المدى المراد تسميتة بأستخدام الامر Range متبوعا بنقطة الامر الثالث : هو الامر Name متبوعا بعلامة التساوى ثم اسم المدى بين علامتى التنصيص وهو يختص بتحديد اسم المدى كالمثال التالى :
Sub Ex_7()
Sheets("ورقة1").Range("K1:K10").Name = "MyRng_7"
Range("MyRng_7").Select
End Sub
المثال رقم 8 : وتوجد طريقة اخرى وهى ان اختار اى مدى ثم اطلاق اى اسم على المدى المختار بأستخدام الامر Selection.Name متبوعا بعلامة التساوى واسم المدى بين علامتى التنصيص
Sub Ex_8()
Selection.Name = "MyRng_8"
End Sub
المثال رقم 9 : اما اذا اردنا الغاء او ازالة اسم مدى مسمى سابقا عن طريق الاكواد فما اسهل الهدم
Sub Ex_9()
Range("MyRng_7").Name.Delete
End Sub



والى لقاء قريب بإذن الله

تم تعديل بواسطه أبو تامر
قام بنشر

بسم الله الرحمن الرحيم
والصلاة والسلام على اشرف المرسلين نبينا محمد صلى الله عليه وسلم



الحلقات التكرارية For...Next


بسؤال من اخونا justice

يا ريت لو تشرلحنا For...next
و الجوانب المتعلقة بها و طرق استخدامها


وهذا رابط سؤال اخونا justice لمن اراد الاستفسار عن بعض النقاط او التعليق على هذه المشاركة التى تخص الموضوع المشار اليه

شرح For...Next و الجوانب المتعلقة بها و طرق استخدامها


التعبير For...Next

هو يقوم بتكرار تنفيذ مجموعة من الاوامر او الاجراءات عدة مرات محددة العدد

ونحتاج الية دائما بدلا من تكرار كتابة مجموعة اوامر مثلا 100 مرة تقوم For...Next بنتفيذة 100 مرة

ولكن مجموعة اسطر الاوامر ستكتب مرة واحدة فهى تختصر الجهد والوقت

و التعبير For...Next له عدة مسميات منها :

الحلقة الدوارة او الحلقات الدوارة

وايضا يسمى ب الحلقة او الدورة

وايضا تسمى ب الحلقات التكرارية

على اساس ان التعبير For...Next

يؤدى الى تكرار تنفيذ مجموعة من الاوامر او الاجراءات

التى تكون بين شقيى For...Next بعدد محدد من مرات التنفيذ

ولذلك تسمى بالحلقة او الدوره او التكرارية


والتعبير او الحلقة For...Next

يستقبل اربعة متغيرات

الاول :: العداد :: وهو متغبر عددى الذى يتحكم فى عدد دورات او مرات التكرار ل For...Next

وهو الزامى الوجود لتعمل الحلقة


الثانى :: قيمة بداية العداد :: التى بيدأ منها العداد بالعد - وهو الزامى الوجود لتعمل الحلقة

الثالث :: قيمة نهاية العداد :: التى ينتهى بها العداد وينم الخروج من الحلقة التكرارية

وهو الزامى الوجود لتعمل الحلقة


الرابع :: الخطوة :: وهى القيمة التى يزداد او ينقص بها العداد وهى اختيارية اذا كانت قيمتها +1

والصورة المبسطة منها كما نرى :

    For x = 1 To 3
مجموعة اسطر من الاوامر
    Next x
لنضع انفسنا مكان جهاز الكبيوتر لنرى كيف تعمل عندما يبدأ بقراءة هذا الكود الدورة الاولى :: السطر الاول :: وهو
For x = 1 To 3
قراء الكبيوتر السطر الاول ووجد انه صدرت له الاوامر التالية ابدأ حلقة تكرارية بالعداد ( x ) الذى قيمة بدايته تساوى ( 1 ) وقيمة نهايتة تساوى ( 3 ) هذه اول دورة تكرارية ستكون قيمة العداد ( x ) تساوى ( 1 ) بمعنى اخر صدرت له الاوامر بعمل حلقة تكرارية لثلاث مرات تبدأ ب 1 وتنهى ب 3 لتنفبذ مجموعة الاوامر التى تقع بين For و Next وفى نهاية هذا السطر الاول من المفروض ان يكون هناك معامل اخر وهو الخطوة ( Step 1 ) ولكن يسمح لنا بتجاهلة طالما قيمة هذه الخطوة تساوى ( 1 ) السطر الثانى :: نفذ مجموعة الاوامر التى من الممكن ان تكون اكثر من سطر السطر الثالث :: ( Next x ) عنما يصل الى نكست يزيد قيمة العداد بقيمة الخطوة ( 1 ) اى ان قيمة العداد ( x ) ستكون مساوية ل ( 2 ) استعدادا للدورة الثانية هنا انتهت الدورة الاولى وكانت قيمة العداد = ( 1 ) وسيبدأ الدورة الثانية وستكون قيمة العداد = ( 2 ) الدورة الثانية :: سيعيد تنفيذ السطر الثانى ولكن ستكون قيمة ( x ) تساوى 2 الدورة الثالثة :: سيعيد تنفيذ السطر الثانى ولكن ستكون قيمة ( x ) تساوى 3 وفى هذه الدور الثالثة عندما ينتهى من نتفيذ السطر الثانى ( مجموعة الاوامر ) ثم ينتقل السطر الثالث ( Next ) لزيادة قيمة العداد بقيمة الخطوة ليصبح العداد ( x ) مساويا ل ( 4 ) تقول له ( Next ) لا حبيبى غير مسموح للعداد بالزيادة لان قيمة نهاية العداد هى ( 3 ) وانت تعرف ذلك من بداية الدورة الاولى اخرج من حلقتى وتنهى الحلقة تبعا لذلك المثال_1 ::
Sub Ex_1()
For x = 1 To 3
    Range("F" & x) = x
Next x
End Sub
لنرى هذا المثال معا وهو على نمط مثال الشرح الاولى السابق مع اضافة سطر اوامر لتنفيذة الدورة الاولى :: السطر الاول :: وهو
For x = 1 To 3
العداد هو المتغير العددى x وقيمة البداية له = 1 وقيمة النهاية له = 3 اذن قيمة العداد x تساوى 1 السطر الثانى :: وهو سطر الاوامر
Range("F" & x) = x
اكتب فى الخلية F1 القيمة x التى تساوى 1 فى الدورة الاولى السطر الثالث :: وهو
Next x
ولها وظيفة واحدة فقط وهى زيادة او انقاص العداد بقيمة الخطوة وهى هنا زيادة العداد ب 1 اى تصبح x = 2 الدورة الثانية :: قيمة العداد x تساوى 2 السطر الثانى :: وهو سطر الاوامر
Range("F" & x) = x
اكتب فى الخلية F2 القيمة x التى تساوى 2 فى الدورة الثانية السطر الثالث :: وهو
Next x
يقوم بزيادة العداد x من 2 إلى 3 الدورة الثالثة :: قيمة العداد x تساوى 3 السطر الثانى :: وهو سطر الاوامر
Range("F" & x) = x
اكتب فى الخلية F3 القيمة x التى تساوى 3 فى الدورة الثالثة السطر الثالث :: وهو
Next x
نكست تجد العداد اتى اليها للزيادة مرة اخرى ماهى سيابه بقى فتذكره ايها العداد x الم ترى فى السطر الاول من الحلقة انك تنتهى عندما تكون = 3 أخرج من هذه الحلقة التكرارية وتنهى بذلك هذه الدورة التكرارية التى تم تكرارها ثلاثة مرات المثال_2 :: اذا اردنا ان نكتب فى العمود G بدأ من الصف الاول نزولا الى اسفل الارقام الفردية من 1 إلى 100 ماذا ستكون بداية العداد ونهايته وخطوته اذن ستكون بداية العداد =1 لان ال 1 عدد فردى الخطوة او مقدار الزيادة التى يزداد بها العداد لنحصل على العدد الفردى التالى ل 1 يجب ان تكون 2 ليكون العدد الفردى التالى هو 3 ونهاية العداد ستكون = 99 لان ال 99 عدد فردى وايضا يمكن ان تكون نهاية العداد = 100 لان التحكم هنا سيكون ل Next لماذا لان Next عندما يأتى اليها العداد وقيمتة 99 للزيادة الى 101 لن تسمح له Next بذلك لان قيمة نهاية العداد هى 100 ولكن يجب ان نلاحظ انه اذا استخدمنا قيمة العداد لتحديد رقم الصف الذى سنضع فية الارقام سنجد انه تبعا لقيم العداد سيكتب على السطور الفردية وهى 1...3...5...7...9...11 الخ لانها قيم العداد اذن نحن محتاجين الى احد القرود التى تستطيع العد من 1 إلى 100 ليجلس داخل الحلقة For...Next ليحدد لها الصف الذى تكتب فيه لنرى هذا المثال_2 ::
Sub Ex_2()
MyRow = 0
For x = 1 To 100 Step 2
    MyRow = MyRow + 1
    Range("G" & MyRow) = x
Next
End Sub
الدورة الاولى :: السطر الاول ::
MyRow = 0
هذا هو القرد MyRow الذى سيحدد لنا رقم الصف الذى نكتب عليه وهو خارج الحلقة وقيمتة تساوى صفر الان ولم يصحو من نومه بعد السطر الثانى ::
For x = 1 To 100 Step 2
تحدثنا عنه وهو يحدد بداية العداد ب 1 ونهاية العداد ب 100 ومقدار الخطوة او الزيادة = +2 يعنى قيمة x = 1 السطر الثالث ::
MyRow = MyRow + 1
ونحن الان فى الدورة الاولى من الحلقة ينشط قردنا عداد الصفوف و ستكون قيمة هذا القرد تساوى 1 السطر الرابع ::
Range("G" & MyRow) = x
هذا السطر بيقول اكتب فى العمود G فى صف القرد MyRow الذى قيمتة 1 اكتب x التى قيمتها 1 السطر الخامس :: سنزيد Next العداد وهو = 1 بقيمة الخطوة التى = 2 ليصبح العداد = 3 استعدادا للدورة الثانية x = 3 الدورة الثانية :: السطر الثالث ::
MyRow = MyRow + 1
ونحن الان فى الدورة الثانية من الحلقة ستصبح قيمة القرد عداد الصفوف 2 السطر الرابع ::
Range("G" & MyRow) = x
هذا السطر بيقول اكتب فى العمود G فى صف القرد MyRow الذى قيمتة 2 اكتب x التى قيمتها اصبحت 3 و زى ما اتفقنا ان قيمة زيادة العداد ستكون 2 ويتكرر حدث الدورة الى ان يتم طرد قرد الصفوف من الحلقة الدوارة عندما تجد Next ان العداد x سيتجاوز حدود قيمة نهاية العداد وهى 100 المثال_3 :: لنتقدم خطوة الى الامام نود فيها ان نكتب فى العمود H الاعداد الزوجية بدأ من الصف الاول نزولا الى اسفل ولكن بشرط ان تكون ارقام تنازلية اى 100...98...96...94...92 وليس تصاعدية 2...4...6...8...10 لنرى هذا المثال_3 ::
Sub Ex_3()
MyRow = 0
For x = 100 To 2 Step -2
    MyRow = MyRow + 1
    Range("H" & MyRow) = x
Next
End Sub
نرى فى هذا المثال ان القرد كما هو لانه هو منظم المرور الذى يحدد ارقام الصفوف المستخدمة سطر بداية الحلقة وهو
 For x = 100 To 2 Step -2
نرى ان العداد قيمتة الابتدائية = 100 وقيمتة النهائية = 2 ونلاحظ ان الخطوة او مقدار الزيادة او النقص ( Step -2 ) فى العداد ستكون سالب 2 اى -2 طبعا لاننا نود ان تبدأ الحلقة بكتابة الرقم 100 ثم 98 ثم 96 وهكذا وسيتم التنفيذ بنفس اسلوب المثال الثانى وبنفس قيم ارقام صفوف القرد العداد ولكن بلإختلاف قيمة العداد x بقيمة الزوجية لنلقى نظرة على المثال الثانى والثالث من حيث الخطوة Step سنجدها فى المثال الثانى موجبة وفى الثالث سالبة ماذا نلاحظ :: عندما تكون الخطوة Step موجبة تكون بدية العداد اصغر من نهاية العداد اما عندما تكون الخطوة Step سالية تكون بدية العداد اكبر من نهاية العداد لاتقصر فائدة الحلقات التكرارية على هذا التنفيذ البسيط ولكنها تعمل اشياء على درجة من الاهمية ويمكن ان تكون هناك حلقات تكرارية متداخلة بمعنى ان يمكن ان يكون هناك حلقتان متداخلتين معا او اكثر المثال_4 :: اذا اردنا ان نكتب الاعداد من 1 إلى 100 فى عشرة صفوف وعشرة اعمدة متتالين بدأ من الخلية الاولى فى الصف الاول اى نكتب فى الصف الاول 1 إلى 10 وفى الصف الثانى 11 إلى 20 وفى الصف الثالث 21 إلى 30 هكذا حتى 100 هنا يجب عمل حلقتان تكراريتين الحلقة الاولى :: او الخارجية ستقوم بوظيفة تحديد الصف الذى سنكتب فية وهى هنا حلقة للتحكم فى رقم الصف اى تنظيمية وستقوم بتكرار الحلقة الثانية او الحلقة الداخلية او الحلقة الفعلية التى ستكتب الارقام داخل الصف الذى حددته الحلقة الخارجية عشرة مرات بأرقام متتالية الحلقة الثانية ستقوم بتحديد رقم العمود وتقوم بالكتابة فية تبعا للصف الذى حددتة الحلقة الخارجية سابقا ماذا ينقصنا هنا فعلا ينقصنا قرد ولكن لن يكون له شأن برقم الصف او حتى برقم العمود الذى ينقصنا هنا قرد رقمى لا يعرف سوف الاعداد من 1 إلى 100 حتى يقول لنا القرد اى رقم سنكتب لنرى مثالنا
Sub Ex_4()
Number = 0
For MyRow = 1 To 10
    For MyCol = 1 To 10
        Number = Number + 1
        Cells(MyRow, MyCol) = Number
    Next MyCol
Next MyRow
End Sub
الدورة الاولى للحلقة الخارجية :: السطر الاول :: هذا هو القرد الرقمى
Number = 0
وهو لا يعرف سوى ان يعد من 1 إلى 100 ولكن نرى ان قيمتة هنا صفر نعم لانه لن يبدأ بتحديد الرقم المراد كتابتة هنا بل وهو داخل الحلقة التكرارية الثانية وقبل كتابة تزاد قيمتة الى 1 السطر الثانى :: هو
For MyRow = 1 To 10
وقد اشرنا ان الحلقة الاولى او الخارجية لتنظيم ارقام الصفوف ولذلك سمينا عدادها ب MyRow الذى يبدأ ب 1 وينتهى ب 10 وهى ارقام الصفوف التى سوف نستخدمها ولذلك ستكون قيمة MyRow فى الدورة الاولى للحلقة الخارجية = 1 السطر الثالث :: وهو
For MyCol = 1 To 10
وهنا تبدأ الدورة الاولى للحلقة الداخلية من الدورة الاولى للحلقة الخارجية وقد اشرنا ان الحلقة الثانية او الداخلية لتنظيم ارقام الاعمدة والكتابة ولذلك سمينا عدادها ب MyCol الذى يبدأ ب 1 وينتهى ب 10 وهى ارقام الاعمدة التى سوف نستخدمها ولذلك ستكون قيمة MyCol فى الدورة الاولى للحلقة الداخلية للدورة الاولى من الحلقة الخارجية = 1 السطر الرابع :: هنا القرد الرقمى يبدأ فى النشاط ويجهز نفسة بأول رقم سيكتب وهو 1
Number = Number + 1
السطر الخامس :: وهو
Cells(MyRow, MyCol) = Number
يكتب فى الخلية التى صفها MyRow وهو = 1 وعمودها MyCol وهو = 1 يكتب فيها القرد الرقمى وهو = 1 السطر السادس :: وهو
 Next MyCol
وهو يختص بزيادة قيمة MyCol الى 2 يعنى حدد لنا مكان الكتابة التالى بالعمود 2 على الصف الاول الخاص بالحلقة الخارجية لاننا سنتهى اولا من العشر دورات الخاصة ب الحلقة الداخلية لكتابة الارقام من 1 إلى 10 فى الصف الاول قبل ان نتقل الى Next MyRow لتغير رقم الصف استعدادا للدورة الثانية للحلقة الخارجية اذن بعد زيادة قيمة MyCol الى 2 بواسطة Next MyCol سيذهب الى السطر الرابع ليسئل القرد الرقى Number = Number + 1 اى رقم سنكتب بعد ذلك فبقول 2 ثم يذهب الى السطر الخامس وهو Cells(MyRow, MyCol) = Number مازلنا فى الحلقة الداخلية وقيمة الصف MyRow تساوى 1 لاننا لم ننهى من تنفيذ العشر دورات الخاصة بالحلقة الداخلية ولكن رقم العمود MyCol اصبح = 2 اى سيكتب فى الخلية التى رقم صفها 1 ورقم عمودها 2 سيكتب القرد الرقمى اى 2 وهكذا يستمر قى الكتابة على الصف الاول الى ان تنتهى العشر دورات الخاصة بالحلقة الداخلية وبذلك يكون كتب قى الصف الاول الارقام من 1 الى 10 وبإنتهاء العشر دورات للحلقة الداخلية يخرج منها ليصل الى السطر الثامن الخاص بالحلقة الخارجية السطر الثامن :: وهو Next MyRow لتصبح قيمة MyRow اى رقم الصف = 2 لنبدأ الدورة الثانية من الحلقة الخارجية برقم صف = 2 ويذهب الى السطر الثالث وهو For MyCol = 1 To 10 ليبدأ عشرة دورات للحلقة الداخلية من جديد وبرقم عمود 1 ورقم صف معنا من قبل ذلك وهو 2 ثم يأتى سطر الرابع سطر القرد الرقمى Number = Number + 1 ونسئلة اى رقم سنكتب فيقول 11 انا صاحى لك ثم يأتى السطر الخامس Cells(MyRow, MyCol) = Number فيقول اكتب القرد الرقمى الذى = 11 فى الخلية التى صفها = 2 وعمودها = 1 حتى تنتهى الحلقة الداخلية من دوراتها العشر الخاصة بالدورة الثانية من الحلقة الخارجبة وبذلك تكون كتبت فى الصف الثانى الارقام من 11 إلى 20 وهلم جر الى ان تنتهى الدورة الخارجية من دوراتها العشر وتكون الحلقة الداخلية قد اكملت دوراتها المائة نعم الحلقة الداخلية تؤدى 100 دورة لماذا لان الحلقة الخارجية تنفذ 10 مرات وفى كل مرة تنفذ الحلقة الداخلية 10 مرات اذن الداخلية تنفذ عشر عشرات اى 100 دورة المثال_5 :: فى كثير من الاحيان نستخدم الحلقة الدوارة فى فحص البيانات او التأكد من حدوث شئ معين ونود الخروج منها قبل ان تكمل دورتها المحددة بنهاية العداد فى هذه الحاله نستخدم الجملة الشرطية : If...Then... فاذا تحقق الشرط نخرج من الحلقة ب Exit For نعود الى المثال_1 الذى يكتب فى العمود F بدأ من الصف الاول الارقام من 1 إلى 3 ونضيف له جملة شرطية تقول بعد ما تكتب الرقم 2 اخرج من الدورة ولا تكمل باقى الدورات
Sub Ex_5()
For x = 1 To 3
    Range("F" & x) = x
    If x = 2 Then Exit For
Next
End Sub
نرى فى السطر الاول ان العداد يبدأ ب 1 وينتهى ب 3 والسطر الثانى يكتب قيمة العداد فى الخلية F1 والعداد = 1 فى الدورة الاولى السطر الثالث يختبر العداد هل هو = 2 يقول له لا السطر الثانى قى الدورة الثانية يكتب قيمة العداد فى الخلية F2 والعداد = 2 فى الدورة الثانية السطر الثالث فى الدورة الثانية يختبر العداد هل هو = 2 يقول له نعم فيقول اذن اخرج من الدورة Then Exit For نجد هنا ان الدورات الثلاثة لم تكتمل بسب السطر الشرطى الذى يجبر الحلقة على الخروج بعد ان بصل العداد الى الرقم 2 وتتم كتابتة فى بعض الاحيان نود عمل حلقة تكرارية لتكرار تنفيذ بعض الاشياء ولا يهمنا ان نعرف عددها او بدايتها ونهايتها او لا نحتاج الى قيمة الخطوة فكل ما يهمنا هو تنفيذ بعض من الاوامر على مجموعة اهداف او نقوم بالبحث عن شئ محدد فى مجموعة من الاهداف فى هذه الحالة نستخدم حالة خاصة من For...Next الا وهى For Each...Next وهى لا تختلف كثيرا عن الاولى ولكن يتم تجاهل العداد وتوابعه ( البداية - النهاية - الخطوة ) تحل محلها حلقة تكررارية على كل عناصر الهدف المثال_6 :: لنفرض انه فى العمود F فى المدى F1:F10 مكتوب الارقام من 1 إلى 10 ونود استبدال محتويات الخلية التى تحتوى على الرقم 5 بكلمة Officena
Sub Ex_6()
Dim Cel As Range
For Each Cel In Range("F1:F10")
    If Cel = 5 Then Cel = "Officena"
Next
End Sub
لا تنسى كتابة الارقام من 1 إلى 10 فى المدى F1:F10 لتتم تجربة المثال السطر الاول :: وهو
Dim Cel As Range
تم الاعلان عن المتغير Cel كمدى الذى ستتم علية عملية الاختبار وهذا المدى سيكون عبارة عن خلية واحدة من خلايا المدى فى كل دورة لإختبارها ففى كل دورة سيكون هذا المتغير يمثل خلية واحدة من المدة المشار اليه السطر الثانى :: وهو
For Each Cel In Range("F1:F10")
هنا تم الاستغناء عن العداد وتوابعه وهذا يعنى ان الدورات ستكون بعدد خلايا المدى المشار اليه
Range("F1:F10")
اى اعمل دورة لكل خليه فى المدى المشار اليه السطر الثالث :: وهو
If Cel = 5 Then Cel = "Officena"
هذا سطر الشرط او الاختبار ويقوم بإختبار الخلية التى عليها الدور اذا كانت = 5 يقوم بتغير قيمتها الى Officena اذا لم يتحقق الشرط يذهب الى السطر الرابع السطر الرابع :: وهو
Next
اى انتقل الى الخلية التالية فى المدى المشار اليه سابقا ليتم التنفيذ عليها وهكذا الى ان تنتهى الدورة فإذا وجد اى خلية = 5 يتم استبدال محتويتها الى Officena الى ان تنهى كل الدورات فالحلقة التكرارية For...Next من اقوى الحلقات الدوارة الاخرى واذا استعطت اجادتها وتطويعها يمكنك الاستغناء نهائيا عن الحلقتان الاخرتين وهما
Do...Loop    واخوتها
While...Wend


والحلقة Do...Loop اقوى من الحلقة While...Wend

والى لقاء قريب بإذن الله بصالح دعائكم



  • Like 1
قام بنشر (معدل)

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

والصلاة والسلام على اشرف المرسلين نبينا محمد صلى الله عليه وسلم



التحكم فى مجموعة من صناديق النصوص TextBox


بسؤال من اخونا ابو اسامة العينبوسي

لو كان لدى نموذج و به مجموعه من ال textbox مثلا 10
هل من الممكن اسناد اسم التكست بوكس الى متغير مثلا
for i = 1 to 10
textbox&i.value = ""

وهذا رابط سؤال اخونا ابو اسامة العينبوسي لمن اراد الاستفسار عن بعض النقاط

او التعليق على هذه المشاركة التى تخص الموضوع المشار اليه

التحكم فى مجموعة من صناديق النصوص TextBox

فى رد سريع الى اخونا ابو اسامة العينبوسي بعيدا عن تسلسل مواد الشرح فى هذا الموضوع

الهدف من السؤال هو تعبئة مجموعة من صناديق النصوص جملة واحدة و بالخصوص عندما تكون ذات عدد كبير نسبيا

يمكن استخدام الخاصية :: Tag

من نافذة خصائص ال TextBox الخاصة بكل TextBox

يمكن تحديد خلية تعبئة ال Tag لكل TextBox على حدى

وللأسف هى قيمة ثابتة

ولكن يمكن التحايل على ذلك بالأتى :

يمكن تعيئة مجموعة من صناديق النصوص بقيم معينة بإستخدام حلقة تكرارية

ولكن قبل ذلك يجب تعبئة كل تاج فى نافذه الخصائص بقيمة ابتدائبة لتعمل الحلقة ولتكن هذه القيمة

عنوان اول خلية لسجل البيانات لصندوق النص المناظر لها من جدول البيانات

لنرى هذا الكود

Private Sub UserForm_Activate()
Dim Ctrl As Control
MyRow = 4
MyCol = 2
For Each Ctrl In UserForm1.Controls
    If Ctrl.Tag <> "" Then
        Ctrl.Text = Cells(MyRow, MyCol)
        MyCol = MyCol + 1
    End If
Next Ctrl
End Sub



يقوم هذا الكود بتعبئة صناديق النصوص ببيانات اول سجل فى الجدول

ويأستخدام هذا الاسلوب يمكن ان يكون الكود مختصرا وفى نفس الوقت اكثر مرونة

سواء فى قراءة البيانات من الجدول او كتابة البيانات الى الجدول

وللأسف لم ارى هذا الاسلوب يستخدم فى المنتديات العربية

رغم انه يختصر حجم الاكواد واكثر مرونة

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

حتى لانخرج عن التسلسل الطبيعى لموضوعنا هذا

يوجد مثال بالمرفقات

والى لقاء قريب بإذن الله

TextBox0.rar

تم تعديل بواسطه أبو تامر
قام بنشر (معدل)

استكمالا للسؤال السابق :

التحكم فى مجموعة من صناديق النصوص TextBox

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

وكان لتوضيح طريقة استخدام الصفة :: Tag

اما المثال التالى فهو يبين لنا امكانية التحكم فى مجموعة من TextBox وايضا التحكم فى مجموعة من Label

فى بناء قاعدة بيانات موظفين مصغرة وكيفية الاضافة والحذف اليها

وايضا امكانية التعديل على سجلاتها او استعراضها

وايضا عند تعديل رؤوس عناوين اعمدة جدوال البيانات يتم تعديل الفورم بها اتوماتيكيا

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

والى لقاء قريب بإذن الله

المثال بالمرفقات

_________________.rar

تم تعديل بواسطه أبو تامر
قام بنشر (معدل)

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

والصلاة والسلام على اشرف المرسلين نبينا محمد صلى الله عليه وسلم



شرح الخاصية Offset



بسؤال من اخونا justice

Offset
و طريقة إستخدامها في الاكسيل و في VBA
و ما يتعلق بها من أمور أخرى

و دمتم بود



وهذا رابط سؤال اخونا justice لمن اراد الاستفسار

عن بعض النقاط او التعليق على هذه المشاركة التى تخص الموضوع المشار اليه


سؤال فى VBA, دالة Offset


توضيح ::

بالنسبة الى لفظى واتجاة ( اليمين واليسار ) اللذان سيتم استخدامهما فى الشرح هنا

هما اتجاهان بالنسبة الى الاوفيس العربى ويكون العمود الاول A جهة اليمين وليس اليسار

اما من يعمل على نسخ غير النسخة العربية سيكون لفظى واتجاة ( اليمين واليسار ) معكوسين بالنسبة له


بعيدا عن خاصية Offset نحكى معا قبل الشرح ::

بفرض انك تجلس فى منزلك ثم احتجت الى بعض الاغراض من سوبر ماركت علاء الدين

فقلت لابنك احمد اذهب الى سوبر ماركت علاء الدين واحضر لنا هذه الاغراض

فقال لك لا اعرف سوبر ماركت علاء الدين

فقلت له هل تعرف منزل صديقى ابو محمد

فقال نعم

فقلت عند منزل صديقى ابو محمد اذهب شارعين الى الامام ثم ثلاثة شوارع الى اليسار

ستجد سوبر ماركت علاء الدين


ماذا فعل ابو احمد ليحدد لأحمد مكان السوبر ماركت لأبنة احمد ::

اولا :: مكان البداية ::

حدد له مكان البداية التى يبدأ منها وهى منزل صديقة ابو محمد

ثانيا :: الاتجاه من مكان البدايه الى مكان السوبر ماركت ::

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

لتصل الى الهدف المراد وهو السوبر ماركت

اذن ماذا فعل ابو احمد ليصف لأحمد كيفية الوصول الى الهدف ::

لقد حدد له مكان البداية ثم حدد له الاتجاه بمعرفة ( الى الامام ) وايضا ( الى اليسار )

اى تم الوصول الى الهدف عن طريق نقطة البداية والانحراف عنها بمعرفة الاتجاهين االرئيسيين وهما

( الى الامام " الى اعلى " او الى الاسفل ) و ( الى اليسار او الى اليمين )


هذا هو ما يفعله التعبير Offset بالتمام

اذن ال Offset نحدد لها مكان البداية ثم نحدد لها قيم الانحراف عن مكان البداية بمعرفة الاتجاهين الرئسيين

لنصل الى الهدف

لنرى هذا التوضيح ليكون اقرب الى الحقيقة بعض الشئ

ماذا يحدث اذا قلت لك اخى العزيز ان تفعل الاتى :

افتح ملف اكسيل ::


اولا ::

ابدأ بالوقف فى الخلية A1


ثانيا ::

اتجه الى اسفل عدد 2 صف


ثالثا ::

اتجه الى اليسار عدد 2 عمود


رابعا ::

اين تقف الان

تعالى معى لنرى ماذا فعلت خطوة خطوة بالترتيب السابق ل 4 خطوات


فى اولا :: مكان البداية او نقطة الانطلاق ::

ستقف فى الخلية A1


وفى ثانيا :: الانحراف او الاتجاه الاول ( وهو عدد من الصفوف ) ::

التى تقول ( اتجه الى اسقل عدد 2 صف )

ستتحرك اولا صف واحد الى اسفل لتصبح فى الخلية A2

وثم تتحرك للمرة الثانية صف واحد ايضا لأسفل لتصبح فى الخلية A3 ( هذا هو اول اتجاه )


وفى ثالثا :: الانحراف الثانى ( و هو عدد من الاعمدة اما جهة اليسار او جهة اليمين ) ::

لا تنسى اننا وصلنا الى الخلية A3 وسننفذ البند الثالث الذى يقول ( اتجه الى اليسار عدد 2 عمود )

اذن سنتحرك الى جهة اليسار عمود واحد لنصبح فى الخلية B3

ثم نتحرك مرة ثانية الى جهة اليسار عمود واحد لنصبح فى الخلية C3


اما فى رابعا : نرى اين نحن ::

فلن نفعل شئ سوى النظر حولنا لنرى اين نحن الان . سنجد اننا نقف فى الخلية C3



هذا ما تقوم به خاصية Offset ::

تعطينا مدى يبعد عن مدى محدد بعدد من الصفوف والاعمدة

اى تستخدم لتشير الى خلية او مدى بالنسبة الى خلية اخرى او مدى اخر

اى ان الخلية او المدى المشار اليه يبعد عن الخلية الاخرى او المدى الاخر بعدد من الصفوف والاعمدة

اى انها تعدل المدى الى مدى اخر بعمل ازاحة عنه بعدد من الصفوف والاعمدة

اى انها تحدد لنا مدى جديد بدلا من المدى الاصلى

اذن نستطيع بأنفسنا بناء صيغة الخاصية Offset لتكون على الشكل التالى ::


Offset(rowOffset:=2, columnOffset:=2)
وهذه الصيغة مقبولة فى الاكسيل اذن تعالى معى لنحول الاربع بنود السابقة الى لغة الفجوال بيسك
Range("A1").Offset(2, 2).Select
اولا :: الامر ::
Range("A1")
هذا هو مكان البداية او الانطلاق هذا هو المكان الذى سيتم التحرك منه للوصل الى الهدف ثانيا :: الامر ::
Offset(2, 2)
هذا هو وصف الطريق الى الهدف انطلاقا من مكان البداية ( A1 ) اى انه الخريطة التى من خلالها سنصل الى الهدف ماذا تقول هذه الخريطة : هى تقول كلمتان سحريتان للوصول الى الهدف هم :: اتجه الى اسقل عدد 2 صف اتجه الى اليسار عدد 2 عمود الكلمة السحرية الاولى :: ( اتجه الى اسفل عدد 2 صف ) :: هى الرقم الاول بعد ( Offset ) فى الامر اذن الرقم الاول بعد ( Offset ) هو عدد الصفوف التى سنعبرها الى اسفل ولكن عند التنقل بين الصفوف يمكن ان تكون حركتنا خلالها اما الى اسفل او الى اعلى اذن كيف نعرف هل سنتحرك الى اسفل ام الى اعلى اذا كان الرقم الاول بعد ( Offset ) موجب تكون الحركة الى اسفل اما اذا كان الرقم الاول بعد ( Offset ) سالب تكون الحركة الى اعلى اذن نقوم بتنفيذ هذا الرقم الاول بعد ( Offset ) وهو موجب 2 بعد ان عرفنا الفرق بين اعلى واسفل سيكون تحركنا هو موجب 2 اى الى اسفل 2 خلية احنا بدأنا من الخلية ( A1 ) ونود النزول الى اسفل 2 خلية اذن الجزء الاول من الامر ( Offset ) هو من نقطة البداية ( A1 ) تحركنا صفين الى اسفل فأصبحنا فى الخلية ( A3 ) الكلمة السحرية الثانية :: ( اتجه الى اليسار عدد 2 عمود ) :: هى الرقم الثانى بعد ( Offset ) فى الامر اذن الرقم الثانى بعد ( Offset ) هو عدد الاعمدة التى سنعبرها الى الى اليسار ولكن عند الانتقال بين الاعمدة يمكن ان تكون حركتنا خلالها اما الى اليسار او الى اليمين اذن كيف نعرف هل سنتحرك الى اليسار او الى اليمين اذا كان الرقم الثانى بعد ( Offset ) موجب تكون الحركة الى اليسار اما اذا كان الرقم الثانى بعد ( Offset ) سالب تكون الحركة الى اليمين اى بعد الحركة الاولى التى اشارت الى الخلية ( A3 ) سنشير الى عمودين جهة اليسار اى نشير الان الى الخلية ( C3 ) اذن هذا الجزء من سطر الاوامر الذى نفذناه وهو
Range("A1").Offset(2, 2)
ماذا يقول بعد ان استوعبنا اتجاهات الحركة الخاصة ب ( Offset ) يقول :: بالانتساب الى الخلية ( A1 ) نحن نشير الى الاتجاه صفين الى اسفل وعمودين الى اليسار يعنى اننا اشرنا الى الموقع الجديد وهو الخلية ( C3 ) يعنى مهمة الصيغة ( Offset ) هى الاشارة الى موقع جديد بالنسبة الى موقع البداية بمعلومية عدد الصفوف و الاعمدة يعنى هى لا تقوم بفعل اى شئ سوى الاشارة الى موقع جديد ثالثا :: الامر ( Select ) :: هو الامر التنفيذى فى سطر الاوامر
Range("A1").Offset(2, 2).Select
هو اخر امر فى الجملة اى هو الفعل الذى سيتم تنفيذة بعد عملية الوصف او الازاحة اى بعد ان تم الاشارة الى موقع جديد وهو الخلية ( C3 ) قم بأختيارة او الوقف فية اذن خلاصة الامر Offset :: بمعلومية خلية البداية يشير الى خلية جديد تبعد عن خلية البداية بعدد من الصفوف والاعمدة فأذا كان عددها الاول موجب كان الاتجاة عدد من الصفوف الى اسقل فأذا كان عددها الاول سالب كان الاتجاة عدد من الصفوف الى اعلى و اذا كان عددها الثانى موجب كان الاتجاة عدد من الاعمدة الى اليسار و اذا كان عددها الثانى سالب كان الاتجاة عدد من الاعمدة الى اليمين :: :: الى من يختلط عليه اتجاة الحركة بين السلب والموجب ولماذا لم يكن العكس الموجب بدلا من السالب والسالب بدلا من الموجب بالنسبة الى اتجاهات الحركة هذا التوضيح عام بمعنى انه ينطبق على نسخ الاكسيل العربية او غير العربية :: تبدأ ارقام الصفوف بالارقام : 1 - 2 - 3 :: سواء فى نسخ الاوفيس العربية والاجنبية اذن اتجاه ترقيم الصفوف هو الموجب دائما فى اى لغة ويبدأ ترقيم الاعمدة :: C - B - A : اذن اتجاه ترقيم الاعمدة هو الموجب دائما فى اى لغة هذا حتى لا يختلط الامر علينا بخصوص اتجاه السالب والموجب :: :: المثال_1 ::
Sub Ex_1()
Range("F5").Offset(1, -2).Select
End Sub
فى سطر الاوامر التالى ::
Range("F5").Offset(1, -2).Select
يشير الى الخلية جديدة بمعلوية الخلية ( F5 ) وتبعد عنها صف واحد الى اسفل وعمودين الى جهة اليمين اى الخلية ( D6 ) ويختارها اى يذهب اليها المثال_2 ::
Sub Ex_2()
Range("G10").Offset(-3, -5) = "Officena"
End Sub
يشير الى لخلية جديدة بمعلوية الخلية ( G10 ) وتبعد عنها ثلاثة صفوف الى اعلى وخمسة اعمدة الى جهة اليمين اى الخلية ( B7 ) ويكتب فيها ( Officena ) المثال_3 :: نتذكر احد الامثلة فى شرح الحلقات التكرارية For...Next وكان كالتالى ::
Sub Ex_3()
For x = 1 To 3
    Range("F" & x) = x
Next x
End Sub
وكان يكتب فى المدى F1:F3 الارقام من 1 إلى 3 سنضيف سطر واحد الى هذا المثال نريد منه انه عندما يكتب فى الخلية F1 يكتب معرفة هذه الخلية كلمة "Officena" فى الخلية G1 وهكذا مع F2 و F3 طبعا بإستخدام دالتنا Offset ستكون المخرجات على الشكل التالى الخلية F1 طبعا ستكون = 1 والخلية G1 ستكون = "Officena" الخلية F2 طبعا ستكون = 2 والخلية G2 ستكون = "Officena" الخلية F3 طبعا ستكون = 3 والخلية G3 ستكون = "Officena" لتحقيق ذلك سنضيف سطر واحد الى المثال السابق قبل Next x وهو ::
Range("F" & x).Offset(0, 1) = "Officena"
ليكون المثال على المنوال التالى ::
Sub Ex_3()
For x = 1 To 3
    Range("F" & x) = x
    Range("F" & x).Offset(0, 1) = "Officena"
Next x
End Sub
فى البداية سيكت الرقم 1 فى الخلية F1 بالسطر التالى
Range("F" & x) = x
ثم هذا السطر المضاف ماذا يقول ::
Range("F" & x).Offset(0, 1) = "Officena"
بالاشارة الى الخلية نفسها التى كتبت الرقم 1 فى الخلية F1 وهى ::
Range("F" & x)
اعمل لها ازاحة او انحراف عنها عمود واحد جهة اليسار اى الخلية المجاورة لها جهة اليسار اى ::
Range("F" & x).Offset(0, 1)
وضع فيها القيمة Officena اى ::
Range("F" & x).Offset(0, 1) = "Officena"
اى ضع فى الخلية G1 كلمة Offset وهكذا حتى يكمل الدورات الثلاثة لنتقدم خطوة مع خاصية Offset هل تعمل هذه الخصية مع خلية مفردة فقط لا طبعا فالخلية المفردة تعتبر مدى او نطاق مكون من خلية واحدة و الخاصية Offset تتعامل فى الاصل مع المدى سواء كان خلية واحدة او مدى مركب من عدة اعمدة وصفوف اى ( جدول بيانات ) لنرى هذا المثال البسيط الذى نود فيه ان نقوم بالاتى :: نريد ان نكتب كلمة Officena فى المدى A1:B10 وهو مكون من عشرة صفوف وهم من الصف 1 - 10 وعمودين اثنين هما العمود A والعمود B بمعنى انه مدى مكون من عشرون خلية اى عبارة عن جدوال من عشرة صفوف وعمودين ليس من المعقول ان نستخدم For...Next لعمل ذلك عن طريق حلقتين تكراريتين لنرى المثال وهو تمهيد فقط للمثال الخامس المثال_4 ::
Sub Ex_4()
Range("A1:B10") = "Officena"
End Sub
يقوم هذا المثال بتعبئة المدى A1:B10 بكلمة Officena دفعة واحدة انسخ المثال الى ملف لتجربتة عظيم حتى الان و واضح المثال_5 :: ولكن ماذا اذا اردنا ان نعمل ازاحة لهذا المدى A1:B10 بمقدار عمود واحد عن موقعة الاصلى ( A1:B10 ) بمعنى بدلا من ان يقوم بتعبئة المدى A1:B10 بكلمة Officena يقوم يتعبئة المدى B1:C10 بكلمة Officena
Sub Ex_5()
Range("A1:B10").Offset(0, 1) = "Officena"
End Sub
نرى فى هذا الكود اننا تعاملنا مع هذا المدى كما تعاملنا مع مدى مكون من خلية مفردة نعم فالخاصية Offset مرنة ويمكنها التعامل مع الاوضاع التالية :: مدى مكون من خلية واحدة مدى مكون من مجموهة صفوف واعمدة اى جدول مدى مكون من عدة امدية او نطاقات مجمعة تشمل اى عدد من النوعين السابقين ولنرى مثال لذلك وعليك ان تقوم بالتجربة وتعديل المدى الى اى من الحالات الثلاثة السابقة المثال_6 ::
Sub Ex_6()
Range("A1:B10,F1:G10").Offset(0, 1) = "Officena"
End Sub
يحتوى هذا المثال على نطاقين عبارة عن جدولين هما النطاقين :: A1:B1 F1:G10 وسوف يقوم الكود بتعبئة نطاقين جديدين بمعرفة النطاقات السابقه بكلمة Officena على ان تكون النطاقات الجديدة لها ازاحه او انحراف عن النطاقات الاصلية بمقدار عمود واحد
Range("A1:B10,F1:G10").Offset(0, 1)



وهذه النطاقات بعد الازاحة ستكون

B1:C1 بدلا من A1:B1

G1:H10 بدلا من F1:G10

وعليك تطبيق هذا المثال عمليا لترى وتستوعب طريقة عمل الخاصية Offset

وايضا لتعرف هل استوعبت هذا الشرح ام هو غير مجدى


والى لقاء قريب بإذن الله بصالح دعائكم

تم تعديل بواسطه أبو تامر
  • Like 1
  • Thanks 1
زائر
هذا الموضوع مغلق.
  • تصفح هذا الموضوع مؤخراً   0 اعضاء متواجدين الان

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

Important Information