در مقاله ی قبلی با تعریف حلقه ها در ماکرو نویسی آشنا شدیم و ساختار حلقه ی Do را بررسی کردیم، در این مقاله حلقه ی For در ویژوال بیسیک را معرفی میکنیم، لازم است قبل از خواندن این نوشته حتماً مقاله ی “حلقه ها در ماکرو نویسی” را مطالعه نمایید.
همانطور که قبلاً گفته شد، برای تشکیل حلقه ها در ماکرو نویسی در اکسل دو ساختار متفاوت وجود دارد، حلقه ی DO و حلقه ی For، هر یک از این دو حلقه ساختارهای مختص خود را دارد و در بسیاری از موراد میتوان هریک از آنها را به جای دیگری به کار برد.
ساختمان حلقه ها در ماکرو نویسی در اکسل بسیار ساده است و کاربرد آنها تنها نیاز به داشتن درک درست از نحوه ی عملکردشان دارد. برای آشنایی با حلقه ی Do به مقاله ی حلقه ها در ماکرو نویسی مراجعه نمایید.
توصیه میشود در استفاده از حلقه ها در کدهای ویژوال بیسیک در اکسل بسیار گام به گام و حساب شده عمل نمایید زیرا نوشتن حلقه ای اشتباه میتواند منجر به از بین رفتن اطلاعات فایل اکسل شما و یا هنگ کردن (Hang) اکسل شود که در نهایت ممکن است منجر به از بین رفتن کدهایی که ایجاد نموده اید گردد، فلذا به یاد داشته باشید همواره کدهای خود قبل از اجرای حلقه ذخیره نمایید.
شکل زیر خلاصه ای از مبحث حلقه ها در ماکرو نویسی در اکسل را نشان میدهد:
ساختار حلقه For در ویژوال بیسیک
دو ساختار (Syntax) متفاوت برای حلقه ی For در ویژوال بیسیک وجود دارد، این دو ساختار به لحاظ کاربرد تفاوت دارند، در ادامه در مورد هریک صحبت خواهیم کرد:
1 2 3 4 5 |
For counter = start To end [Step step] [statements] [Exit For] [statements] Next [counter] |
1 2 3 4 5 |
ForEach element In group [statements] [Exit For] [statements] Next [element] |
حلقه ی For در ویژوال بیسیک بر خلاف حلقه ی Do، شرط اجرای حلقه ندارد.
ساختار اول حلقه ی For در ویژوال بیسیک
در حلقه ی For ماکرو نویسی در اکسل، شما تعیین میکنید که چند بار حلقه اجرا شود (Loop)، در حلقه ی For یک شمارنده ی حلقه (Loop Counter) وجود دارد که مقدار ابتدایی (Start) و انتهایی (End) آن شمارنده (که خود یک متغیر عددی میباشد) توسط برنامه نویس تعیین میشود، از طرفی برنامه نویس مختار است برای تغییر مقدار شمارنده Step Size تعیین نماید، SizeStep عددی است که به شمارنده (Loop Counter) قبلی اضافه میشود. به عنوان مثال شمارنده حلقه ی For میتواند متغیر i باشد که مقدار اولیه آن ۱ است و تا ۱۰۰ ادامه دارد، اگر Step Size را مثلاً ۲ در نظر بگیریم یعنی مقادیر i برابر است با ۱، ۳، ۵ الی ۹۹، مانند کد زیر:
1 2 3 |
For i = 1 To 100 Step 2 [Statements] Next i |
آرگومان Step یا Step Size میتواند یک عدد مثبت یا منفی باشد، یعنی به عنوان مثال حلقه ی فوق را میتوان به صورت زیر هم نوشت:
1 2 3 |
For i = 100 To 1 Step -2 [Statements] Next i |
عبارت Exit For مانند Exit Do در حلقه ی Do عمل میکند، این عبارت (Statement) برای اتمام حلقه در مرحله ای از اجرای حلقه است، مثلاً شما حلقه را برای هزار بار تکرار یک عملیات نوشته اید ممکن است در دور صدم اجرای حلقه، شما به مقصد خروجی مورد نظر برسید، برای جلوگیری از ادامه ی اجرای حلقه میتوانید از عبارت Exit For استفاده نمایید، این عبارت همواره به همراه یک عبارت شرطی مورد استفاده قرار میگیرد.
در ادامه چندین مثالی درک بهترکاربرد ساختار اول حلقه ی For در ویژوال بیسیک آورده شده است.
1 2 3 4 5 6 7 8 9 10 |
Sub ExcelPro() Dim Words, Chars, MyString For Words = 10 To 1 Step -1 ' Set up 10 repetitions. For Chars = 0 To 9 ' Set up 10 repetitions. MyString = MyString & Chars ' Append number to string. Next Chars ' Increment counter MyString = MyString & " " ' Append a space. Next Words MsgBox MyString End Sub |
پروسیژر بالا مثالی از کاربرد حلقه های For تو در تو میباشد، در حلقه ی For داخلی اعداد ۰ تا ۹ پشت سر هم در یک رشته به اسم MyString قرار میگیرند، حلقه ی بیرونی این رشته اعداد را پشت سر هم قرار میدهد و در نهایت خروجی این پروسیژر (Procedure) یک رشته متشکل از ده سری اعداد ۰ تا ۹ میباشد که با Space از هم جدا شده اند، این پروسیژر را اجرا کرده و با تغییر پارامترها درک بهتری از موضوع بدست آورید. کد زیر ساختار کلی حلقه های For تو در تو (Nested For Loops) را نشان میدهد:
1 2 3 4 5 6 7 |
For I = 1 To 10 For J = 1 To 10 For K = 1 To 10 ... Next K Next J Next I |
ساختار دوم حلقه ی For در ویژوال بیسیک
ساختار (Syntax) دوم حلقه ی For در ویژوال بیسیک در ادامه تکرار شده است:
1 2 3 4 5 |
ForEach element In group [statements] [Exit For] [statements] Next [element] |
این ساختار در واقع برای تکرار یک سری عبارت (Statement) برای هر المان (Element) یا عضو در یک آرایه (Array) یا یک مجموعه (Collection) میباشد. برای درک بهتر مطلب، لازم است ابتدا مفهوم Collection در ویژوال بیسیک را بشناسیم، در مقاله ی مفاهیم ماکرو در اکسل در مورد Collection توضیح داده ایم. با مفهوم آرایه (Array) و متغیرهای آرایه ای در مقاله ی “متغیر Array در ویژوال بیسیک” آشنا شده ایم.
مفهوم Collection در ویژوال بیسیک
در واقع Collection یک شی (Object) است که یک سری اشیا مرتبط را در بر میگیرد، به عنوان مثال شی Worksheets یک Collection است که تمام Worksheet های باز را در بر دارد، مثلاً اگر شما در حال کار کردن بر روی فایل اکسلی با سه Sheet هستید شی (Collection) Worksheets شامل این سه Sheet میباشد، برای اشاره به Sheet1 میتوان از عبارت زیر استفاده کرد:
Worksheets(“sheet1”)
آرگومان های ساختار دوم حلقه ی For در ویژوال بیسیک
در ساختار دوم، Group میتواند یک آرایه (Array) یا Collection باشد، اگر Group مجموعه (Collection) باشد در این صورت Element که به جای شمارنده (Loop Counter) در ساختار اول قرار دارد، یا یک متغیر از نوع Variant است و یا متغیری از نوع آن Collection (Object Variable)، مثلاً اگر Collection مورد نظر یک مجموعه سلول باشد (Range) متغیر قرار گرفته بجای Element یا یک متغیر از نوع Variant است و یا یک متغیر از نوع Range (در آینده در این مورد بیشتر صحبت خواهد شد).
دقت داشته باشید که Collection یا آرایه ی قرار گرفته بجای Group حداقل یک عضو باید داشته باشد.
در صورتی که Collection یک Array باشد، Element باید حتماً یک متغیر از نوع Variant تعریف شود.
توجه داشته باشید که Group نمیتواند یک آرایه (متغیر آرایه ای) که از نوع User-Defined است باشد، زیرا یک متغیر Variant (که در واقع Element است) نمیتواند یک متغیرUser-Defined Type باشد. (برای آشنایی با متغیرهای نوع User-Defined به مقاله ی “متغیر User-Defined در ویژوال بیسیک” مراجعه نمایید)
عبارت Exit For همانند قبل به منظور خارج شدن از حلقه عمل مینماید، در ادامه مثالی برای درک بهتر مفهوم و کاربرد حلقه ی For در ویژوال بیسیک ارایه شده است:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Sub ExcelPro() Dim Found Dim MyObject As Range Dim MyCollection As Range Set MyCollection = Range("A1:A100(" Found = False ' Initialize variable. For Each MyObject In MyCollection ' Iterate through each element. If MyObject.Text = "ExcelPro" Then ' If Text equals "Hello". Found = True ' Set Found to True. Exit For ' Exit loop. End If Next MsgBox MyObject.Row End Sub |
در پروسیژر بالا، سلول های A1 تا A100 را در نظر بگیرید، این محدوده (Range) یک Collection است و با نام MyCollection برای برنامه مشخص شده است. در یکی از سلول های این محدوده عبارت ExcelPro نوشته شده است، پروسیژر بالا با جستجوی محدوده به کاربر شماره سطر سلول حاوی ExcelPro را نمایش میدهد. به عنوان تمرین در یکی از سلول های محدوده ی A1 تا A100 عبارت ExcelPro را بنویسید و کدهای بالا را اجرا کنید.
تفاوت های کاربردی حلقه ی Do و حلقه ی For در ویژوال بیسیک
حلقه ی Do و حلقه For به لحاظ کاربردی دو تفاوت عمده دارند، اول اینکه حلقه ی For در ویژوال بیسیک بر خلاف حلقه ی Do، شرط اجرای حلقه ندارد و صرفاً تعداد Loop ها تعیین کننده اجرای حلقه میباشند و دوم اینکه توسط حلقه ی Do میتوان یک حلقه ی نامتناهی تشکیل داد ولی در حلقه ی For به علت اجباری بودن تعیین مقدار اولیه (Start) و نهایی (End) شمارنده حلقه (Counter)، امکان ایجاد حلقه ی نامتناهی وجود ندارد.
با عرض سلام.
این جا دیگه کجا بود ، اصن سنگ کپ کردم ، واقعا دستتون درد نکنه اینقدر مفاهیم را به صورت عالی و واضح توضیح می دین.
واقعا تشکر
اما من یه پشنهاد دارم ، اگه ویدیو هم آپلود کنید بهتر نمیشه (فقط واسه بخش VBA) ، بازم تشکر.
سلام، متشکرم، در آینده احتمالاً اینکارو خواهم کرد، ولی در حال حاضر کامل کردن محتوای سایت در اولویت قرار دارد، بازم متشکرم.
این دستور حلقه ای که بانک داره چه جوری معلممون یه مسئله داده خیلی سخته گفته مجموع اعداد یک تا بیست رو یکی درمیون حساب کنه میشه راهنمایی کنید؟اگه میشه برام ایمیل کنید ممنون میشم
سلام، برنامه ای که ازتون خواسته شده اتفاقاً بسیار راحت هست، میتوانید از کد زیر استفاده کنید:
Sub Excelpro()
Dim i, sum
sum = 0
For i = 1 To 20 Step 2
sum = sum + i
Next
End Sub
سلام
برنامه ای میخوام که سطرهای یک ستون را در یک سل و بین شان “,” باشد، وارد کند
در واقع همان تابع (concatenate) اما تعداد زیادی از سطرها و بصورت vba
با تشکر
سلام، لطفاً در بخش پرسش و پاسخ یه بحث جدید ایجاد کنید و این خواسته ی خود را مطرح کنید، در اینصورت افراد علاقمند میتوانند در نوشتن کد مورد نظر به شما کمک کنند، موفق باشید، البته به عنوان راهنمایی باید عرض کنم شما ابتدا باید متغیر ارایه ای تعریف کنید که تعداد عناصر آن به اندازه تعداد سطر های باشد و سپس عناصر متغیر ارایه ای تعریف شده را در یک رشته متنی به صورت مورد نظر ذخیره کنید.
با سلام
نحوه آموزش و کیفیت مطالبتون فوق العادس دستتون درد نکنه.
سلام، متشکرم، موفق باشید.
سلام
من میخوام با استفاده از داشتن ردیف یک سلول (مثلا a10) ردیف بعدیش رو عدد گذاری کنم( مثلا e10) بدون اینکه بر روی سلول مقصد کلیک کنم و همه اعداد رو بصورت دستی وارد کنم.
دستور ش چیه؟
و یا اگر من بدونم چطور میشه در ردیف e در سطر n ام عددی را از جای دیگه وارد کرد؟
تشکر
سلام، خیلی ساده از پروپرتی Value شی Range یا Cells استفاده کنید. موفق باشید.
با سلام خدمت استاد گرامی
یک جدول دارم که دارای (روز،ماه،کد پرسنلی،نام و نام خانوادگی،حقوق و…) میباشد بطور معمول یک شیت فیش حقوقی دارم که با وارد کردن کد پرسنلی حقوق آن پرسنل بطور خودکار محاسبه و فیش چاپ میشود اگر بخواهیم برای تعدا زیاد پرسنل انجام بدیم وقت گیر هست چطور میتونم بصورت گروهی با تعیین ماه مورد نظر برای همه فیش چاپ بشه ممنون میشم راهنمایی کنید.
سلام، انجام این کار در اکل به تنهایی ممکن نیستف برای این کار باید ماکرو نویسی انجام دهید. موفق باشید.
سلام ببخشید یه سوالی داشتم من برنامه ای رو نوشتم حالا میخوام در سی دی یا فلش بریزم ارور میده چیکار کنم؟
سلام شما میتوانید کدهای ویژوال بیسیک را به چند طریق ذخیره و منتقل نمایید:
۱- فایل اکسل حاوی کد را با پسوند xlsm یا Macro-Enabled Workbook ذخیره کنید.
۲-Module نوشته شده را در محیط VB و از منوی فایل Export کنید و به صورت فایل bas ذخیره نمایید.
۳-کدهای نوشته شده را خیلی ساده در یک فایل Note یا World کپی کنید و در محل دلخواه ذخیره نمایید.
موفق باشید.