در مطلب اول در زمینه حلقه ها در ماکرونویسی گفتیم که: ” حلقه یک عمل مشخص را به تعداد دفعات مشخصی تکرار میکند. هربار که این عمل انجام میشود چیزی در حلقه تغییر میکند و این تغییر باعث میشود هرتکرار با تکرار های قبل تفاوت اندکی داشته باشد”
حلقه 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 و ماکرونویسی در اکسل میتوانید به صفحه “دوره رایگان ماکرونویسی در اکسل” مراجعه کنید.
سلام وقت بخیر من یک فایل دارم که میخوام 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 درصد شناسایی میشه ولی ایتم های شناسایی شده کپی نمیشن نمیدونم چی کار کنم؟
قسمتی که چک میکنه رو باید اینطوری بنویسید:
با این تغییر برای من کپی میکنه.