Екцел ВБА петље - за сваку, за следећу, ради док, угнежђену и више

Да бисте ефикасно радили у ВБА, морате разумети петље.

Петље вам омогућавају да поновите кодни блок одређени број пута или да поновите кодни блок на сваком објекту у скупу објеката.

Прво ћемо вам показати неколико примера који ће вам показати за шта су петље способне. Онда ћемо вас научити све о петљама.

Брзи примери петље ВБА

За сваку петљу

За сваку петљу петља кроз сваки објекат у колекцији, као што је сваки радни лист у радној свесци или свака ћелија у опсегу.

Прелистајте све радне листове у радној свесци

Овај код ће проћи кроз све радне листове у радној свесци, откривајући сваки лист:

12345678 Суб ЛоопТхроугхСхеетс ()Дим вс Ас ВорксхеетЗа сваки вс у радним листовимавс.Висибле = ТачноСледећиЕнд Суб

Прођите кроз све ћелије у домету

Овај код ће се провлачити кроз низ ћелија, проверавајући да ли је вредност ћелије негативна, позитивна или нула:

1234567891011121314 Суб Иф_Лооп ()Дим Целл ас РангеЗа сваку ћелију у домету ("А2: А6")Ако је Целл.Валуе> 0 ТадаЦелл.Оффсет (0, 1) .Валуе = "Позитивно"ЕлсеИф Целл.Валуе <0 ЗатимЦелл.Оффсет (0, 1) .Валуе = "Негативно"ИначеЦелл.Оффсет (0, 1) .Валуе = "Нула"Крај АкоСледећа ћелијаЕнд Суб

За следеће петље

Друга врста петље „за“ је петља за следећу. Фор Нект Лооп вам омогућава да пролазите кроз целе бројеве.

Овај код ће се провлачити кроз целе бројеве од 1 до 10, приказујући сваки са оквиром за поруку:

123456 Суб ФорЛооп ()Дим и Ас ИнтегерЗа и = 1 до 10МсгБок иЗатим самЕнд Суб

Учините петље До

До Вхиле петље ће се петљати док је услов испуњен. Овај код ће такође пролазити кроз целе бројеве од 1 до 10, приказујући сваки са оквиром за поруку.

12345678 Суб ДоВхилеЛооп ()Дим н Ас Интегерн = 1Учинити Док је н <11МсгБок нн = н + 1ЛоопЕнд Суб

Радите до петљи

Насупрот томе, петље Урадити све док се не петљају све док се не испуни услов. Овај код ради исто што и претходна два примера.

12345678 Суб ДоУнтилЛооп ()Дим н Ас Интегерн = 1Урадите све док н> = 10МсгБок нн = н + 1ЛоопЕнд Суб

О овоме ћемо расправљати у наставку, али морате бити изузетно опрезни при креирању петљи До Вхиле или До Унтил како не бисте створили непрекидну петљу.

ВБА Лооп Буилдер

Ово је снимак екрана „Лооп Буилдер-а“ из нашег Премиум ВБА додатка: АутоМацро. Лооп Буилдер вам омогућава да брзо и једноставно направите петље за петље кроз различите објекте или бројеве. Можете извршити радње на сваком објекту и/или изабрати само објекте који задовољавају одређене критеријуме.

Додатак такође садржи многе друге програмере кодова, опсежну библиотеку кодова ВБА и асортиман алата за кодирање. То мора имати сваки ВБА програмер.

Сада ћемо детаљно покрити различите врсте петљи.

ВБА за следећу петљу

За синтаксу петље

Фор Нект Лооп вам омогућава да поновите блок кода одређени број пута. Синтакса је:

12345 [Затамни бројач као цео број]За бројач = Почетак до краја [Вредност корака][Уради нешто]Следећи [бројач]

Где су ставке у заградама опционалне.

  • [Дим Цоунтер ас Лонг] - Проглашава променљиву бројача. Потребно ако је опција Екплицит декларисана на врху вашег модула.
  • Цоунтер - Целобројна променљива која се користи за бројање
  • Почетак - Почетна вредност (Пример 1)
  • Крај - Крајња вредност (Пр. 10)
  • [Вредност корака] - Омогућава вам да бројите сва н цела броја уместо сваког 1 целог броја. Такође можете кренути уназад са негативном вредношћу (нпр. Корак -1)
  • [Уради нешто] - Код који ће се поновити
  • Следећи [бројач] - Завршна изјава за наредну петљу. Можете укључити бројач или не. Међутим, топло препоручујем укључивање бројача јер вам олакшава читање кода.

Ако је то збуњујуће, не брините. Прегледаћемо неке примере:

Броји до 10

Овај код ће се рачунати до 10 помоћу петље За следећу:

12345678 Суб ФорЕацх_ЦоунтТо10 ()Дим н Ас ИнтегерЗа н = 1 до 10МсгБок нНект нЕнд Суб

За Лооп Степ

Броји до 10 - само парни бројеви

Овај код броји до 10 рачунајући само парне бројеве:

12345678 Суб ФорЕацх_ЦоунтТо10_Евен ()Дим н Ас ИнтегерЗа н = 2 до 10 Корак 2МсгБок нНект нЕнд Суб

Приметите да смо додали „Корак 2“. Ово говори Фор Лооп -у да „пређе“ кроз бројач за 2. Такође можемо користити негативну вредност корака за корак уназад:

За корак петље - обрнуто

Одбројавање од 10

Овај код ће одбројавати од 10:

123456789 Суб ФорЕацх_Цоунтдовн_Инверсе ()Дим н Ас ИнтегерЗа н = 10 до 1 корак -1МсгБок нНект нМсгБок "Лифт Офф"Енд Суб

Избришите редове ако је ћелија празна

Најчешће сам користио негативан корак Фор-Лооп за петље кроз опсеге ћелија, бришући редове који испуњавају одређене критеријуме. Ако петљате из горњих редова у доње редове, док бришете редове, забрљаћете бројач.

Овај пример ће избрисати редове са празним ћелијама (почевши од доњег реда):

12345678910 Суб ФорЕацх_ДелетеРовс_БланкЦеллс ()Дим н Ас ИнтегерЗа н = 10 до 1 корак -1Ако је опсег ("а" & н) .Валуе = "" ЗатимОпсег ("а" & н) .ЕнтиреРов.ДелетеКрај АкоНект нЕнд Суб

Уметнуто за петљу

Можете „угнездити“ један Фор Лооп у други Фор Лооп. Користићемо Уметнути фор петље за креирање табеле множења:

1234567891011 Суб Нстед_ФорЕацх_МултиплицатионТабле ()Дим ред Ас Интегер, цол Ас ИнтегерЗа ред = 1 до 9За цол = 1 до 9Ћелије (ред + 1, коло + 1). Вредност = ред * колоНект цолСледећи редЕнд Суб

Излаз за

Наредба Екит Фор вам омогућава да одмах напустите петљу Фор Нект.

Обично бисте користили Екит Фор заједно са Иф наредбом, изласком из Фор Нект Форма ако је испуњен одређени услов.

На пример, можете да користите Фор Лооп да бисте пронашли ћелију. Када се та ћелија пронађе, можете изаћи из петље да бисте убрзали код.

Овај код ће проћи кроз редове 1 до 1000, тражећи „грешку“ у колони А. Ако се пронађе, код ће изабрати ћелију, упозорити вас на пронађену грешку и изаћи из петље:

12345678910111213 Суб ЕкитФор_Лооп ()Дим и Ас ИнтегерЗа и = 1 до 1000Ако је опсег ("А" & и) .Валуе = "грешка" ЗатимРаспон ("А" & и). ОдаберитеМсгБок "Грешка је пронађена"Излаз заКрај АкоЗатим самЕнд Суб

Важно: У случају угнежђене фор петље, Екит Фор напушта само тренутну Фор Лооп, а не све активне петље.

Наставите за

ВБА нема команду „Настави“ која се налази у Висуал Басицу. Уместо тога, мораћете да користите „Излаз“.

ВБА за сваку петљу

ВБА за сваку петљу ће проћи кроз све објекте у колекцији:

  • Све ћелије у опсегу
  • Сви радни листови у радној свесци
  • Сви облици на радном листу
  • Све отворене радне свеске

Такође можете да користите угнежђене за сваку петљу да бисте:

  • Све ћелије у опсегу на свим радним листовима
  • Сви облици на свим радним листовима
  • Сви листови у свим отвореним радним свескама
  • и тако даље…

Синтакса је:

123 За сваки објекат у збирци[Уради нешто]Следећи [објекат]

Где:

  • Објецт - Променљива која представља опсег, радни лист, радну свеску, облик итд. (Нпр. Рнг)
  • Збирка - Збирка објеката (нпр. Распон („а1: а10“))
  • [Уради нешто] - Кодни блок за покретање на сваком објекту
  • Следећи [објекат] - Завршна реч. [Објекат] није обавезан, али се препоручује.

За сваку ћелију у домету

Овај код ће се провлачити кроз сваку ћелију у опсегу:

123456789 Суб ФорЕацхЦелл_инРанге ()Дим целл Ас РангеЗа сваку ћелију у домету ("а1: а10")целл.Валуе = целл.Оффсет (0,1) .ВредностСледећа ћелијаЕнд Суб

За сваки радни лист у радној свесци

Овај код ће проћи кроз све радне листове у радној свесци, уклањајући заштиту сваког листа:

123456789 Суб ФорЕацхСхеет_инВоркбоок ()Дим вс Ас ВорксхеетЗа сваки вс у радним листовимавс.Унпротецт "пассворд"Нект всЕнд Суб

За сваку отворену радну свеску

Овај код ће сачувати и затворити све отворене радне свеске:

123456789 Суб ФорЕацхВБ_инВоркбоокс ()Дим вб Као радна свескаЗа сваку вб у радним свескамавб.Цлосе СавеЦхангес: = ТачноНект вбЕнд Суб

За сваки облик на радном листу

Овај код ће избрисати све облике у активном листу.

123456789 Суб ФорЕацхСхапе ()Дим схп Ас СхапеЗа сваки схп у АцтивеСхеет.Схапессхп.ДелетеСледећи схпЕнд Суб

За сваки облик на сваком радном листу у радној свесци

Такође можете угнездити за сваку петљу. Овде ћемо проћи кроз све облике на свим радним листовима у активној радној свесци:

1234567891011 Суб ФорЕацхСхапе_инАллВорксхеетс ()Дим схп Ас Схапе, вс Ас ВорксхеетЗа сваки вс у радним листовимаЗа сваки схп У вс.Схапессхп.ДелетеСледећи схпНект всЕнд Суб

За сваки - ИФ петља

Као што смо раније поменули, можете користити наредбу Иф унутар петље, извршавајући радње само ако су испуњени одређени критеријуми.

Овај код ће сакрити све празне редове у опсегу:

12345678910 Суб ФорЕацхЦелл_инРанге ()Дим целл Ас РангеЗа сваку ћелију у домету ("а1: а10")Иф целл.Валуе = "" Онда _целл.ЕнтиреРов.Хидден = ТачноСледећа ћелијаЕнд Суб

ВБА До Вхиле Лооп

ВБА До До и До До (погледајте следећи одељак) су веома слични. Они ће понављати петљу док (или док) услов није испуњен.

До вхиле петља ће понављати петљу док је услов испуњен.

Ево синтакса До Вхиле:

123 Урадите док стање[Уради нешто]Лооп

Где:

  • Стање - Услов за тестирање
  • [Уради нешто] - Блок кода за понављање

Такође можете поставити До Вхиле петљу са Условом на крају петље:

123 Урадити[Уради нешто]Стање петље док

Показаћемо сваки од њих и показати како се разликују:

До Вхиле

Ево примера петље До Вхиле који смо претходно демонстрирали:

12345678 Суб ДоВхилеЛооп ()Дим н Ас Интегерн = 1Учинити Док је н <11МсгБок нн = н + 1ЛоопЕнд Суб

Лооп Вхиле

Покренимо сада исту процедуру, осим што ћемо померити услов на крај петље:

12345678 Суб ДоЛоопВхиле ()Дим н Ас Интегерн = 1УрадитиМсгБок нн = н + 1Петља Док је н <11Енд Суб

ВБА До До Лооп

Учините све док се петље неће понављати док се не испуни одређени услов. Синтакса је у основи иста као и петље До Вхиле:

123 Уради до стања[Уради нешто]Лооп

и слично, услов може ићи на почетак или крај петље:

123 Урадити[Уради нешто]Петља до стања

Уради до

Ова петља до, рачунаће се до 10, као и наши претходни примери

12345678 Суб ДоУнтилЛооп ()Дим н Ас Интегерн = 1Радите до н> 10МсгБок нн = н + 1ЛоопЕнд Суб

Петља до

Ова петља Петља до бројиће се до 10:

12345678 Суб ДоЛоопУнтил ()Дим н Ас Интегерн = 1УрадитиМсгБок нн = н + 1Петља до н> 10Енд Суб

Изађите из До Лооп -а

Слично коришћењу Екит Фор за излазак из Фор Лооп -а, помоћу Екит До наредбе одмах излазите из До Лооп -а

1 Излаз До

Ево примера Екит До:

123456789101112131415 ПодизлазДо_Лооп ()Дим и Ас Интегери = 1Учинити до и> 1000Ако је опсег ("А" & и) .Валуе = "грешка" ЗатимРаспон ("А" & и). ОдаберитеМсгБок "Грешка је пронађена"Излаз ДоКрај Акои = и + 1ЛоопЕнд Суб

Енд ор Бреак Лооп

Као што смо горе споменули, за излаз из петљи можете користити Екит Фор или Екит До:

1 Излаз за
1 Излаз До

Међутим, ове команде се морају додати вашем коду пре него што покренете петљу.

Ако покушавате да „прекинете“ петљу која је тренутно покренута, можете покушати да притиснете ИЗАЋИ или ЦТРЛ + Паузирај паузу на тастатури. Међутим, ово можда неће успети. Ако не ради, мораћете да сачекате да се ваша петља заврши или, у случају бесконачне петље, користите ЦТРЛ + АЛТ + Избриши да бисте затворили Екцел.

Због тога покушавам да избегнем До петље, лакше је случајно створити бескрајну петљу која вас тера да поново покренете Екцел, чиме потенцијално губите посао.

Још примера петљи

Петља кроз редове

Ово ће проћи кроз све редове у колони:

123456789 Публиц Суб ЛоопТхроугхРовс ()Дим целл Ас РангеЗа сваку ћелију у опсегу ("А: А")Фф целл.валуе "" затим МсгБок целл.аддресс & ":" & целл.валуеСледећа ћелијаЕнд Суб

Петље кроз колоне

Ово ће проћи кроз све колоне у низу:

123456789 Публиц Суб ЛоопТхроугхЦолумнс ()Дим целл Ас РангеЗа сваку ћелију у опсегу ("1: 1")Иф целл.Валуе "" Тхен МсгБок целл.Аддресс & ":" & целл.ВалуеСледећа ћелијаЕнд Суб

Прођите кроз датотеке у фасцикли

Овај код ће проћи кроз све датотеке у фасцикли, стварајући листу:

12345678910111213141516171819 Суб ЛоопТхроугхФилес ()Дим оФСО Ас ОбјецтЗатамни фасциклу као објекатДим оФиле Ас ОбјецтДим и Ас ИнтегерПостави оФСО = ЦреатеОбјецт ("Сцриптинг.ФилеСистемОбјецт")Постави оФолдер = оФСО.ГетФолдер ("Ц: \ Демо)и = 2За сваки оФиле Ин оФолдер.ФилесОпсег ("А" & и) .валуе = оФиле.Намеи = и + 1Следећа оФилеЕнд Суб

Лооп Тхроугх Арраи

Овај код ће се провлачити кроз низ „аррЛист“:

123 За и = ЛБоунд (аррЛист) За УБоунд (аррЛист)МсгБок аррЛист (и)Затим сам

ЛБоунд функција добија „доњу границу“ низа, а УБоунд „горњу границу“.

Петље у Аццесс ВБА

Већина горњих примера ће такође радити у Аццесс ВБА. Међутим, у Аццессу пролазимо кроз Објекат записа више него у објекат опсега.

123456789101112131415161718 Суб ЛоопТхроугхРецордс ()На Грешка Настави даљеДим дбс као база податакаДим рст Ас РецордсетСет дбс = ЦуррентДбПостави рст = дбс.ОпенРецордсет ("тблЦлиентс", дбОпенДинасет)Са првим.МовеЛаст.МовеФирстУрадите све док .ЕОФ = ТачноМсгБок (рст.Фиелдс ("ЦлиентНаме")).МовеНектЛоопЗавршитирст.ЦлосеСет рст = НиштаПоставите дбс = НиштаЕнд Суб

Ви ће помоћи развој сајта, дељење страницу са пријатељима

wave wave wave wave wave