حلقه ی For در ویژوال بیسیک

در مقاله ی قبلی با تعریف حلقه ها در ماکرو نویسی آشنا شدیم و ساختار حلقه ی Do را بررسی کردیم، در این مقاله حلقه ی For در ویژوال بیسیک را معرفی میکنیم، لازم است قبل از خواندن این نوشته حتماً مقاله ی “حلقه ها در ماکرو نویسی” را مطالعه نمایید.

همانطور که قبلاً گفته شد، برای تشکیل حلقه ها در ماکرو نویسی در اکسل دو ساختار متفاوت وجود دارد، حلقه ی DO و حلقه ی For، هر یک از این دو حلقه ساختارهای مختص خود را دارد و در بسیاری از موراد میتوان هریک از آنها را به جای دیگری به کار برد.

ساختمان حلقه ها در ماکرو نویسی در اکسل بسیار ساده است و کاربرد آنها تنها نیاز به داشتن درک درست از نحوه ی عملکردشان دارد. برای آشنایی با حلقه ی Do به مقاله ی حلقه ها در ماکرو نویسی مراجعه نمایید.

حلقه ی For در ویژوال بیسیک

توصیه میشود در استفاده از حلقه ها در کدهای ویژوال بیسیک در اکسل بسیار گام به گام و حساب شده عمل نمایید زیرا نوشتن حلقه ای اشتباه میتواند منجر به از بین رفتن اطلاعات فایل اکسل شما و یا هنگ کردن (Hang) اکسل شود که در نهایت ممکن است منجر به از بین رفتن کدهایی که ایجاد نموده اید گردد، فلذا به یاد داشته باشید همواره کدهای خود قبل از اجرای حلقه ذخیره نمایید.

شکل زیر خلاصه ای از مبحث حلقه ها در ماکرو نویسی در اکسل را نشان میدهد:

ساختار حلقه ها در ماکرو نویسی در اکسل

ساختار حلقه For در ویژوال بیسیک

دو ساختار (Syntax) متفاوت برای حلقه ی For در ویژوال بیسیک وجود دارد، این دو ساختار به لحاظ کاربرد تفاوت دارند، در ادامه در مورد هریک صحبت خواهیم کرد:

حلقه ی For در ویژوال بیسیک بر خلاف حلقه ی Do، شرط اجرای حلقه ندارد.

حلقه ی For در ویژوال بیسیک

ساختار اول حلقه ی For در ویژوال بیسیک

در حلقه ی For ماکرو نویسی در اکسل، شما تعیین میکنید که چند بار حلقه اجرا شود (Loop)، در حلقه ی For یک شمارنده ی حلقه (Loop Counter) وجود دارد که مقدار ابتدایی (Start) و انتهایی (End) آن شمارنده (که خود یک متغیر عددی میباشد) توسط برنامه نویس تعیین میشود، از طرفی برنامه نویس مختار است برای تغییر مقدار شمارنده Step Size تعیین نماید، SizeStep عددی است که به شمارنده (Loop Counter) قبلی اضافه میشود. به عنوان مثال شمارنده حلقه ی For میتواند متغیر i باشد که مقدار اولیه آن ۱ است و تا ۱۰۰ ادامه دارد، اگر Step Size را مثلاً ۲ در نظر بگیریم یعنی مقادیر i برابر است با ۱، ۳، ۵ الی ۹۹، مانند کد زیر:

آرگومان Step یا Step Size میتواند یک عدد مثبت یا منفی باشد، یعنی به عنوان مثال حلقه ی فوق را میتوان به صورت زیر هم نوشت:

ساختار اول حلقه ی For در ویژوال بیسیک

عبارت Exit For مانند Exit Do در حلقه ی Do عمل میکند، این عبارت (Statement) برای اتمام حلقه در مرحله ای از اجرای حلقه است، مثلاً شما حلقه را برای هزار بار تکرار یک عملیات نوشته اید ممکن است در دور صدم اجرای حلقه، شما به مقصد خروجی مورد نظر برسید، برای جلوگیری از ادامه ی اجرای حلقه میتوانید از عبارت Exit For استفاده نمایید، این عبارت همواره به همراه یک عبارت شرطی مورد استفاده قرار میگیرد.

در ادامه چندین مثالی درک بهترکاربرد ساختار اول حلقه ی For در ویژوال بیسیک آورده شده است.

پروسیژر بالا مثالی از کاربرد حلقه های For تو در تو میباشد، در حلقه ی For داخلی اعداد ۰ تا ۹ پشت سر هم در یک رشته به اسم MyString قرار میگیرند، حلقه ی بیرونی این رشته اعداد را پشت سر هم قرار میدهد و در نهایت خروجی این پروسیژر (Procedure) یک رشته متشکل از ده سری اعداد ۰ تا ۹ میباشد که با Space از هم جدا شده اند، این پروسیژر را اجرا کرده و با تغییر پارامترها درک بهتری از موضوع بدست آورید. کد زیر ساختار کلی حلقه های For تو در تو (Nested For Loops) را نشان میدهد:

حلقه ی For در ویژوال بیسیک

ساختار دوم حلقه ی For در ویژوال بیسیک

ساختار (Syntax) دوم حلقه ی For در ویژوال بیسیک در ادامه تکرار شده است:

ساختار دوم حلقه For در ویژوال بیسیک

این ساختار در واقع برای تکرار یک سری عبارت (Statement) برای هر المان (Element) یا عضو در یک آرایه (Array) یا یک مجموعه (Collection) میباشد. برای درک بهتر مطلب، لازم است ابتدا مفهوم Collection در ویژوال بیسیک را بشناسیم، در مقاله ی مفاهیم ماکرو در اکسل در مورد Collection  توضیح داده ایم. با مفهوم آرایه (Array) و متغیرهای آرایه ای در مقاله ی “متغیر Array در ویژوال بیسیک” آشنا شده ایم.

مفهوم Collection در ویژوال بیسیک

در واقع Collection یک شی (Object) است که یک سری اشیا مرتبط را در بر میگیرد، به عنوان مثال شی Worksheets یک Collection است که تمام Worksheet های باز را در بر دارد، مثلاً اگر شما در حال کار کردن بر روی فایل اکسلی با سه Sheet هستید شی (Collection) Worksheets شامل این سه Sheet میباشد، برای اشاره به Sheet1 میتوان از عبارت زیر استفاده کرد:

Worksheets(“sheet1”)

حلقه ی For در ویژوال بیسیک

آرگومان های ساختار دوم حلقه ی 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 در ویژوال بیسیک ارایه شده است:

در پروسیژر بالا، سلول های A1 تا A100 را در نظر بگیرید، این محدوده (Range) یک Collection است و با نام MyCollection برای برنامه مشخص شده است. در یکی از سلول های این محدوده عبارت ExcelPro نوشته شده است، پروسیژر بالا با جستجوی محدوده به کاربر شماره سطر سلول حاوی ExcelPro را نمایش میدهد. به عنوان تمرین در یکی از سلول های محدوده ی A1 تا A100 عبارت ExcelPro را بنویسید و کدهای بالا را اجرا کنید.

حلقه ی For در ویژوال بیسیک

تفاوت های کاربردی حلقه ی Do و حلقه ی For در ویژوال بیسیک

حلقه ی Do و حلقه For به لحاظ کاربردی دو تفاوت عمده دارند، اول اینکه حلقه ی For در ویژوال بیسیک بر خلاف حلقه ی Do، شرط اجرای حلقه ندارد و صرفاً تعداد Loop ها تعیین کننده اجرای حلقه میباشند و دوم اینکه توسط حلقه ی Do میتوان یک حلقه ی نامتناهی تشکیل داد ولی در حلقه ی For به علت اجباری بودن تعیین مقدار اولیه (Start) و نهایی (End) شمارنده حلقه (Counter)، امکان ایجاد حلقه ی نامتناهی وجود ندارد.

اشتراک گذاری در شبکه های اجتماعی: share on facebook share on google plus share on linkedin

۸ نظر

  1. حمید سالار

    با عرض سلام.
    این جا دیگه کجا بود ، اصن سنگ کپ کردم ، واقعا دستتون درد نکنه اینقدر مفاهیم را به صورت عالی و واضح توضیح می دین.
    واقعا تشکر
    اما من یه پشنهاد دارم ، اگه ویدیو هم آپلود کنید بهتر نمیشه (فقط واسه بخش VBA) ، بازم تشکر.

    1. حامد قدیمی

      سلام، متشکرم، در آینده احتمالاً اینکارو خواهم کرد، ولی در حال حاضر کامل کردن محتوای سایت در اولویت قرار دارد، بازم متشکرم.

  2. سهونا

    این دستور حلقه ای که بانک داره چه جوری معلممون یه مسئله داده خیلی سخته گفته مجموع اعداد یک تا بیست رو یکی درمیون حساب کنه میشه راهنمایی کنید؟اگه میشه برام ایمیل کنید ممنون میشم

    1. حامد قدیمی

      سلام، برنامه ای که ازتون خواسته شده اتفاقاً بسیار راحت هست، میتوانید از کد زیر استفاده کنید:
      Sub Excelpro()
      Dim i, sum
      sum = 0
      For i = 1 To 20 Step 2
      sum = sum + i
      Next
      End Sub

  3. حسین منصوری

    سلام
    برنامه ای میخوام که سطرهای یک ستون را در یک سل و بین شان “,” باشد، وارد کند
    در واقع همان تابع (concatenate) اما تعداد زیادی از سطرها و بصورت vba
    با تشکر

    1. حامد قدیمی

      سلام، لطفاً در بخش پرسش و پاسخ یه بحث جدید ایجاد کنید و این خواسته ی خود را مطرح کنید، در اینصورت افراد علاقمند میتوانند در نوشتن کد مورد نظر به شما کمک کنند، موفق باشید، البته به عنوان راهنمایی باید عرض کنم شما ابتدا باید متغیر ارایه ای تعریف کنید که تعداد عناصر آن به اندازه تعداد سطر های باشد و سپس عناصر متغیر ارایه ای تعریف شده را در یک رشته متنی به صورت مورد نظر ذخیره کنید.

دیدگاهتان را بنویسید؟