Skip to content
Как сделать перебор диапазона ячеек
На чтение 2 мин. Просмотров 14.1k.
Что делает макрос: Этот базовый макрос показывает вам простой способ сделать перебор диапазона ячеек по одной и выполнить какое-либо действие.
Содержание
- Как макрос работает
- Код макроса
- Как этот код работает
- Как использовать
Как макрос работает
В этом макросе используются две переменные объекта Range. Одна из переменных отражает объем данных, с которым мы работаем, в то время как другая используется для хранения каждой отдельной клетки в диапазоне. Потом мы используем оператор For Each, чтобы активировать или принести каждую ячейку в фокусе целевого диапазона.
Код макроса
Sub PereborDiapazonaYacheek() 'Шаг 1: Объявить переменные Dim MyRange As Range Dim MyCell As Range 'Шаг 2: Определение целевого диапазона. Set MyRange = Range("D6:D17") 'Шаг 3: Запуск цикла через диапазон. For Each MyCell In MyRange 'Шаг 4: Какое-либо действие с каждой ячейкой. If MyCell.Value > 3000 Then MyCell.Font.Bold = True End If 'Шаг 5: Перейти к следующей ячейке в диапазоне Next MyCell End Sub
Как этот код работает
- Макрос объявляет две переменные объекта Range. Одна из них, называется MyRange, держит весь целевой диапазон. Другая, называемый MyCell, держит каждую ячейку в диапазоне, так как макрос проводит цикл через них один за другим.
- На шаге 2 мы заполняем переменную MyRange с целевым диапазоном. В этом примере мы используем Range («D6:D17»). Если ваш целевой диапазон является именованным, можно просто ввести его название — Range («MyNamedRange»).
- На этом этапе макрос начинает цикл через каждую ячейку в целевом диапазоне, активизируя ее.
- После того, как ячейка активируется, можно с ней что-то сделать. Это «что-то» на самом деле зависит от поставленной задачи. Вы можете удалять строки, когда активная ячейка имеет определенное значение, или вы можете вставить строку между каждой активной ячейки. В этом примере макрос меняется шрифт полужирный для любого элемента, который имеет значение больше, чем 3000.
- На шаге 5, макрос возвращается назад, чтобы получить следующую ячейку. После активации всех ячеек в целевом диапазоне, макрос заканчивает работу.
Как использовать
Для реализации этого макроса, вы можете скопировать и вставить его в стандартный модуль:
- Активируйте редактор Visual Basic, нажав ALT + F11 на клавиатуре.
- Щелкните правой кнопкой мыши имя проекта / рабочей книги в окне проекта.
- Выберите Insert➜Module.
- Введите или вставьте код.
Содержание
- Как сделать перебор диапазона ячеек
- Как макрос работает
- Код макроса
- Как этот код работает
- Как использовать
- Excel функция перебора значений
- Excel функция перебора значений
- Использование операторов For Each. Next
- Проход по диапазону ячеек
- Выход из цикла For Each. Next до его завершения
- Использование цикла For Each. Next для итерации в классе VBA
- См. также
- Поддержка и обратная связь
Как сделать перебор диапазона ячеек
Что делает макрос: Этот базовый макрос показывает вам простой способ сделать перебор диапазона ячеек по одной и выполнить какое-либо действие.
Как макрос работает
В этом макросе используются две переменные объекта Range. Одна из переменных отражает объем данных, с которым мы работаем, в то время как другая используется для хранения каждой отдельной клетки в диапазоне. Потом мы используем оператор For Each, чтобы активировать или принести каждую ячейку в фокусе целевого диапазона.
Код макроса
Как этот код работает
- Макрос объявляет две переменные объекта Range. Одна из них, называется MyRange, держит весь целевой диапазон. Другая, называемый MyCell, держит каждую ячейку в диапазоне, так как макрос проводит цикл через них один за другим.
- На шаге 2 мы заполняем переменную MyRange с целевым диапазоном. В этом примере мы используем Range («D6:D17»). Если ваш целевой диапазон является именованным, можно просто ввести его название — Range («MyNamedRange»).
- На этом этапе макрос начинает цикл через каждую ячейку в целевом диапазоне, активизируя ее.
- После того, как ячейка активируется, можно с ней что-то сделать. Это «что-то» на самом деле зависит от поставленной задачи. Вы можете удалять строки, когда активная ячейка имеет определенное значение, или вы можете вставить строку между каждой активной ячейки. В этом примере макрос меняется шрифт полужирный для любого элемента, который имеет значение больше, чем 3000.
- На шаге 5, макрос возвращается назад, чтобы получить следующую ячейку. После активации всех ячеек в целевом диапазоне, макрос заканчивает работу.
Как использовать
Для реализации этого макроса, вы можете скопировать и вставить его в стандартный модуль:
- Активируйте редактор Visual Basic, нажав ALT + F11 на клавиатуре.
- Щелкните правой кнопкой мыши имя проекта / рабочей книги в окне проекта.
- Выберите Insert➜Module.
- Введите или вставьте код.
Источник
Excel функция перебора значений
«=ЕСЛИ(R16=0;R6;ЕСЛИ(R6=0;R7;ЕСЛИ(R7=0;R8;R16)))» — сама формула
Задумка такова. Ячейка R16 пустая, R6-R8 с данными. Необходимо чтоб в столбце D, в любой ячейке отображалась ячейка R16, но только в том случае если в ней есть запись. В противном случае отображается R6. Если и в R6 нет записи, то R7 и так далее.
На данный момент отображается только ячейка R6, если её сделать пустой, то R7 не отобразится.
Моя формула располагается только в ячейке D11, в прилагаемом файле.
Делаю график дежурств, чтоб он автоматически расставлял от 3-х до 6-ти фамилий по всему месяцу в определённом порядке.
«=ЕСЛИ(R16=0;R6;ЕСЛИ(R6=0;R7;ЕСЛИ(R7=0;R8;R16)))» — сама формула
Задумка такова. Ячейка R16 пустая, R6-R8 с данными. Необходимо чтоб в столбце D, в любой ячейке отображалась ячейка R16, но только в том случае если в ней есть запись. В противном случае отображается R6. Если и в R6 нет записи, то R7 и так далее.
На данный момент отображается только ячейка R6, если её сделать пустой, то R7 не отобразится.
Моя формула располагается только в ячейке D11, в прилагаемом файле.
Делаю график дежурств, чтоб он автоматически расставлял от 3-х до 6-ти фамилий по всему месяцу в определённом порядке. dog144
Сообщение «=ЕСЛИ(R16=0;R6;ЕСЛИ(R6=0;R7;ЕСЛИ(R7=0;R8;R16)))» — сама формула
Задумка такова. Ячейка R16 пустая, R6-R8 с данными. Необходимо чтоб в столбце D, в любой ячейке отображалась ячейка R16, но только в том случае если в ней есть запись. В противном случае отображается R6. Если и в R6 нет записи, то R7 и так далее.
На данный момент отображается только ячейка R6, если её сделать пустой, то R7 не отобразится.
Моя формула располагается только в ячейке D11, в прилагаемом файле.
Делаю график дежурств, чтоб он автоматически расставлял от 3-х до 6-ти фамилий по всему месяцу в определённом порядке. Автор — dog144
Дата добавления — 14.09.2014 в 18:08
Источник
Excel функция перебора значений
Добрый день ! Подскажите если знаете. )
Как сделать в excel перебор чисел с определенным шагом. Скажем хочу задать excel найти из диапазона цифр (от 587,01 до 591,99 с шагом 0,01) число при умножении которого на число из диапазона (от 3170,01 до 3200,99 с шагом 0,01) получим результат 1886000. Важно что бы все числа были точными до сотых без применения округлений. Т.е числа в которых после запятой встречаются цифры дальше сотых неприемлемы но и округления применять нельзя.
Заранее благодарен за ответ !
Добрый день ! Подскажите если знаете. )
Как сделать в excel перебор чисел с определенным шагом. Скажем хочу задать excel найти из диапазона цифр (от 587,01 до 591,99 с шагом 0,01) число при умножении которого на число из диапазона (от 3170,01 до 3200,99 с шагом 0,01) получим результат 1886000. Важно что бы все числа были точными до сотых без применения округлений. Т.е числа в которых после запятой встречаются цифры дальше сотых неприемлемы но и округления применять нельзя.
Заранее благодарен за ответ ! Rafting
Сообщение Добрый день ! Подскажите если знаете. )
Как сделать в excel перебор чисел с определенным шагом. Скажем хочу задать excel найти из диапазона цифр (от 587,01 до 591,99 с шагом 0,01) число при умножении которого на число из диапазона (от 3170,01 до 3200,99 с шагом 0,01) получим результат 1886000. Важно что бы все числа были точными до сотых без применения округлений. Т.е числа в которых после запятой встречаются цифры дальше сотых неприемлемы но и округления применять нельзя.
Заранее благодарен за ответ ! Автор — Rafting
Дата добавления — 10.04.2017 в 15:08
sboy | Дата: Понедельник, 10.04.2017, 15:52 | Сообщение № 2 | ||||||||||||||||||||||||||||||||||
|
Содержание
- 1 Оператор цикла «For» в Visual Basic
- 1.1 Цикл «For … Next»
- 1.2 Цикл «For Each»
- 1.3 Оператор прерывания цикла «Exit For»
- 2 Цикл «Do While» в Visual Basic
- 3 Цикл «Do Until» в Visual Basic
Пару недель назад передо мной встала проблема разработки электронной таблицы, просчитывающую диапазоны рабочего времени в зависимости от рабочего графика и производственного календаря. С первого взгляда задача нетрудная, но в ходе проектирования я понял, что избежать использования циклов не удастся. Особую специфику здесь придавало условие заказчика, что готовый продукт должен быть именно
Excel
таблицей БЕЗ макросов и дополнительных модулей (функций пользователя).
Стандартный набор функций Excel не поддерживает ничего похожего на циклы, однако выход нашелся – использование циклических ссылок и итераций.
Первый шаг, чтобы начать работать с циклическими ссылками – это разрешить итеративные вычисления в Excel. В версии Microsoft Office XP это делается в разделе меню «Сервис – Параметры»:
В открывшемся окне активируем соответствующий флажок:
Так же обратите внимание на поле «Предельное число итераций» — оно определяет, сколько раз будет проходить вычисление по всем циклическим ссылкам, если вы сами не поставите ограничение.
!Информация: В Excel 2007 включение итеративных вычислений производится в пункте меню «Файл – Параметры Excel» в разделе «Формулы».
Рассмотрим пример использования итеративных вычислений в виде цикла.
Впишите в ячейку А1 формулу:
Если значение предельного числа итераций равно 100, то результатом вычислений в ячейке А1 будет равно 100. Теперь изменим формулу:
Как видите число итераций мы ограничили числом в ячейке А2, а именно 10. Чтобы проиллюстрировать, как происходят итерации, добавим формулу в ячейку B2:
Как видите, каждый этап итерации (новое значение А1) добавляется к ячейке B1 до тех пор пока происходят итерации.
!Замечание: Возможно, результат в B2 будет не таким – для того, чтобы исправить это сделайте следующее: после ввода формулы в ячейку B1 перейдите в ячейку A1, установите курсор в поле редактирования формулы и нажмите Enter – произойдет пересчет итераций. Для корректной работы итераций необходимо задать ряд дополнительных условий, ограничивающих их количество и задающее условие сброса текущего значения поля в исходное значение. Пересчет всех ячеек с циклическими ссылками происходит каждый раз при изменении ячеек, от которых они зависят.
!Дополнительные ссылки:
Встречаются ситуации, когда от программы VBA требуется совершить несколько раз подряд один и тот же набор действий (то есть повторить несколько раз один и тот же блок кода). Это может быть сделано при помощи циклов VBA.
К циклам VBA относятся:
- Цикл For
- Цикл Do While
- Цикл Do Until
Далее мы подробно рассмотрим каждый из этих циклов.
Оператор цикла «For» в Visual Basic
Структура оператора цикла For в Visual Basic может быть организована в одной из двух форм: как цикл For … Next или как цикл For Each.
Цикл «For … Next»
Цикл For … Next использует переменную, которая последовательно принимает значения из заданного диапазона. С каждой сменой значения переменной выполняются действия, заключённые в теле цикла. Это легко понять из простого примера:
For i = 1 To 10 Total = Total + iArray(i) Next i
В этом простом цикле For … Next используется переменная i, которая последовательно принимает значения 1, 2, 3, … 10, и для каждого из этих значений выполняется код VBA, находящийся внутри цикла. Таким образом, данный цикл суммирует элементы массива iArray в переменной Total.
В приведённом выше примере шаг приращения цикла не указан, поэтому для пошагового увеличения переменной i от 1 до 10 по умолчанию используется приращение . Однако, в некоторых случаях требуется использовать другие значения приращения для цикла. Это можно сделать при помощи ключевого слова Step, как показано в следующем простом примере.
For d = 0 To 10 Step 0.1 dTotal = dTotal + d Next d
Так как в приведённом выше примере задан шаг приращения равный 0.1, то переменная dTotal для каждого повторения цикла принимает значения 0.0, 0.1, 0.2, 0.3, … 9.9, 10.0.
Для определения шага цикла в VBA можно использовать отрицательную величину, например, вот так:
For i = 10 To 1 Step -1 iArray(i) = i Next i
Здесь шаг приращения равен -1, поэтому переменная i с каждым повторением цикла принимает значения 10, 9, 8, … 1.
Цикл «For Each»
Цикл For Each похож на цикл For … Next, но вместо того, чтобы перебирать последовательность значений для переменной-счётчика, цикл For Each выполняет набор действий для каждого объекта из указанной группы объектов. В следующем примере при помощи цикла For Each выполняется перечисление всех листов в текущей рабочей книге Excel:
Dim wSheet As Worksheet For Each wSheet in Worksheets MsgBox "Найден лист: " & wSheet.Name Next wSheet
Оператор прерывания цикла «Exit For»
Оператор Exit For применяется для прерывания цикла. Как только в коде встречается этот оператор, программа завершает выполнение цикла и переходит к выполнению операторов, находящихся в коде сразу после данного цикла. Это можно использовать, например, для поиска определённого значения в массиве. Для этого при помощи цикла просматривается каждый элемент массива. Как только искомый элемент найден, просматривать остальные нет необходимости – цикл прерывается.
Применение оператора Exit For продемонстрировано в следующем примере. Здесь цикл перебирает 100 записей массива и сравнивает каждую со значением переменной dVal. Если совпадение найдено, то цикл прерывается:
For i = 1 To 100 If dValues(i) = dVal Then IndexVal = i Exit For End If Next i
Цикл «Do While» в Visual Basic
Цикл Do While выполняет блок кода до тех пор, пока выполняется заданное условие. Далее приведён пример процедуры Sub, в которой при помощи цикла Do While выводятся последовательно числа Фибоначчи не превышающие 1000:
'Процедура Sub выводит числа Фибоначчи, не превышающие 1000 Sub Fibonacci() Dim i As Integer 'счётчик для обозначения позиции элемента в последовательности Dim iFib As Integer 'хранит текущее значение последовательности Dim iFib_Next As Integer 'хранит следующее значение последовательности Dim iStep As Integer 'хранит размер следующего приращения 'инициализируем переменные i и iFib_Next i = 1 iFib_Next = 0 'цикл Do While будет выполняться до тех пор, пока значение 'текущего числа Фибоначчи не превысит 1000 Do While iFib_Next < 1000 If i = 1 Then 'особый случай для первого элемента последовательности iStep = 1 iFib = 0 Else 'сохраняем размер следующего приращения перед тем, как перезаписать 'текущее значение последовательности iStep = iFib iFib = iFib_Next End If 'выводим текущее число Фибоначчи в столбце A активного рабочего листа 'в строке с индексом i Cells(i, 1).Value = iFib 'вычисляем следующее число Фибоначчи и увеличиваем индекс позиции элемента на 1 iFib_Next = iFib + iStep i = i + 1 Loop End Sub
В приведённом примере условие iFib_Next < 1000 проверяется в начале цикла. Поэтому если бы первое значение iFib_Next было бы больше 1000, то цикл бы не выполнялся ни разу.
Другой способ реализовать цикл Do While – поместить условие не в начале, а в конце цикла. В этом случае цикл будет выполнен хотя бы раз, не зависимо от того, выполняется ли условие.
Схематично такой цикл Do While с проверяемым условием в конце будет выглядеть вот так:
Do ... Loop While iFib_Next < 1000
Цикл «Do Until» в Visual Basic
Цикл Do Until очень похож на цикл Do While: блок кода в теле цикла выполняется раз за разом до тех пор, пока заданное условие выполняется (результат условного выражения равен True). В следующей процедуре Sub при помощи цикла Do Until извлекаются значения из всех ячеек столбца A рабочего листа до тех пор, пока в столбце не встретится пустая ячейка:
iRow = 1 Do Until IsEmpty(Cells(iRow, 1)) 'Значение текущей ячейки сохраняется в массиве dCellValues dCellValues(iRow) = Cells(iRow, 1).Value iRow = iRow + 1 Loop
В приведённом выше примере условие IsEmpty(Cells(iRow, 1)) находится в начале конструкции Do Until, следовательно цикл будет выполнен хотя бы один раз, если первая взятая ячейка не пуста.
Однако, как было показано в примерах цикла Do While, в некоторых ситуациях нужно, чтобы цикл был выполнен хотя бы один раз, не зависимо от первоначального результата условного выражения. В таком случае условное выражение нужно поместить в конце цикла, вот так:
Do ... Loop Until IsEmpty(Cells(iRow, 1))
Урок подготовлен для Вас командой сайта office-guru.ru
Источник: /> Перевел: Антон Андронов
Правила перепечаткиЕще больше уроков по Microsoft Excel
Оцените качество статьи. Нам важно ваше мнение:
Добрый день!
Неделю пытаюсь разобраться с макросами в Excel — выходит признаюсь честно плохо…
Решение задачи так и не нашла. Надеюсь вы сумеете мне подсказать куда конкретнее направить свою активность.
Задача передо мной стоит такая:
ячейка A1 содержит значение, которое я с помощью формул разбиваю на диапазон ячеек (задействовано 276 ячеек) целыми числами. Но при разбивке образуется дельта округления. Так вот мне необходимо эту дельту целыми числами доразнести в уже заполненные формулами ячейки например по порядку.
Например если дельта = 117, а диапазон 276, то в первые 117 ячеек прибавляем по 1, а остальные не трогаем.
Подскажите, пожалуйста, возможно ли вообще это описать для Excel?
Кэтти-бри Пользователь Сообщений: 16 |
Добрый вечер, уважаемые гуру Excel. Учусь работать в Экселе, изучая разные задачки. Столкнулась вот с одной запаркой, может кто поможет: Итак, есть две колонки. Например Вопрос. Задать формулами в колонки C и D алгоритм, чтобы перебирались все возможные сочетания (при этом не повторяясь) Изменено: Кэтти-бри — 28.02.2017 16:59:42 |
Кэтти-бри Пользователь Сообщений: 16 |
Догадываюсь, что надо использовать формулу массива, но что-то не получается — видимо навыка не хватает, и где-то ошибаюсь. |
Кэтти-бри Пользователь Сообщений: 16 |
Вот перечитывала, поняла, что неверно сформулировала задачу. Значения должны переноситься не в одну колонку, а в две, т.е. перебор девяти значений как в примере должен происходить в колонках C и D соответственно. т.е. — первые три в C — Вася-Вася-Вася, а в D соответствующие им разные фамилии. |
Ігор Гончаренко Пользователь Сообщений: 13746 |
#4 28.02.2017 17:06:22
обошлось обычным ИНДЕКС, без формул массива Прикрепленные файлы
Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете! |
||
Кэтти-бри Пользователь Сообщений: 16 |
спасибо, всё работает! Вопрос: можно ли быстро переделать так, чтобы результат всё-таки попадал в два разных столбца, потому что при попадании в один возникнут проблемы с дальнейшей работой с данными. Плюс при растягивании формула ведёт себя не очень корректно, продолжаясь с бесконечно повторяющимися фамилиями. |
Ігор Гончаренко Пользователь Сообщений: 13746 |
#6 28.02.2017 17:23:46 в формуле явно видно один ИНДЕКС для имени а второй — для фамилии
формула ведет себя так, как в ней написано Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете! |
||
Кэтти-бри Пользователь Сообщений: 16 |
#7 28.02.2017 17:27:24
Уже сделала всё, спасибо большое за помощь. Я просто сказала что должно быть в идеале, вдруг вы любите всё делать идеально. Без Вашей подсказки не справилась бы. |
||
Кэтти-бри Пользователь Сообщений: 16 |
Кстати, проблема всё равно не решена, потому в решении, предложенном пользователем Ігор Гончаренко , при повторяющихся значениях в итоговую таблицу может несколько раз попасть одно и то же. |
а если исключить ввод «кривых» значений в данные? Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете! |
|
Кэтти-бри Пользователь Сообщений: 16 |
#10 28.02.2017 17:56:34
Так вопрос не в «кривых» значениях. Допустим, в этих же колонках например не имя и фамилия, а фамилия и наименование товара. Ну, что продал. Ну скажем: |
||
_Igor_61 Пользователь Сообщений: 3007 |
Здравствуйте! А файл с примером исходных данных никак нельзя показать? Что-то мне подсказывает, что тут дело в изначальной организации данных, а не в необходимости создания формул, которыми сначала нужно наплодить множество комбинаций, а потом из них убирать совпадения. Сделал вариант на основе файла от Ігор Гончаренко, проверяйте. Изменено: _Igor_61 — 28.02.2017 22:57:01 |
Кэтти-бри Пользователь Сообщений: 16 |
Добрый день, _Igor_61 ! Извините, что долго не отвечала, сейчас прикреплю вариант исходника, основанный на вашем же примере. Ваш вариант куда ближе к правде, но он некорректно работает, когда количество заполненных строк и столбцов неодинаково. Я чуть поменяла исходные данные, вот что получилось. |
Юрий М Модератор Сообщений: 60585 Контакты см. в профиле |
Файлы удалил: превышен максимально допустимый размер. |
_Igor_61 Пользователь Сообщений: 3007 |
Уфф… Чем дальше в лес… Кэтти-бри, а Вы не могли бы сформулировать итоговую задачу — что в итоге должно получиться? Нужно посчитать кол-во звонков по каждому сотруднику по каждому направлению, или общее время звонков по каждому сотруднику или что-то еще? Понимаю, что Вам наверное интересно сделать перебор формулой, но тот ли это способ для решения задачи? |
Кэтти-бри Пользователь Сообщений: 16 |
_Igor_61
, если вы успели скачать удалённый администрацией файл, то должно получиться следующее: |
Кэтти-бри Пользователь Сообщений: 16 |
_Igor_61
Ну т.е. исходя из вашей формулировки — по общее время звонка по каждому сотруднику по каждому направлению. |
_Igor_61 Пользователь Сообщений: 3007 |
|
Кэтти-бри Пользователь Сообщений: 16 |
Фантастика. Всё правильно, всё работает. Огромное спасибо. Пошла разбираться как Вы этого добились. |
_Igor_61 Пользователь Сообщений: 3007 |
|
Андрей VG Пользователь Сообщений: 11878 Excel 2016, 365 |
#20 01.03.2017 15:04:25 Доброе время суток.
Кэтти хочет Прикрепленные файлы
Изменено: Андрей VG — 01.03.2017 15:09:38 |
Всем привет! Такой вопрос:
Нужно перебирать значения ячеек от A2 до A1000 сравнивая их с ячейкой B3, пока они совпадают — выдавать результат, как только совпадение прекратилось, останавливать перебор.
Подробно:
Есть 2 вкладки — Работа и ЗП. Во вкладе ‘Работа’ ячейки с датами и именами промоутеров:
Во вкладке ‘ЗП’ список с именами промоутеров:
Мне нужно чтоб при выборе даты (ячейка «B3») во вкладке ‘ЗП’, список ‘Промик’ заполнялся сам. Тоесть, если я выбираю дату 19.04.22, нужно чтоб формула начинала перебор всех дат во вкладе ‘Работа’, и все промоутеры которые выходили в этот день отображались в списке промоутеров во вкладке «ЗП» (в моем случае, имена — Данил (1030), Даниил, Саша).
Надеюсь понятно объяснил
Буду очень благодарен, если кто-то поможет разобраться с этим.