Глядя на цикл двух макросов VBA вместе в Excel, но я думаю, что я просто пропустил что-то очень маленькое. Цикл в макросе excel
VBA циклы — For Next и For Each в Excel
Цикл For Loop в VBA – один из самых популярных циклов в Excel. Данный цикл имеет две формы – For Next и For Each In Next. Данные операторы используются для последовательного перемещения по списку элементов или чисел. Для завершения цикла мы можем в любой момент использовать команду выхода. Давайте подробнее рассмотрим каждый из этих циклов.
VBA цикл For Next
Цикл For Next имеет следующий синтаксис:
123 | For счетчик = начало_счетчика To конец_счетчика‘Какое-то действиеNext счетчик |
То что мы делаем здесь, по существу, это создаем цикл, который использует переменную счетчик как хранитель времени. Устанавливаем его значение равным начало_счетчика, и увеличиваем (или уменьшаем) на 1 во время каждого витка. Цикл будет выполняться до тех пор, пока значение счетчик не станет равным конец_счетчика. Когда оба эти значения совпадут, цикл выполнится последний раз и остановится.
Пример цикла
123456 | Sub пример_цикла1()For счетчик = 1 to 10j = счетчикNext счетчикmsgbox "Значение счетчика на последнем витке равно " & счетчикEnd Sub |
Последнее значение переменной счетчик будет равным 11
VBA обратный цикл For Loop с инструкцией STEP
Если у вас появилась необходимость перемещаться от большего значения к меньшему – вы можете использовать цикл в обратном направлении. Вот пример обратного цикла:
123456 | Sub пример_цикла2()For счетчик = 10 to 1 Step -1j = счетчикNext счетчикmsgbox "Значение счетчика на последнем витке равно " & счетчикEnd Sub |
Последнее значение переменной счетчик будет равным 1.
Как вы могли заметить, мы можем использовать инструкцию Step n для работы цикла как вперед, так и в обратном направлении. По умолчанию значение Step равно 1, но оно может быть изменено, если необходимо пропускать какие-либо значения, тогда значение n будет больше одного, или перемещаться в обратном направлении, тогда n будет отрицательным.
VBA цикл For Each … Next
Цикл For Each … Next имеет следующий цикл:
123 | For Each элемент_группы In группа_элементов‘Какое-то действиеNext элемент_группы |
Здесь переменная элемент_группы принадлежит к группе_элементов (железная логика!!!). Я имею в виду, что объект группа_элементов должен быть коллекцией объектов. Вы не сможете запустить цикл For Each для отдельно объекта (Microsoft сразу оповестит вас об этом 438-й ошибкой).
Данный цикл перебирает все элементы какой-либо коллекции, начиная с самого первого. Вы можете использовать данный цикл, если вам необходимо, например, обойти все листы в книге, объекты на листе, сводные таблицы и т.д.
Ниже представлен пример, как можно воспользоваться циклом For Each для просмотра всех листов книги:
12345 | Sub пример_цикла4()For Each sht In ActiveWorkbook.WorksheetsMsgBox sht.NameNext shtEnd Sub |
… либо всех сводных таблиц на листе
12345 | Sub пример_цикла()For Each pvt In ActiveSheet.PivotTablesMsgBox pvt.NameNext pvtEnd Sub |
Прерывание цикла VBA
Если вам необходимо выйти из цикла до момента, как будет достигнуто условие завершения цикла, воспользуйтесь командой End For в связке с инструкцией IF. В примере, приведенном ниже, мы выйдем из цикла до момента достижения условия завершения, в данном цикле выход будет осуществлен при условии, когда переменная счетчик будет равна 3.
123456 | Sub пример_цикла5()For счетчик = 0 To 5MsgBox счетчикIf (счетчик = 3) Then Exit ForNext счетчикEnd Sub |
Пропуск части цикла в For Each
Пропускать часть цикла, а затем возвращаться назад – плохая практика. Тем не менее, давайте рассмотрим пример:
123456789101112 | Sub пример_цикла6 ()Dim j As IntegerFor i = 0 To 5b:If (j = 3) Then GoTo a:j = iNext ia:j = 4GoTo b:MsgBox ("Значение j = " & j)End Sub |
Здесь мы пропустили одну итерацию (когда j = 3). Как вы думаете, какой результат выдаст программа? 3? 5? Ну… на самом деле, ни один из вариантов не верный. Цикл будет выполняться бесконечно, пока память компьютера не переполнится.
Однако возможность пропустить шаг цикла без последствий существует. Вы можете увеличить значение счетчика на 1 (или другое значение), что приведет к пропуску операций, находящихся между этими значениями. Вот пример:
123456 | Sub пример_цикла7()For i = 0 To 5i = i + 1MsgBox iNext iEnd Sub |
Но опять же, это плохая практика написания кода, и может привести к нежелательным последствиям при написании кода в будущем. Вместо этого, при необходимости пропуска некоторых итераций, попробуйте использовать функцию If или Select Case.
Вам также могут быть интересны следующие статьи
exceltip.ru
НЕ ВОЛНУЙТЕСЬ, Я СЕЙЧАС ВСЕ ОБЪЯСНЮ!
03 Ноя 2009
В разделе Excel, уроки
Использование макросов циклов
При обработке данных бывают очень полезны макросы, называемые циклами, которые автоматически выполняют одни и те же действия повторно. Пользователю, работающему с большими массивами данных или с массивами разных размеров, циклы позволяют сэкономить немало времени и сил.
Цикл Do…Loop
В цикле Do…Loop производится подсчет строк в диапазоне данных до обнаружения пустой строки.
Предположим, вы хотите подсчитать количество строк в диапазоне данных, который может быть небольшим, а может — весьма солидным. Для этого следует использовать цикл Do…Loop. Он выполняет заданное действие столько раз, сколько необходимо. При этом подсчитывается число всех строк, найденных в диапазоне. Или предположим, что требуется выполнить одно действие в двух диапазонах данных, содержащих различное число строк. И в этом случае будет полезен цикл Do…Loop. Он выполнится столько раз, сколько необходимо для каждого из диапазонов. Как цикл определит, сколько именно раз следует повторить действие? Из заданных вами условий. Повтор прекратится, как только обнаружится определенный фрагмент данных, например пустая строка или некий текст.
В качестве условия выхода из цикла Do…Loop применяется условие While или условие Until. Цикл выполняется, пока заданное утверждение остается истинным (While) или пока оно не становится истинным (Until). Так, чтобы задать цикл, прекращающийся при обнаружении пустой ячейки в первом столбце, следует использовать условие While:
В соответствии с этим условием While цикл выполняется до тех пор, пока обрабатываемая им ячейка не окажется пустой. Обрабатываемая строка задана номером x, и первая ячейка этой строки имеет координаты (x,1). Комбинация знаков <> означает «не равно». Кавычки, между которыми ничего нет, обозначают пустую ячейку.
Если цикл требуется выполнять до обнаружения ячейки, содержащей число 365, используйте условие Until. В любом случае именно вы предоставляете программе сведения, помогающие ей определить, когда следует выйти из цикла.
Цикл For Each…Next
Цикл For Each…Next позволяет выделить более темным шрифтом каждое слово «ОК» в тексте выбранного фрагмента.
Цикл For Each…Next используется для выполнения некоторого действия над каждой ячейкой диапазона данных. Предположим, например, что в выделенном диапазоне требуется повсюду изобразить слово «ОК» более темным шрифтом по сравнению с остальным текстом. Код будет выглядеть примерно следующим образом:
Здесь «MyCell» указывает текущую ячейку, обрабатываемую в цикле, а «For Each» означает, что в цикле перебираются все ячейки выделенного фрагмента. При обнаружении ячейки, содержащей только слово «ОК», это слово выделяется темным шрифтом. (Внешний вид текста контролируется свойством Font, а атрибут Bold означает полужирное начертание.)
Вложенные циклы
Циклы Do…Loop и For Each…Next весьма эффективны в простейших случаях. Теперь мы немного повысим уровень сложности, перейдя к рассмотрению вложенных циклов. Они используются, когда необходимо выполнить какое-либо действие в нескольких диапазонах данных или несколько раз в одном диапазоне данных. Аналогией вложенных циклов может служить вращение Земли вокруг Солнца. Один полный оборот вокруг Солнца (год) можно считать внешним циклом, а один оборот Земли вокруг своей оси (сутки) — внутренним циклом, вложенным во внешний цикл. В течение каждого года выполняется 365 внутренних циклов, и каждое 1 января внешний цикл повторяется:
Разумеется, этот код не будет выполняться в Excel, но он наглядно показывает, что каждый большой цикл (оборот вокруг Солнца) включает 365 маленьких циклов (оборотов Земли вокруг своей оси).
Или же рассмотрим процедуру, реально выполнимую в Excel. Предположим, что необходимо удалить с листа лишние повторяющиеся строки. Для этого достаточно сравнить первую строку с каждой последующей и удалить все дубликаты, если они будут обнаружены, затем сравнить вторую строку с каждой последующей и т. д. Внешний цикл обеспечивает повторение этого процесса для каждой строки. Во внутреннем цикле будет производиться фактическое сравнение и удаление строк.
Использование свойства Cells в циклах
Столбцы обозначаются числами, а не буквами.
Данные, содержащиеся в ячейке, можно получать в коде макроса цикла двумя разными способами. Один из них предусматривает использование свойства Cells, а второй — использование свойства Range. В VBA обычно бывает легче и удобнее работать со свойством Cells, поскольку изменять описываемые им значения проще. Свойство Range идентифицирует строки и столбцы на листе с помощью чисел и букв, а в свойстве Cells и строки, и столбцы обозначаются числами. Добавление +1 к таким числам позволяет легко переходить в цикле от строки к строке и от столбца к столбцу, а вот реализовать в коде переход от одной буквы к следующей за ней не так просто.
Совет. При необходимости в электронной таблице можно задать отображение номеров столбцов вместо буквенных обозначений. Выберите в меню Сервис команду Параметры и перейдите на вкладку Общие. Установите флажок «Стиль ссылок R1C1». Если позже потребуется вернуть прежние обозначения, снимите этот флажок.
Упражнение
Для выполнения упражнения загрузите файл macros1
Упражнение 1. Подсчет с использованием цикла Do…Loop
Цикл Do…Loop будет использован для подсчета количества строк в диапазоне данных.
- Откройте файл практического занятия, выделите код в первом текстовом поле листа (от строки Sub CountRows() до End Sub) и скопируйте его в буфер обмена.Совет. После запуска редактора Visual Basic данные инструкции будут закрыты новым окном. Чтобы инструкции были всегда доступны, напечатайте эту страницу (щелкните правой кнопкой мыши и выберите в контекстном меню команду Печать).В этом фрагменте кода переменной x присваивается номер текущей обрабатываемой строки; x + 1 обозначает следующую строку. Переменной z присваивается текущее число подсчитанных строк, начиная с 0, когда еще ничего не было сосчитано. Цикл обрабатывает поочередно каждую строку, пока не дойдет до пустой строки. При каждом переходе к следующей строке число строк, записанное в переменной z, увеличивается на 1. В итоге подсчитанное количество строк выводится в сообщении; это значение берется из переменной z.Значение z отображается в сообщении в окружении двух текстовых фрагментов. Все это объединяется в одну фразу с помощью знаков &.
- Щелкните вне текстового поля с кодом и выделите ячейку C3 (или, если включен стиль ссылок R1C1, выделите строку 3 и столбец 3).
- Откройте редактор Visual Basic и вставьте новый модуль.Как это сделать? Выделите в меню Сервис пункт Макрос и выберите команду Редактор Visual Basic. В меню редактора Insert выберите команду Module.
- Вставьте код, скопированный на шаге 1, в новый модуль.
- Щелкните в строке Sub CountRows() и нажмите клавишу F5, чтобы выполнить макрос.
- Цикл Do…Loop выполняет необходимые действия, и на экране появляется сообщение о том, что в заданном диапазоне содержится шесть строк.
- Нажмите кнопку ОК, чтобы закрыть окно сообщения, и вернитесь в Excel, выбрав в меню File команду Close and Return to Microsoft Excel.
Примечание. В этом упражнении переменная z хранит текущее число строк, x — текущий номер строки, а y — номер столбца (в данном случае это номер 3, что соответствует столбцу C).
Упражнение 2. Подсчет ячеек с использованием цикла For Each…Next
- Выделите код во втором текстовом поле листа (начиная со строки Sub CountCells() и до End Sub) и скопируйте его в буфер обмена.Подсказка. Чтобы увидеть второе текстовое поле, начинающееся со строки 27, возможно, потребуется прокрутить лист.В этом фрагменте кода переменной z присваивается подсчитанное количество строк, начиная с 0, когда еще ничего не было сосчитано. С помощью этого кода поочередно перебираются все ячейки выделенного диапазона. При каждом переходе к следующей ячейке их общее число, записываемое в переменной z, увеличивается на 1. В итоге подсчитанное количество ячеек выводится в сообщении; это значение берется из переменной z.
- Щелкните вне текстового поля с кодом и выделите диапазон C3:D8, значения от «Светлана» до «Шашков». Если включен стиль ссылок R1C1, выделите фрагмент со строки 3, столбца 3 до строки 8, столбца 4.
- Откройте редактор Visual Basic и вставьте новый модуль.Подсказка. О том, как это сделать, см. в первом упражнении.
- Вставьте код, скопированный на шаге 1, в новый модуль.
- Щелкните в строке Sub CountCells() и нажмите клавишу F5.
- Готово! Появляется сообщение о том, что в выделенном фрагменте содержится 12 ячеек.
- Нажмите кнопку ОК, чтобы закрыть окно сообщения. Закройте редактор Visual Basic и книгу. Будет предложено сохранить книгу; можете сделать это, если хотите вернуться к ней позже.
В ходе следующего практического занятия вы займетесь вложенными циклами. Пока же, если у вас сформировалось общее представление о том, как работают эти макросы циклов, этого более чем достаточно.
Примечание. Если появится сообщение Microsoft Visual Basic «Compile error» (ошибка компиляции), не беспокойтесь. Это просто означает, что код в модуле не в точности совпадает с кодом, который было предложено скопировать и вставить. Удалите код из модуля и скопируйте его туда снова.
Понравился материал? Подпишитесь на обновления сайта.
Мой блог находят по следующим фразам• майкрософт офис 2007 скачать бесплатно• программа для востоновления данных после быстрого форматирование• сайты торренты бесплатные• компьютерные курсы в Москве для пенсионеров• office 2007 rus скачать одним файлом бесплатно• программа для востановления данных после форматирования
***Постовойнедорогой =репетитор= по математике
Возможно, Вас заинтересует также информация по следующим ключевым словам, которую обычно ищут на моем сайте• включение компьютера по сети• скачать microsoft office 2007• программы для ограничения доступа детей в интернет• Скачать програму для ноутбука для электросети• автоматическое включение и выключение компьютера• программы для восстановление флешки после форматирования
Метки:Excel, Excel, Microsoft, Microsoft Office 2007, уроки, урокиExcel, Microsoft, Microsoft Office 2007, уроки
shperk.ru
НЕ ВОЛНУЙТЕСЬ, Я СЕЙЧАС ВСЕ ОБЪЯСНЮ!
03 Ноя 2009
В разделе Excel, уроки
Макросы Microsoft Office Excel — это простые, легко адаптируемые и вместе с тем мощные инструменты, позволяющие пользователю экономить свое время и работать более продуктивно. Циклы, представляющие собой разновидность макросов, особенно полезны при работе с диапазонами данных. Возможно, вы уже что-то слышали о макросах, возможно, даже использовали их в Excel; как бы то ни было, пришла пора познакомиться с ними поближе.
Что такое макросы? Где они хранятся? Зачем они нужны? Очень хорошие вопросы. Макросы Excel — это фрагменты кода, которые хранятся в книге и позволяют автоматизировать некоторые процедуры систематизации данных. Они значительно облегчают работу и потому заслуживают вашего внимания.
В большинстве программ Microsoft Office, включая Excel, в качестве языка программирования макросов используется Visual Basic для приложений (VBA). Возможно, вы уже создавали макросы в Excel, выполняя последовательность каких-либо действий, которые автоматически сохранялись программой. При записи макроса Excel происходит запись кода VBA, описывающего выполняемые действия, в модуль, прикрепленный к книге. Модуль можно рассматривать как контейнер, вмещающий ряд макросов. Для удобства запоминания приводим список определений.
- Макрос: фрагмент кода, выполняющий определенное действие и имеющий уникальное имя.
- VBA: Visual Basic для приложений — язык программирования макросов.
- Модуль: контейнер для хранения макросов, закрепленный за книгой.
Предположим, вы хотите написать макрос. Первое, что необходимо сделать, — это открыть редактор Visual Basic. Выделите в меню Сервис пункт Макрос и выберите команду Редактор Visual Basic. (здесь и далее пункты меню даются по версии Microsoft Office 2003)
Почему это следует сделать в первую очередь? Дело в том, что редактор Visual Basic — это основной инструмент создания и редактирования кода VBA. Впрочем, это ясно из названия.Следующий шаг: прежде чем писать макрос, необходимо решить, где он будет располагаться. Не забыли про модули? Они служат контейнерами для макросов и прикрепляются к книге с помощью объемлющего контейнера, называемого проектом VBA. Для добавления нового модуля в редакторе Visual Basic следует выбрать команду Module в меню Insert (меню редактора, а не электронной таблицы). При этом внутри основного окна редактора Visual Basic откроется пустое окно модуля.
Чтобы написать собственно макрос, введите в окне модуля слово Sub. (Зачем? Неважно — просто таково правило.) Затем через пробел введите имя макроса. Например, если вы ввели Sub MyMacro, это означает, что создан макрос с именем MyMacro. Редактор Visual Basic очень умный: он автоматически вставит вслед за строкой Sub строку, содержащую End Sub, — не правда ли, удобно? Итак, у вас есть начало и конец, осталось лишь написать что-нибудь в промежутке — там, где как раз есть пустое место.
Предположим, вы выполнили все эти действия и создали макрос. Поскольку сейчас между строкой Sub и строкой End Sub ничего нет, этот макрос на самом деле ничего и не будет делать. Чтобы он стал продуктивным, необходимо добавить код. Рассмотрим пример. Допустим, требуется вывести простое сообщение. Между строкой Sub и строкой End Sub введите:
Не подумайте, что в слове MsgBox содержатся опечатки, — это ключевое слово VBA для обозначения окна сообщения. Язык VBA требует скрупулезной точности: необходимо ввести буквально то, что написано выше, и обязательно поставить остальную часть текста этой строки кода в кавычки. Если выполнить этот макрос в Excel, появится окно сообщения, содержащее текст Мой первый макрос и кнопку ОК, которая позволяет закрыть окно. В ходе предстоящего практического занятия вы получите возможность написать и выполнить этот макрос.
Совет
Если вы хотите создать собственный пример кода, удобнее всего сначала записать макрос для требуемого действия. Выделите в меню Сервис пункт Макрос и выберите команду Начать запись. Закончив запись макроса, откройте Редактор Visual Basic и посмотрите, как действует его код. Выделите в меню Сервис пункт Макрос, выберите команду Макросы и найдите записанный макрос. Чтобы просмотреть его код, выделите имя макроса и нажмите кнопку Изменить.
Для дальнейшей работы вам потребуется загрузить файл с упражнением.
Загрузите его по ссылке: macros
На компьютере должен быть установлен Excel 2003
Добавление модуля и составление макроса
Упражнение 1. Добавление модуля
- Сначала необходимо открыть редактор Visual Basic. Выделите в меню Сервис пункт Макрос и выберите команду Редактор Visual Basic.Советы
- Если в меню нет команды Макрос, подождите несколько секунд, и она появится.
- После запуска редактора Visual Basic данные инструкции будут закрыты новым окном. Чтобы инструкции были всегда доступны, напечатайте эту страницу (щелкните правой кнопкой мыши и выберите в контекстном меню команду Печать).Закончив работать в редакторе Visual Basic, вернитесь в Excel, выбрав в меню File команду Close and Return to Microsoft Excel.
- В редакторе Visual Basic откройте меню Insert и выберите команду Module. Появится пустое окно. Тем самым в книгу добавлен модуль.
Примечание. Если после добавления модуля пустое окно не появилось, выберите в меню View редактора Visual Basic команду Code или нажмите клавишу F7.
Упражнение 2. Составление макроса
- Щелкните внутри пустого окна и введите Sub MyMacro. Нажмите клавишу ВВОД.
- При этом автоматически вставится строка End Sub , а после имени макроса добавится пара скобок. Код примет следующий вид:Sub MyMacro()End SubПримечание. Пустые строки в VBA игнорируются. Также игнорируются строки, начинающиеся с апострофа, что позволяет включать в код комментарии, не влияющие на его выполнение. Помимо начального апострофа, комментарии выделяются зеленым цветом букв, так что их легко заметить на фоне обычного кода.
- В пустой строке между строкой Sub MyMacro() и строкой End Sub введите следующий код (в точности так, как он приводится здесь, включая кавычки).MsgBox "Мой первый макрос."
- Щелкните в строке Sub MyMacro() и нажмите клавишу F5.
- Ура! Появляется окно сообщения с текстом Мой первый макрос и кнопкой ОК.
- Закройте окно сообщения, нажав в нем кнопку ОК. Выберите в меню File команду Close and Return to Microsoft Excel, чтобы закрыть редактор Visual Basic, и затем закройте книгу. Будет предложено сохранить книгу; можете сделать это, если хотите вернуться к ней позже.
Продолжение — на следующей странице
Метки:Excel, Excel, Microsoft, Microsoft Office 2007, уроки, урокиExcel, Microsoft, Microsoft Office 2007, уроки
shperk.ru
vba - Глядя на цикл двух макросов VBA вместе в Excel, но я думаю, что просто не хватает чего-то очень маленького
Хорошо, поэтому я вытаскиваю свои волосы, пытаясь понять это правильно, но я чувствую, что ответ должен быть очень простым!
Во-первых, у меня написано два макроса, мы будем называть эти LeftCut и RightCut. Они вырезают ряд из четырех столбцов и вставляют их в другое место на листе. Код VBA для них -
Sub RightCut() ActiveCell.Offset([0], [-1]).Select Range(ActiveCell, ActiveCell.Offset(0, -3)).Cut ActiveCell.Offset([0], [6]).Select Range(ActiveCell, ActiveCell.Offset(0, 3)).Select Selection.Insert Shift:=xlDown ActiveCell.Offset([0], [-6]).Select Range(ActiveCell, ActiveCell.Offset(0, -3)).Select Selection.Delete Shift:=xlUp End Sub Sub LeftCut Range(ActiveCell, ActiveCell.Offset(0, 3)).Cut ActiveCell.Offset([0], [10]).Select Range(ActiveCell, ActiveCell.Offset(0, 3)).Select Selection.Insert Shift:=xlDown ActiveCell.Offset([0], [-10]).Select Range(ActiveCell, ActiveCell.Offset(0, 3)).Select Selection.Delete Shift:=xlUp End SubОба они работают сами по себе. Теперь все, что я хочу сделать, - это объединить их, так что если выполняется определенное условие, скажем, если четыре левых столбца не совпадают с четырьмя правыми столбцами и одна строка должна быть вырезана, тогда один из этих двух макросов называется.
Теперь у меня есть псевдокод, написанный для цикла Do While, но это даже близко к тому, что я ищу? Основная проблема заключается в том, что в некоторых точках рабочего листа до 20 строк нужно вырезать и вставлять, поэтому я хочу, чтобы макросы выше использовались снова и снова, пока ActiveCell = ActiveCell.Offset(0, -1), Возможно ли это с циклом Do While?
Sub HighAce() Dim i As Long Dim ActiveCell As Range i = 2 Application.ScreenUpdating = True Do While i <= 40043 Set ActiveCell = Range("E" & i) If ActiveCell = ActiveCell.Offset([0], [-1]) Then ActiveCell.Offset([1], [0]).Select ElseIf ActiveCell > ActiveCell.Offset([0], [-1]) Then Application.Run "'Methylation Array.xlsm'!NewBlueCut" ElseIf ActiveCell < ActiveCell.Offset([0], [-1]) Then Application.Run "'Methylation Array.xlsm'!NewBlueCut" Else: Stop End If Loop End SubЯ на правильном пути здесь? Есть ли строка, которую я пропускаю?
Я ценю любую помощь, которую любой может предоставить. Я вернусь к этой проблеме позже с новым умом, и я посмотрю, смогу ли я найти решение тоже!
Спасибо!
EDIT: Пример набора данных
x x x A01 A01 x x x
x x x A02 A04 x x x
x x x A06 A05 x x x
x x x A07 A06 x x x
x x x A08 A09 x x x
Итак, если A01 в верхнем правом углу является активной ячейкой, когда ActiveCell = ActiveCell.Offset(0, -1), перейдите в следующую строку. Здесь, поскольку активная ячейка → соседняя ячейка, выполните Leftcut. Теперь Activecell < Смежная ячейка, поэтому выполните RightCut. Еще один дескриптор сделает эти две ячейки равными, поэтому курсор переместится в следующую строку и снова зайдет.
qaru.site
VBA Excel. Цикл Do While... Loop
Цикл Do While... Loop в VBA Excel, его синтаксис и описание отдельных компонентов. Примеры использования цикла Do While... Loop.
Цикл Do While... Loop в VBA Excel предназначен для повторения блока операторов пока выполняется заданное условие (возвращается значение True). Синтаксис этого цикла аналогичен синтаксису цикла Do Until... Loop, который повторяется до тех пор, пока условие не выполняется (возвращается значение False).
- Синтаксис цикла Do While... Loop
- Компоненты цикла Do While... Loop
- Примеры циклов Do While... Loop
Синтаксис цикла Do While... Loop
Синтаксис цикла Do While... Loop существует в двух вариантах, определяющих, когда проверяется условие.
Условие проверяется до выполнения операторов:
Do While condition [ statements ] [ Exit Do ] [ statements ] LoopУсловие проверяется после выполнения операторов:
Do [ statements ] [ Exit Do ] [ statements ] Loop While conditionВ квадратных скобках указаны необязательные атрибуты цикла Do While... Loop.
Компоненты цикла Do While... Loop
Компонент | Описание |
condition | Обязательный атрибут. Условие выполнения цикла. Выражение, возвращающее значение типа Boolean. |
statements | Необязательный* атрибут. Операторы вашего кода. |
Exit Do | Необязательный атрибут. Оператор выхода** из цикла до его окончания. |
*Если не использовать в цикле свой код, смысл применения цикла теряется.
**Очень полезный оператор для цикла Do While... Loop, так как при некоторых обстоятельствах он может стать бесконечным. Если такой риск существует, следует предусмотреть возможность выхода из бесконечного цикла с помощью оператора Exit Do.
Примеры циклов Do While... Loop
Простейшие циклы
Цикл Do While... Loop с условием до исполняемых операторов:
Sub test1() Dim a As Byte Do While a < 10 a = a + 1 Loop MsgBox a End SubЦикл Do While... Loop с условием после исполняемых операторов:
Sub test2() Dim a As Byte Do a = a + 1 Loop While a < 10 MsgBox a End SubВ обоих случаях окно MsgBox выведет число 10. Когда значение переменной a будет равно 10, проверяемое условие выдаст значение False, и цикл будет остановлен.
Проход по строкам листа
У двух белок дупла расположены напротив друг друга. В каждом дупле по 100 шишек. В свободное время они бросают шишки в дупло напротив, попадают не всегда. Ниже, в таблице, указано количество шишек, брошенных каждой белкой, и сколько их попало в цель.
Дни | Игрок | Брошено | Попало в цель |
1 день | Белка 1 | 15 | 6 |
1 день | Белка 2 | 12 | 7 |
2 день | Белка 1 | 14 | 8 |
2 день | Белка 2 | 16 | 7 |
3 день | Белка 1 | 20 | 9 |
3 день | Белка 2 | 14 | 6 |
4 день | Белка 1 | 26 | 10 |
4 день | Белка 2 | 13 | 5 |
5 день | Белка 1 | 17 | 4 |
5 день | Белка 2 | 21 | 7 |
Исходя из этих данных необходимо узнать, сколько шишек осталось у Белки 1 в дупле. Для этого необходимо вычесть из 100 шишек количество выброшенных Белкой 1 и прибавить шишки, заброшенные в ее дупло Белкой 2. Вычисления начинаем со второй строки (в первой заголовки) и в условии для цикла Do While... Loop указываем «первая ячейка текущей строки не является пустой». Таблица должна начинаться с первой ячейки рабочего листа «A1», и под ней, как минимум, одна строка должна быть пустой, точнее, первая ячейка этой строки.
Sub test3() Dim i As Long, n As Long i = 2 n = 100 Do While Cells(i, 1) <> "" If Cells(i, 2) = "Белка 1" Then n = n - Cells(i, 3) Else n = n + Cells(i, 4) End If i = i + 1 Loop MsgBox n End SubРезультат, выведенный в информационном сообщении, будет равен 40. Вы можете скопировать таблицу на свой лист книги Excel и поэкспериментировать с кодом.
Бесконечный цикл и Exit Do
Пример бесконечного цикла:
Sub test4() Dim a As Byte Do While a < 10 a = a + 1 If a = 9 Then a = 0 End If Loop End SubПри запуске этой процедуры цикл Do While... Loop начинает выполняться бесконечно. Мне приходилось останавливать бесконечные циклы в Excel 2000 и Excel 2016. В Excel 2000 помогло сочетание клавиш Ctrl+Break, а в Excel 2016 при закрытии редактора VBA крестиком появляется окно:
Информационное окно «Microsoft Excel не отвечает»Ожидать отклика программы нет смысла, поэтому нажимаем «Перезапустить программу» или «Закрыть программу».
Совет: перед запуском процедуры с циклом Do While... Loop, который может стать бесконечным, обязательно сохраните книгу, иначе, при принудительном закрытии редактора VBA ваши изменения будут утеряны. Кроме того, при принудительном закрытии редактора VBA, Excel может отключить макросы. Включите их в окне «Центр управления безопасностью», открыть которое можно по ссылке «Безопасность макросов» на ленте в разделе «Разработчик». Подробнее о включении макросов в разных версиях Excel читайте в статье: Как разрешить выполнение макросов в Excel?.
Пример использования оператора Exit Do:
Sub test5() Dim a As Byte, n As Long Do While a < 10 a = a + 1 n = n + 1 If a = 9 Then a = 0 End If If n = 1000 Then Exit Do End If Loop MsgBox n End SubКогда число итераций цикла дойдет до 1000, он будет завершен, и информационное сообщение MsgBox выведет на экран число повторений цикла Do While... Loop из этого примера.
vremya-ne-zhdet.ru
Глядя на цикл двух макросов VBA вместе в Excel, но я думаю, что я просто пропустил что-то очень маленькое
ОК, так что я вытягивал свои волосы, пытаясь понять это правильно, но я чувствую, что ответ должен быть очень просто!
Во-первых, у меня есть два макроса, которые мы будем называть этими LeftCut и RightCut. Они вырезают ряд из четырех столбцов и вставляют их в другое место на листе. Код VBA для них:
Sub RightCut() ActiveCell.Offset([0], [-1]).Select Range(ActiveCell, ActiveCell.Offset(0, -3)).Cut ActiveCell.Offset([0], [6]).Select Range(ActiveCell, ActiveCell.Offset(0, 3)).Select Selection.Insert Shift:=xlDown ActiveCell.Offset([0], [-6]).Select Range(ActiveCell, ActiveCell.Offset(0, -3)).Select Selection.Delete Shift:=xlUp End Sub Sub LeftCut Range(ActiveCell, ActiveCell.Offset(0, 3)).Cut ActiveCell.Offset([0], [10]).Select Range(ActiveCell, ActiveCell.Offset(0, 3)).Select Selection.Insert Shift:=xlDown ActiveCell.Offset([0], [-10]).Select Range(ActiveCell, ActiveCell.Offset(0, 3)).Select Selection.Delete Shift:=xlUp End SubОбе эти работы сами по себе. Теперь все, что я хочу сделать, - это объединить их, так что если выполняется определенное условие, скажем, если четыре левых столбца не совпадают с четырьмя правыми столбцами и одна строка должна быть вырезана, тогда один из этих двух макросов называется.
Теперь у меня есть псевдокод, написанный для цикла Do While, но это даже близко к тому, что я ищу? Основная проблема заключается в том, что в некоторых точках рабочего листа до 20 строк нужно вырезать и вставлять, поэтому я хочу, чтобы макросы выше использовались снова и снова, пока ActiveCell = ActiveCell.Offset (0, -1) , Возможно ли это с помощью цикла While While?
Sub HighAce() Dim i As Long Dim ActiveCell As Range i = 2 Application.ScreenUpdating = True Do While i <= 40043 Set ActiveCell = Range("E" & i) If ActiveCell = ActiveCell.Offset([0], [-1]) Then ActiveCell.Offset([1], [0]).Select ElseIf ActiveCell > ActiveCell.Offset([0], [-1]) Then Application.Run "'Methylation Array.xlsm'!NewBlueCut" ElseIf ActiveCell < ActiveCell.Offset([0], [-1]) Then Application.Run "'Methylation Array.xlsm'!NewBlueCut" Else: Stop End If Loop End SubЯ нахожусь на правильном пути здесь? Есть ли строка, которую я пропускаю?
Я ценю любую помощь, которую любой может предоставить. Я вернусь к этой проблеме позже с новым умом, и я посмотрю, смогу ли я найти решение тоже!
Спасибо!
EDIT: Образец набора данных
ххх A01 A01 ххх
ххх A02 A04 ххх
ххх A06 A05 ххх
ххх A07 A06 ххх
ххх A08 A09 ххх
Итак, если A01 сверху right - активная ячейка, когда ActiveCell = ActiveCell.Offset (0, -1) переместится в следующую строку. Здесь, поскольку активная ячейка -> соседняя ячейка, выполните Leftcut. Теперь, Activecell < Смежная ячейка, так что выполните RightCut. Еще один дескриптор сделает эти две ячейки равными, поэтому курсор переместится в следующую строку и снова зайдет.
stackoverrun.com
Итерации. Реализация циклов в Excel без использования макросов
Пару недель назад передо мной встала проблема разработки электронной таблицы, просчитывающую диапазоны рабочего времени в зависимости от рабочего графика и производственного календаря. С первого взгляда задача нетрудная, но в ходе проектирования я понял, что избежать использования циклов не удастся. Особую специфику здесь придавало условие заказчика, что готовый продукт должен быть именно Excel таблицей БЕЗ макросов и дополнительных модулей (функций пользователя).Стандартный набор функций Excel не поддерживает ничего похожего на циклы, однако выход нашелся – использование циклических ссылок и итераций.
Первый шаг, чтобы начать работать с циклическими ссылками – это разрешить итеративные вычисления в Excel. В версии Microsoft Office XP это делается в разделе меню «Сервис – Параметры»:
В открывшемся окне активируем соответствующий флажок:
Так же обратите внимание на поле «Предельное число итераций» - оно определяет, сколько раз будет проходить вычисление по всем циклическим ссылкам, если вы сами не поставите ограничение.
!Информация: В Excel 2007 включение итеративных вычислений производится в пункте меню «Файл – Параметры Excel» в разделе «Формулы».
Рассмотрим пример использования итеративных вычислений в виде цикла.
Впишите в ячейку А1 формулу:
Если значение предельного числа итераций равно 100, то результатом вычислений в ячейке А1 будет равно 100. Теперь изменим формулу:
Как видите число итераций мы ограничили числом в ячейке А2, а именно 10. Чтобы проиллюстрировать, как происходят итерации, добавим формулу в ячейку B2:
Как видите, каждый этап итерации (новое значение А1) добавляется к ячейке B1 до тех пор пока происходят итерации.
!Замечание: Возможно, результат в B2 будет не таким – для того, чтобы исправить это сделайте следующее: после ввода формулы в ячейку B1 перейдите в ячейку A1, установите курсор в поле редактирования формулы и нажмите Enter – произойдет пересчет итераций. Для корректной работы итераций необходимо задать ряд дополнительных условий, ограничивающих их количество и задающее условие сброса текущего значения поля в исходное значение. Пересчет всех ячеек с циклическими ссылками происходит каждый раз при изменении ячеек, от которых они зависят.
!Дополнительные ссылки:
www.script-omen.com