4.9/5 - (13 امتیاز)
با استفاده از اطلاعاتی که در مطلب قبل در زمینه متغیر شی یا object variable در برنامه نویسی وی بی ای بدست آوردیم، در این مطلب ادامه بحث حلقه ها در ماکرونویسی را پی میگیریم و با یکی دیگر از انواع اصلی حلقه در vba به نام حلقه For each آشنا میشویم.

در مطلب اول در زمینه حلقه ها در ماکرونویسی گفتیم که: ” حلقه یک عمل مشخص را به تعداد دفعات مشخصی تکرار میکند. هربار که این عمل انجام میشود چیزی در حلقه تغییر میکند و این تغییر باعث میشود هرتکرار با تکرار های قبل تفاوت اندکی داشته باشد”

حلقه For each به صورت ویژه در گروه ها یا مجموعه ها اشیاء مورد استفاده قرار می گیرد. به این معنی که حلقه  For Each یک عمل خاص را برای تمام اشیاء موجود در یک مجموعه تکرار میکند. برای مثال:

  • انجام یک عمل خاص بر روی تمام ورک شیت های یک ورک بوک
  • انجام یک عمل خاص بر روی تمام نمودارهای یک ورک شیت
  • انجام یک عمل خاص بر روی تمام سلول های یک محدوده
  • انجام یک عمل خاص بر روی تمام پیوت تیبل های یک ورک شیت

زمانی که از حلقه  For Each در برنامه نویسی ویژوال بیسیک استفاده میکنیم، عمل مورد نظر برای تمام اشیاء موجود در مجموعه تکرار میشود. نیازی نیست شما تعداد اشیاء را بدانید یا نام هرکدام از آنها مشخص باشد، اکسل تمام این اطلاعات و اقدامات را به صورت اتوماتیک انجام میدهد.

ترکیب اصلی حلقه  For Each در ماکرونویسی

سینتکس اصلی حلقه  For Each به شکل زیر است:

Dim [نام متغیر] as [نوع متغیر]

For Each [نام متغیر] In [گروه یا مجموعه]
'وارد کردن کدهای مورد نیاز
'استفاده از دستور exit for به منظور متوقف کردن لوپ قبل از پایان
'وارد کردن کدهای مورد نیاز
Next [شی]

برای درک بهتر نحوه کار حلقه ها در وی بی ای و به صورت خاص حلقه For each به مثال های زیر توجه کنید:

مثال 1

در مثال زیر، حلقه For each ورک شیت های موجود در یک ورک بوک را می یابد و نام هرکدام را در یک message box نمایش میدهد.

Sub ForEachExample1()

 Dim ws As Worksheet

 For Each ws In ActiveWorkbook.Sheets

MsgBox ws.Name

 Next ws

 End Sub

کد بالا با تعریف متغیر آغاز میشود. این خط کد یک متغیر شی به نام “ws” ایجاد میکند که صرفا میتواند شامل ورک شیت باشد.

        Dim ws As Worksheet

سطر بعدی حلقه For each را ایجاد میکند. این حلقه برای تمام ورک شیت های “ws” موجود در ورک بوک تکرار خواهد شد.

For Each ws In ActiveWorkbook.Sheets

عملی که میخواهیم پس از هر تکرار رخ دهد را بعد از این قسمت می آوریم و در نهایت حلقه را می بندیم:

Next ws

مثال 2

حلقه های تو در تو

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

Sub ForEachExample2()

Dim ws As Worksheet

'شروع حلقه اول
For Each ws In ActiveWorkbook.Sheets

    ws.Select

    'شروع حلقه دوم
    For Each c In Selection
 
        MsgBox c.Address

    Next c

Next ws

End Sub

ترتیب اجرای حلقه For each

همانطور که گفتیم حلقه For each بر روی عناصر موجود در یک مجموعه یا گروه اجرا میشود. اما از آنجایی که ممکن است عناصر مختلفی در یک گروه وجود داشته باشد این سوال ایجاد میشود که ترتیب انتخاب این عناصر توسط حلقه بر چه اساسی است؟ باید توجه کرد که این انتخاب به صورت الفبایی رخ نمیدهد بلکه بر اساس شاخص مربوط به هر شی اجرا می گردد. برای مثال :

  • ورک شیت ها – بر اساس ترتیب تب های ورک بوک انتخاب میشوند. اولین ورک شیت ورک بوک همیشه اولین عنصر حلقه خواهد بود.
  • سلول ها -همیشه از چپ به راست و سپس از بالا به پایین انتخاب و اجرا میشوند.

چند نکته کاربردی در استفاده از حلقه For each

نکات زیر میتواند در کار با حلقه For each در برنامه نویسی vba بسیار کمک کننده باشد:

  • حلقه For Each فقط زمانی کار میکند که گروه یا مجموعه و شی مورد نظر از یک جنس باشند. برای مثال شما نمیتوانید حلقه ای را بر روی تمام ورک شیت های موجود در یک محدوده اجرا کنید. زیرا هیچ ورک شیتی در درون محدوده های سلولی وجود ندارد.
  • حلقه هیچ کدام از اشیاء را انتخاب نمیکند. در صورتی که میخواهید اشیاء انتخاب شوند می بایست این دستور را (select) در کدهای خود بگنجانید( شبیه به مثال 2)
  • معمولا حلقه بر روی تمام اشیاء موجود در مجموعه اجرا میشود. با قرار دادن exit for در میان start و end اجرای حلقه متوقف میشود و ادامه کد از بعد از حلقه اجرا میشود

برای مطالعه مطالب و فیلم های آموزشی رایگان در زمینه برنامه نویسی VBA و ماکرونویسی در اکسل میتوانید به صفحه “دوره رایگان ماکرونویسی در اکسل”  مراجعه کنید. 

مشترک شدن
Notify of
guest

4 نظرات
نظردهی درون متنی
مشاهده همه نظرات
مرتضی

سلام وقت بخیر من یک فایل دارم که میخوام 10درصد بالاترین داده ها شناسایی و بعداز شناسایی اون 10 درصد به شیت دیگر منتقل شود لذا اومدم دو تا حلقه تعریف کردم که اول بیشترین داده ها رنگی بشن و حلقه دیگر اینه که حالا اون رنگی ها رو به شیت دیگه منتقل کن فرمولی که نوشتم فقط 10 درصد بالا رو شناسایی میکنه و عملیات کپی رو انجام نمیده لطفا راهنمایی کنید که چرا حلقه دوم که نوشتم اجرا نمیشه؟ Dim mycell As Range Dim myrange As Range Set myrange = Worksheets(“sheet1”).Range(“a1:b7”) myrange.Interior.Pattern = xlnon For Each mycell In… مطالعه بیشتر »

امیر دایی

راه ساده تر این هست که به جای حلقه اول از قابلیت فیلتر برای انجام این کار استفاده کنید. توی قسمت فیلتر می تونید از گزینه top 10 استفاده کنید و توی تنظیمات از گزینه present به جای item استفاده کنید. بعد از فیلتر کردن با زدن ctrl+A بازه رو انتخاب و کپی کنید و توی شیت مورد نظر پیست کنید. این مراحل رو می تونید یک ماکرو ضبط کنید و از کدش استفاده کنید. مشکل کد شما اینه که توی حلقه اول از colorIndex استفاده کردید و توی حلقه دوم از color استفاده کردید. توی حلقه دوم شرط مساوی… مطالعه بیشتر »

مرتضی

در هر دوحلقه colorindex گذاشتم ولی همچنان فقط 10 درصد شناسایی میشه ولی ایتم های شناسایی شده کپی نمیشن نمیدونم چی کار کنم؟

امیر دایی

قسمتی که چک میکنه رو باید اینطوری بنویسید:

 If TransIDCell.Interior.ColorIndex = 4 Then

با این تغییر برای من کپی میکنه.