Excel перебор ячеек цикл

Skip to content

Как сделать перебор диапазона ячеек

На чтение 2 мин. Просмотров 14.1k.

Что делает макрос: Этот базовый макрос показывает вам простой способ сделать перебор диапазона ячеек по одной и выполнить какое-либо действие.

Содержание

  1. Как макрос работает
  2. Код макроса
  3. Как этот код работает
  4. Как использовать

Как макрос работает

В этом макросе используются две переменные объекта 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

Как этот код работает

  1. Макрос объявляет две переменные объекта Range. Одна из них, называется MyRange, держит весь целевой диапазон. Другая, называемый MyCell, держит каждую ячейку в диапазоне, так как макрос проводит цикл через них один за другим.
  2. На шаге 2 мы заполняем переменную MyRange с целевым диапазоном. В этом примере мы используем Range («D6:D17»). Если ваш целевой диапазон является именованным, можно просто ввести его название — Range («MyNamedRange»).
  3. На этом этапе макрос начинает цикл через каждую ячейку в целевом диапазоне, активизируя ее.
  4. После того, как ячейка активируется, можно с ней что-то сделать. Это «что-то» на самом деле зависит от поставленной задачи. Вы можете удалять строки, когда активная ячейка имеет определенное значение, или вы можете вставить строку между каждой активной ячейки. В этом примере макрос меняется шрифт полужирный для любого элемента, который имеет значение больше, чем 3000.
  5. На шаге 5, макрос возвращается назад, чтобы получить следующую ячейку. После активации всех ячеек в целевом диапазоне, макрос заканчивает работу.

Как использовать

Для реализации этого макроса, вы можете скопировать и вставить его в стандартный модуль:

  1. Активируйте редактор Visual Basic, нажав ALT + F11 на клавиатуре.
  2. Щелкните правой кнопкой мыши имя проекта / рабочей книги в окне проекта.
  3. Выберите Insert➜Module.
  4. Введите или вставьте код.

О чём пойдёт речь?

Знакомство с объектной моделью Excel следует начинать с такого замечательного объекта, как Range. Поскольку любая ячейка — это Range, то без знания, как с этим объектом эффективно взаимодействовать, вам будет затруднительно программировать для Excel. Это очень ладно-скроенный объект. При некоторой сноровке вы найдёте его весьма удобным в эксплуатации.

Что такое объекты?

Мы собираемся изучать объект Range, поэтому пару слов надо сказать, что такое, собственно, «объект«. Всё, что вы наблюдаете в Excel, всё с чем вы работаете — это набор объектов. Например, лист рабочей книги Excel — не что иное, как объект типа WorkSheet. Однотипные объекты объединяют в коллекции себе подобных. Например, листы объединены в коллекцию Sheets. Чтобы не путать друг с другом объекты одного и того же типа, они имеют отличающиеся имена, а также номер индекса в коллекции. Объекты имеют свойства, методы и события.

Свойства — это информация об объекте. Часто эти свойства можно менять, что автоматически влечет изменения внешнего вида объекта или его поведения. Например свойство Visible объекта Worksheet отвечает за видимость листа на экране. Если ему присвоить значение xlSheetHidden (это константа, которая по факту равно нулю), то лист будет скрыт.

Методы — это то, что объект может делать. Например, метод Delete объекта Worksheet удаляет себя из книги. Метод Select делает лист активным.

События — это механизм, при помощи которого вы можете исполнять свой код VBA сразу по факту возникновения того или иного события с вашим объектом. Например, есть возможность выполнять ваш код, как только пользователь сделал текущим определенный лист рабочей книги, либо как только пользователь что-то изменил на этом листе.

Range это диапазон ячеек. Минимум — одна ячейка, максимум — весь лист, теоретически насчитывающий более 17 миллиардов ячеек (строки 2^20 * столбцы 2^14 = 2^34).
В Excel объявлены глобально и всегда готовы к использованию несколько коллекций, имеющий членами объекты типа Range, либо свойства это же типа.
Коллекции глобального объекта Application: Cells, Columns, Rows, а также свойства Range, Selection, ActiveCell, ThisCell.
ActiveCell — активная ячейка текущего листа, ThisCell — если вы написали пользовательскую функцию рабочего листа, то через это свойство вы можете определить какая конкретно ячейка в данный момент пересчитывает вашу функцию. Об остальных перечисленных объектов речь пойдёт ниже.

Работа с отдельными ячейками

Синтаксическая форма Комментарии по использованию
RangeD5«) или [D5] Ячейка D5 текущего листа. Полная и краткая формы. Тут применим только синтаксис типа A1, но не R1C1. То есть такая конструкция RangeR1C2«) — вызовет ошибку, даже если в книге Excel включен режим формул R1C1.

Разумеется после этой формы вы можете обратиться к свойствам соответствующей ячейки. Например, RangeD5«).Interior.Color = RGB(0, 255, 0).
Cells(5, 4) или Cells(5, «D») Ячейка D5 текущего листа через свойство Cells. 5 — строка (row), 4 — столбец (column). Допустимость второй формы мало кому известна.
Cells(65540) Ячейку D5 можно адресовать и через указание только одного параметра свойсва Cells. При этом нумерация идёт слева направо, потом сверху вниз. То есть сначала нумеруется вся строка (2^14=16384 колонок) и только потом идёт переход на следующую строку. То есть Cells(16385) вернёт вам ячейку A2, а D5 будет Cells(65540). Пока данный способ выглядит не очень удобным.

Работа с диапазоном ячеек

Синтаксическая форма Комментарии по использованию
Range(«A1:B4«) или [A1:B4] Диапазон ячеек A1:B4 текущего листа. Обратите внимание, что указываются координаты верхнего левого и правого нижнего углов диапазона. Причём первый указываемый угол вполне может быть правым нижним, это не имеет значения.
Range(Cells(1, 1), Cells(4, 2)) Диапазон ячеек A1:B4 текущего листа. Удобно, когда вы знаете именно цифровые координаты углов диапазона.

Работа со строками

Синтаксическая форма Комментарии по использованию
Range3:5«) или [3:5] Строки 3, 4 и 5 текущего листа целиком.
RangeA3:XFD3«) или [A3:XFD3] Строка 3, но с указанием колонок. Просто, чтобы вы понимали, что это тождественные формы. XFD — последняя колонка листа.
Rows3:3«) Строка 3 через свойство Rows. Параметр в виде диапазона строк. Двоеточие — это символ диапазона.
Rows(3) Тут параметр — индекс строки в массиве строк. Так можно сослаться только не конкретную строку. Обратите внимание, что в предыдущем примере параметр текстовая строка «3:3» и она взята в кавычки, а тут — чистое число.

Работа со столбцами

Синтаксическая форма Комментарии по использованию
RangeB:B«) или [B:B] Колонка B текущего листа.
RangeB1:B1048576«) или [B1:B1048576] То же самое, но с указанием номеров строк, чтобы вы понимали, что это тождественные формы. 2^20=1048576 — максимальный номер строки на листе.
ColumnsB:B«) То же самое через свойство Columns. Параметр — текстовая строка.
Columns(2) То же самое. Параметр — числовой индекс столбца. «A» -> 1, «B» -> 2, и т.д.

Весь лист

Синтаксическая форма Комментарии по использованию
RangeA1:XFD1048576«) или [A1:XFD1048576] Диапазон размером во всё адресное пространство листа Excel. Воспринимайте эту таблицу лишь как теорию — так работать с листами вам не придётся — слишком большое количество ячеек. Даже современные компьютеры не смогут помочь Excel быстро работать с такими массивами информации. Тут проблема больше даже в самом приложении.
Range1:1048576«) или [1:1048576] То же самое, но через строки.
RangeA:XFD«) или [A:XFD] Аналогично — через адреса столбцов.
Cells Свойство Cells включает в себя ВСЕ ячейки.
Rows Все строки листа.
Columns Все столбцы листа.

Следует иметь в виду, что свойства Range, Cells, Columns и Rows имеют как объекты типа Worksheet, так и объекты Range. Соответственно в первом случае эти коллекции будут относиться ко всему листу и отсчитываться будут от A1, а вот в случае конкретного объекта Range эти коллекции будут относиться только к ячейкам этого диапазона и отсчитываться будут от левого верхнего угла диапазона. Например Cells(2,2) указывает на ячейку B2, а Range(«C3:D5»).Cells(2,2) укажет на D4.

Также много путаницы в умы вносит тот факт, что объект Range имеет одноименное свойство range. К примеру, Range(«A100:D500»).Range(«A2») — тут выражение до точки ( Range(«A100:D500») ) является объектом Range, выражение после точки ( Range(«A2») ) — свойство range упомянутого объекта, но возвращает это свойство тоже объект типа Range. Вот такие пироги. Из этого следует, что такая цепочка может иметь и более двух членов. Практического смысла в этом будет не много, но синтаксически это будут совершенно корректно, например, так: Range(«CV100:GR200»).Range(«J10:T20»).Range(«A1:B2») укажет на диапазон DE109:DF110.

Ещё один сюрприз таится в том, что объекты Range имеют свойство по-умолчанию Item( RowIndex [, ColumnIndex] ). По правилам VBA при ссылке на default свойства имя свойства (Item) можно опускать. Кстати говоря, то что вы привыкли видеть в скобках после Cells, есть не что иное, как это дефолтовое свойство Item, а не родные параметры Cells, который их не имеет вовсе. Ну ладно к Cells все привыкли и это никакого отторжения не вызывает, но если вы увидите нечто подобное — Range(«C3:D5»)(2,2), то, скорее всего, будете несколько озадачены, а тем временем — это буквально тоже самое, что и у Cells — всё то же дефолтовое свойство Item. Последняя конструкция ссылается на D4. А вот для Columns и Rows свойство Item может быть только одночленным, например Columns(1) — и к этой форме мы тоже вполне привыкли. Однако конструкции вида Columns(2)(3)(4) могут сильно удивить (столбец 7 будет выделен).

Примеры кода

Скачать

Типовые задачи

  1. Перебор ячеек в диапазоне (вариант 1)

    В данном примере организован цикл For…Next и доступ к ячейкам осуществляется по их индексу. Вместо parRange(i) мы могли бы написать parRange.Item(i) (выше это объяснялось). Обратите внимание, что мы в этом примере успешно применяем, как вариант с parRange(i,c), так и parRange(i). То есть, если мы применяем одночленную форму свойства Item, то диапазон перебирается по строкам (A1, B1, C1, A2, …), а если двухчленную, то столбец у нас зафиксирован и каждая итерация цикла — на новой строке. Это очень интересный эффект, его можно применять для вытягивания таблиц по вертикали. Но — продолжим!

    Количество ячеек в диапазоне получено при помощи свойства .Count. Как .Item, так и .Count — это всё атрибуты коллекций, которые широко применяются в объектой модели MS Office и, в частности, Excel.

    Sub Handle_Cells_1(parRange As Range)
      For i = 1 To parRange.Count
        parRange(i, 5) = parRange(i).Address & " = " & parRange(i)
      Next
    End Sub
     
  2. Перебор ячеек в диапазоне (вариант 2)

    В этом примере мы использовали цикл For each…Next, что выглядит несколько лаконичней. Однако, в некоторых случаях вам может потребоваться переменная i из предыдущего примера, например, для вывода результатов в определенные строки листа, поэтому выбирайте удробную вам форму оператора For. Тут в цикле мы «вытягивали» все ячейки диапазона в текстовую строку, чтобы потом отобразить её через функцию MsgBox.

    Sub Handle_Cells_2(parRange As Range)
      For Each c In parRange
        strLine = strLine & c.Address & "=" & c & "; "
      Next
      MsgBox strLine
    End Sub
     
  3. Перебор ячеек в диапазоне (вариант 3)

    Если необходимо перебирать ячейки в порядке A1, A2, A3, B1, …, а не A1, B1, C1, A2, …, то вы можете это организовать при помощи 2-х циклов For. Обратите внимание, как мы узнали количество столбцов (parRange.Columns.Count) и строк (parRange.Rows.Count) в диапазоне, а также на использование свойства Cells. Тут Cells относится к листу и никак не связано с диапазоном parRange.

    Sub Handle_Cells_3(parRange As Range)
      colNum = parRange.Columns.Count
      For i = 1 To parRange.Rows.Count
        For j = 1 To colNum
          Cells(i + (j - 1) * colNum, colNum + 2) = parRange(i, j)
        Next j
      Next i
    End Sub  
     
  4. Перебор строк диапазона

    В цикле For each…Next перебираем коллекцию Rows объекта parRange. Для каждой строки формируем цвет на основе первых трёх ячеек каждой строки. Поскульку у нас в ячейках формула, присваивающая ячейке случайное число от 1 до 255, то цвета получаются всегда разные. Оператор With позволяет нам сократить код и, к примеру, вместо Line.Cells(2) написать просто .Cells(2).

    Sub Handle_Rows_1(parRange As Range)
      For Each Line In parRange.Rows
        With Line
          .Interior.Color = RGB(.Cells(1), .Cells(2), .Cells(3))
        End With
      Next
    End Sub  
     
  5. Перебор столбцов

    Перебираем коллекцию Columns. Тоже используем оператор With. В последней ячейке каждого столбца у нас хранится размер шрифта для всей колонки, который мы и применяем к свойству Line.Font.Size.

    Sub Handle_Columns_1(parRange As Range)
      For Each Line In parRange.Columns
        With Line
          .Font.Size = .Cells(.Cells.Count)
        End With
      Next
    End Sub 
     
  6. Перебор областей диапазона

    Как вы знаете, в Excel можно выделить несвязанные диапазоны и проделать с ними какие-то операции. Поддерживает это и объект Range. Получить диапазон, состоящий из нескольких областей (area) очень легко — достаточно перечислить через запятую адреса соответствующих диапазонов: RangeA1:B3, B5:D8, Z1:AA12«).
    Вот такой составной диапазон и разбирается процедурой, показанной ниже. Организован цикл по коллекции Areas, настроен оператор with на текущий элемент коллекции, и ниже и правее относительно ячейки J1 мы собираем некоторые сведения о свойствах областей составного диапазона (которые каждый по себе, конечно же, тоже являются объектами типа Range). Для задания смещения от ячейки J1 нами впервые использовано очень полезное свойство Offset. Каждый диапазон получает случайный цвет, плюс мы заносим в таблицу порядковый номер диапазона (i), его адрес (.Address), количество ячеек (.Count) и цвет (.Interior.Color) после того, как он вычислен.

    Sub Handle_Areas_1(parRange As Range)
      For i = 1 To parRange.Areas.Count
        With parRange.Areas(i)
          Cells(1, 10).Offset(i, 0) = i
          Cells(1, 10).Offset(i, 1) = .Address
          Cells(1, 10).Offset(i, 2) = .Count
          .Interior.Color = RGB(Int(Rnd * 255), Int(Rnd * 255), Int(Rnd * 255))
          Cells(1, 10).Offset(i, 3) = .Interior.Color
        End With
      Next
    End Sub
     

Продолжение следует…

Читайте также:

  • Поиск границ текущей области

  • Массивы в VBA

  • Структуры данных и их эффективность

  • Автоматическое скрытие/показ столбцов и строк

Содержание

  1. Проход по диапазону ячеек
  2. Поддержка и обратная связь
  3. Использование операторов For Each. Next
  4. Проход по диапазону ячеек
  5. Выход из цикла For Each. Next до его завершения
  6. Использование цикла For Each. Next для итерации в классе VBA
  7. См. также
  8. Поддержка и обратная связь
  9. Как сделать перебор диапазона ячеек
  10. Код макроса с «For Each»
  11. Выход из цикла по условию
  12. Добавить комментарий Отменить ответ
  13. Рубрики
  14. Свежие записи
  15. Свежие комментарии
  16. Условия обработки персональных данных
  17. Как сделать перебор диапазона ячеек
  18. Как макрос работает
  19. Код макроса
  20. Как этот код работает
  21. Как использовать
  22. VBA Excel. Цикл For Each… Next
  23. Синтаксис цикла For Each… Next
  24. Компоненты цикла For Each… Next
  25. Примеры циклов For Each… Next
  26. Цикл для диапазона ячеек
  27. Цикл для коллекции листов
  28. Цикл для массива
  29. Цикл для коллекции подкаталогов и выход из цикла
  30. 46 комментариев для “VBA Excel. Цикл For Each… Next”

Проход по диапазону ячеек

При использовании Visual Basic часто требуется выполнить один и тот же блок операторов в каждой ячейке диапазона. Для этого необходимо объединить оператор цикла и один или несколько методов для идентификации каждой ячейки по отдельности и выполнить операцию.

Один из способов пройти по диапазону — использовать цикл For. Next со свойством Cells. С помощью свойства Cells можно заменить номера индексов ячеек счетчиком циклов (или другими переменными или выражениями). В следующем примере индекс строки заменяется переменной counter . Процедура проходит по диапазону ячеек C1:C20, присваивая значение 0 (ноль) каждому числу, абсолютное значение которого меньше 0,01.

Еще один простой способ пройти по диапазону — использовать цикл For Each. Next с коллекцией ячеек, указанной в свойстве Range. Visual Basic автоматически присваивает объектную переменную для следующей ячейки при каждом выполнении цикла. Следующая процедура проходит по диапазону ячеек A1:D10, присваивая значение 0 (ноль) каждому числу, абсолютное значение которого меньше 0,01.

Если вы не знаете границы диапазона, по которому нужно пройти, можно использовать свойство CurrentRegion, чтобы возвратить диапазон, окружающий активную ячейку. Например, при запуске на листе следующая процедура выполняет проход по диапазону, окружающему активную ячейку, присваивая значение 0 (ноль) каждому числу, абсолютное значение которого меньше 0,01.

Поддержка и обратная связь

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.

Источник

Использование операторов For Each. Next

Операторы For Each. Next повторяют блок операторов для каждого объекта в коллекции или каждого элемента массива. Visual Basic автоматически присваивает переменную при каждом выполнении цикла. Например, следующая процедура добавляет 10 к значению каждой ячейки в диапазоне от A1 до A10.

Указанный ниже код перебирает все элементы массива и устанавливает для каждого из них значение переменной-счетчика I.

Проход по диапазону ячеек

Цикл For Each. Next можно использовать для прохода по диапазону ячеек. Приведенная ниже процедура проходит по диапазону ячеек A1:D10 на листе Sheet1 и присваивает каждой ячейке, абсолютное значение которой меньше 0,01, значение 0 (ноль).

Выход из цикла For Each. Next до его завершения

Из цикла For Each. Next можно выйти с помощью оператора Exit For. Например, при возникновении ошибки можно использовать оператор Exit For в блоке True оператора If. Then. Else или оператора Select Case, который используется непосредственно для проверки ошибок. Если ошибка не возникает, оператор If…Then…Else получает значение False, и цикл продолжает работу.

В следующем примере выполняется поиск первой ячейки диапазона A1:B5, не содержащей число. Если такая ячейка найдена, выводится сообщение и выполняется выход из цикла с помощью оператора Exit For.

Использование цикла For Each. Next для итерации в классе VBA

Для каждого. Следующие циклы не только итерируют массивы и экземпляры объекта Collection . Они также могут выполнять итерацию в созданном вами классе VBA.

Ниже приведен пример, в котором показано, как это сделать.

Создайте модуль класса в редакторе Visual Basic (VBE) и присвойте ему имя CustomCollection. cc1

Вставьте следующий код в только что созданный модуль.

Экспортируйте этот модуль в файл и сохраните его в локальном расположении. cc2

После экспорта модуля откройте экспортированный файл, используя текстовый редактор (программы Блокнот в Windows должно быть достаточно). Содержимое файла должно выглядеть следующим образом.

Используя текстовый редактор, удалите знак ‘ из первой строки под текстом Property Get NewEnum() As IUnknown в файле. Сохраните измененный файл.

В редакторе VBE удалите класс, созданный из проекта VBA, и не экспортируйте его при появлении соответствующего запроса. cc3

Импортируйте файл, из которого вы удалили знак ‘ , назад в VBE. cc4

Выполните следующий код, чтобы проверить возможность итерации в своем созданном пользовательском классе VBA, используя VBE и текстовый редактор.

Сноски Описание
[cc1] Вы можете создать модуль класса, выбрав Class Module (Модуль класса) в меню Insert (Вставка). Вы можете переименовать модуль класса, изменив его свойства в окне Properties (Свойства).
[cc2] Вы можете активировать диалоговое окно Экспорт файла, выбрав Export File (Экспорт файла) в меню File (Файл).
[cc3] Вы можете удалить модуль класса из VBE, выбрав Remove Item (Удалить элемент) в меню File (Файл).
[cc4] Вы можете импортировать файл внешнего модуля класса, запустив диалоговое окно Импорт файла (выберите Import File (Импорт файла) в меню File (Файл)).

См. также

Поддержка и обратная связь

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.

Источник

Как сделать перебор диапазона ячеек

Для того чтобы перебрать ячейки в экселе можно использовать цикл For Each, пример использования смотрите ниже.

Код макроса с «For Each»

Выход из цикла по условию

Для выхода из цикла, если надо завершить его досрочно, не проходя все ячейки, есть команда Exit For

Пример использования Exit For

Добавить комментарий Отменить ответ

Рубрики

Свежие записи

  • Как найти обратные ссылки на сайт через google 07.03.2023
  • Настройки плагина WooCommerce, в произвольной теме через add_theme_support 05.11.2022
  • ERROR 2013 (HY000) at line 1612: Lost connection to MySQL server during query 02.11.2022
  • Использование fopen с «php://memory» 29.09.2022
  • Изменение содержимого бинарного файла 20.08.2022
  • Программное создание атрибута и его значения в woocommerce 15.08.2022
  • Автоматически измененяем автора при сохранении поста 22.07.2022
  • Вывод логов в Android Studio 25.05.2022
  • Как получить из ресурса R.string строку 16.05.2022
  • Как получить ID элемента из View 02.05.2022
  • Событие onClick по кнопке 21.04.2022
  • Плавный переход к следующей Activity 21.04.2022
  • Установка, активация и настройка модуля для «Панель состояния» на OpenCart 09.04.2022
  • Как вывести информацию в «Панель состояния» на OpenCart 09.04.2022
  • Ошибка Either GD PHP extension 08.03.2022

Свежие комментарии

  • Vlad к записи Как вывести информацию в «Панель состояния» на OpenCart
  • Vlad к записи Как вывести информацию в «Панель состояния» на OpenCart
  • Vlad к записи Как вывести информацию в «Панель состояния» на OpenCart
  • admin к записи Как вывести информацию в «Панель состояния» на OpenCart
  • Сергей к записи Редактирование табов на странице карточки товара

Условия обработки персональных данных

Сайт использует технические и персональные данные пользователей для получения маркетинговой и статистической информации. С условия обработки персональных данных посетителей можно ознакомиться по ссылке.

В случае Вашего не согласия с этими условиями — просим Вас покинуть данный сайт. Если Вы продолжаете находиться и использовать сайт — Вы автоматически выражаете свое согласие с условиями обработки персональных данных пользователей сайта

Источник

Как сделать перебор диапазона ячеек

Что делает макрос: Этот базовый макрос показывает вам простой способ сделать перебор диапазона ячеек по одной и выполнить какое-либо действие.

Как макрос работает

В этом макросе используются две переменные объекта Range. Одна из переменных отражает объем данных, с которым мы работаем, в то время как другая используется для хранения каждой отдельной клетки в диапазоне. Потом мы используем оператор For Each, чтобы активировать или принести каждую ячейку в фокусе целевого диапазона.

Код макроса

Как этот код работает

  1. Макрос объявляет две переменные объекта Range. Одна из них, называется MyRange, держит весь целевой диапазон. Другая, называемый MyCell, держит каждую ячейку в диапазоне, так как макрос проводит цикл через них один за другим.
  2. На шаге 2 мы заполняем переменную MyRange с целевым диапазоном. В этом примере мы используем Range («D6:D17»). Если ваш целевой диапазон является именованным, можно просто ввести его название — Range («MyNamedRange»).
  3. На этом этапе макрос начинает цикл через каждую ячейку в целевом диапазоне, активизируя ее.
  4. После того, как ячейка активируется, можно с ней что-то сделать. Это «что-то» на самом деле зависит от поставленной задачи. Вы можете удалять строки, когда активная ячейка имеет определенное значение, или вы можете вставить строку между каждой активной ячейки. В этом примере макрос меняется шрифт полужирный для любого элемента, который имеет значение больше, чем 3000.
  5. На шаге 5, макрос возвращается назад, чтобы получить следующую ячейку. После активации всех ячеек в целевом диапазоне, макрос заканчивает работу.

Как использовать

Для реализации этого макроса, вы можете скопировать и вставить его в стандартный модуль:

  1. Активируйте редактор Visual Basic, нажав ALT + F11 на клавиатуре.
  2. Щелкните правой кнопкой мыши имя проекта / рабочей книги в окне проекта.
  3. Выберите Insert➜Module.
  4. Введите или вставьте код.

Источник

VBA Excel. Цикл For Each… Next

Цикл For Each… Next в VBA Excel, его синтаксис и описание отдельных компонентов. Примеры использования цикла For Each… Next.

Цикл For Each… Next в VBA Excel предназначен для выполнения блока операторов по отношению к каждому элементу из группы элементов (диапазон, массив, коллекция). Этот замечательный цикл применяется, когда неизвестно количество элементов в группе и их индексация, в противном случае, более предпочтительным считается использование цикла For…Next.

Синтаксис цикла For Each… Next

В квадратных скобках указаны необязательные атрибуты цикла For Each… Next.

Компоненты цикла For Each… Next

Компонент Описание
element Обязательный атрибут в операторе For Each, необязательный атрибут в операторе Next. Представляет из себя переменную, используемую для циклического прохода элементов группы (диапазон, массив, коллекция), которая предварительно должна быть объявлена с соответствующим типом данных*.
group Обязательный атрибут. Группа элементов (диапазон, массив, коллекция), по каждому элементу которой последовательно проходит цикл For Each… Next.
statements Необязательный** атрибут. Операторы вашего кода.
Exit For Необязательный атрибут. Оператор выхода из цикла до его окончания.

*Если цикл For Each… Next используется в VBA Excel для прохождения элементов коллекции (объект Collection) или массива, тогда переменная element должна быть объявлена с типом данных Variant, иначе цикл работать не будет.

**Если не использовать в цикле свой код, смысл применения цикла теряется.

Примеры циклов For Each… Next

Цикл для диапазона ячеек

На активном листе рабочей книги Excel выделите диапазон ячеек и запустите на выполнение следующую процедуру:

Информационное окно MsgBox выведет адреса выделенных ячеек и их содержимое, если оно есть. Если будет выбрано много ячеек, то полностью информация по всем ячейкам выведена не будет, так как максимальная длина параметра Prompt функции MsgBox составляет примерно 1024 знака.

Цикл для коллекции листов

Скопируйте следующую процедуру VBA в стандартный модуль книги Excel:

Информационное окно MsgBox выведет список наименований всех листов рабочей книги Excel по порядковому номеру их ярлычков, соответствующих их индексам.

Цикл для массива

Присвоим массиву список наименований животных и в цикле For Each… Next запишем их в переменную a. Информационное окно MsgBox выведет список наименований животных из переменной a.

Повторим ту же процедуру VBA, но всем элементам массива в цикле For Each… Next присвоим значение «Попугай». Информационное окно MsgBox выведет список наименований животных, состоящий только из попугаев, что доказывает возможность редактирования значений элементов массива в цикле For Each… Next.

Этот код, как и все остальные в этой статье, тестировался в Excel 2016.

Цикл для коллекции подкаталогов и выход из цикла

В этом примере мы будем добавлять в переменную a названия подкаталогов на диске C вашего компьютера. Когда цикл дойдет до папки Program Files, он добавит в переменную a ее название и сообщение: «Хватит, дальше читать не буду! С уважением, Ваш цикл For Each… Next.».

Информационное окно MsgBox выведет список наименований подкаталогов на диске C вашего компьютера до папки Program Files включительно и сообщение цикла о прекращении своей работы.

В результате работы программы будут выведены не только наименования подкаталогов, видимых при переходе в проводнике к диску C, но и скрытые и служебные папки. Для просмотра списка всех подкаталогов на диске C, закомментируйте участок кода от If до End If включительно и запустите выполнение процедуры в редакторе VBA Excel.

46 комментариев для “VBA Excel. Цикл For Each… Next”

Здравствуйте!
Я новичок в VBA, поэтому ,возможно, вопрос глупый, но не могу никак придумать процедуру для сравнения двух массивов с помощью цикла For Each… Next.
т.е. имеются столбцы A:B — ФИО1 Дата1 и столбцы C:D — ФИО2 Дата2. Хочу сравнить и при совпадении выделить совпадающие ячейки цветом.
Подскажите, хотя бы примерно, как это сделать.
Спасибо

Здравствуйте!
Диапазоны в примере одинаковые по размеру, но могут быть любые:

Спасибо большое, Евгений!
Я немного неправильно сформулировал.
Нужно выделить, если пары ФИО и Дата совпадают.
т.е. Иванов 1979 и Иванов 1979 выделялись, а Иванов 1979 и Иванов 1980 нет. Так же как и Иванов 1979 и Петров 1979 не нужно выделять.
Пока придумал только если создать дополнительные столбцы и в них прописать «=A1&B1» и по ним сравнивать.
Можно ли как то сделать по другому?

Можно и по-другому, попробуйте так:

Спасибо огромное. То, что нужно!

Добрый день.
Есть задача посложнее.
Лист 1 . А1 инвентарный номер (10 или 12 знаков) . В1 колличество полученных деталей.
Лист 2 . Колонка J содержит инвентарный номер (может быть несколько строк). Колонка S содержит текст внутри которого колличество полученных деталей (B1 листа 1). Колонка N содержит дату получения деталей.
Задача надо найти по данным Листа1 совпадение А1&В1 на Листе 2 данные колонки n

Здравствуйте!
Подскажите пожалуйста, как с помощью цикла For Each…Next можно выполнить задачу:
Есть диапазон со значениями, например («B1:С5»)
Нужно все значения из этого диапазона последовательно вынести в столбец A (раздельно, не в одну ячейку)

Большое спасибо!
У вас очень классный сайт, существенно мне помог разобраться в VBA Excel

Добрый день, очень часто пользуюсь информацией с Вашего сайта, но вот тут возникла задача, с которой справиться не получается, возможно вы сможете помочь.
У меня есть массив:

В данном массиве необходимо сравнить каждую ячейку с каждой из этого же массива и найти такую же цифру, только с противоположным знаком, если такой цифры с противоположным знаком нет -> (то вывести в столбик такие цифры, к которым нет противоположных), а если есть цифра с противоположным знаком -> (то ничего делать с ней не нужно).

Найденные числа записываются в первый столбец листа «Лист1». Пустые ячейки (нули) игнорируются.

Правильно ли будет отрабатываться условие «если такой цифры с противоположным знаком нет -> (то вывести в столбик такие цифры, к которым нет противоположных)» во втором цикле? Будет ложное срабатывание, когда val1=5 и val2=6, например, ведь 5<>-6.

проверяет, с какими значениями переменных закончился внутренний цикл. Если это 5 и 6, значит в массиве нет значения -5, и это не ложное, а верное срабатывание.

Добрый вечер! Подскажите, пожалуйста, как исправить проблему? Дана строка символов, и нужно определить, встречаются ли в ней 5 символов «$» и 3 символа «%»? Почему-то в любом случае результат, что «Символы не встречаются». Заранее спасибо.

Дарья, объявление переменных

А код измените следующим образом:

Здравствуйте.
Подскажите, пожалуйста, как выполнить задачу. Есть лист1. В нем столбик А с ячейками ID(заранее известно количество строк). Нужно сравнить с ячейками ID столбика А листа2 и при совпадении записать данные из столбика К листа1 в столбик D листа2 вместе с цветом ячейки. В листе2 не известно заранее сколько строк. Я написала начало, дальше не пойму как.

Здравствуйте, Елена!
Как я понял из вашего кода, просмотр начинается с 3 строки. Вот два варианта решения, где вам нужно только заменить Лист11 на Worksheets(«22.11-28.11») и Лист12 на второй ваш лист:

Спасибо большое! Первый вариант мне как-то более понятен. Т.е. теперь, чтобы передать цвет ячейки, надо дописать перед выходом из внутреннего цикла

Только это не работает.

Елена, вы правильно написали, надо добавить именно эту строку, и она работает — только что проверил. Может быть, вы в ней не поменяли названия листов?

Да работает. Просто цвета, созданные условным форматированием, не переносятся

Результат не гарантирован, так как он будет зависеть от формулировок правил условного форматирования.

Как-то частично переносит цвет.
Заметила, что и на первом листе и на втором игнорируется последняя строка. Поставила n1 + 1, n2 + 1 и все работает как надо.

Подскажите, пожалуйста,как обозначить выполнение цикла операций после проведения отбора каждого из возможных значений по одному из столбцов?
Есть массив данных(много столбцов) с разными значениями в ячейках столбца День(от 1до 31). Нужно последовательно для каждого дня вывести массив, скопировать его (отдельные части) и перенести в другую книгу. Так для каждого дня. Т.е последовательно скопировать и вставить массивы данных в другую книгу. В общем массиве могут быть не все даты месяца.

Подскажите пожалуйста есть ли способ с помощью этого цикла перекрасить объекты (Shape) имеющие в себе гиперссылки (Hyperlink) во всей книге.
Для листа у меня вышло а для книги не могу понять как, прошу помощи так как только начал разбираться в vba.
Код макроса.

Здравствуйте, Денис!
Ваш код для всей текущей книги:

Здравствуйте. А как быть, если выбраны пользователем несмежные ячейки? Перебор не идёт (

Здравствуйте, Владимир!
У меня цикл For Each… Next работает и с выбранными несмежными ячейками — Selection , и с заданными как объект Range — Range(«B4:B5,D7:D8,G1:G2») . Проверьте у себя еще раз на примере цикла для диапазона ячеек (test1).

Здравствуйте.
Я инженер, работаю со сметами. У нас разделы в смете, и после каждого раздела нужна подсчитать итог, разделы начинаются : » РАЗДЕЛ «НОМЕР» ****** » . У меня не получается никак. Подскажите пожалуйста.

Здравствуйте, Андрей!
Недостаточно информации для понимания ситуации. Объясните структуру сметы: в каком столбце находятся названия разделов, какие диапазоны надо суммировать, куда записывается результат суммирования.

Таблица в столбцах A:H. Раздел находится в столбцах B:F (одна строка) мне нужно суммировать столбец H от первого раздела до следующего раздела ( все разделы по отдельности). Вверху раздела одна пустая строка, там должно вписаться результат суммы раздела в столбце H. Все разделы должны по отдельности суммироваться.

По вашему описанию я представляю так:

Сстрока 1 — шапка таблицы.

Блок раздела 1:
ячейка B2 — наименование раздела (РАЗДЕЛ 1)
диапазон H3-H8 — диапазон суммирования
ячейка H9 — сумма

Блок раздела 2:
ячейка B10 — наименование раздела (РАЗДЕЛ 2)
диапазон H11-H20 — диапазон суммирования
ячейка H21 — сумма

и так далее (диапазон суммирования — величина переменная). Правильно?

Да. Но разделы не «B2» а «B2:F2» то есть они объединены в одну строку (столбцы). Разделы начинаются со слова , например «Раздел 1. Кровля» , то есть разделы начинается : «Раздел «номер» «****» . и т.д. Мне нужно пробегаться по этим разделам и вставить итог в конце. Остальное все правильно.

Андрей, в объединенной ячейке отображается только значение первой ячейки, поэтому обращаться к объединенной ячейке «B2:F2» будем «B2» . Код будет работать при отсутствии пустых ячеек внутри суммируемых диапазонов, нули допускаются:

Привет, Евгений. Ну я вписал, не работает, только n подсчитывает последнюю строку. Сумма в столбце H не вставляется, m тоже не работает.

Андрей, у меня все работает. Возможно, у вас структура таблицы другая.

В строке раздела в столбце «H» пусто.
Структура:
В 1 столбце нумерация.
В 2ом обоснование.
В 3ем наименование.
В 4ем ед.измерение.
В 5ом норма.
В 6ом по проекту.
В 7ом цена
В 8ом сумма.

Если на пересечении строки раздела и столбца «H» пусто, тогда:

Привет Евгений. Можно функцию сумм как формулу ввести, чтобы в ячейке была формула?

Можно и формулу вставить:

Спасибо Евгений, удачи тебе, очень помог.

Здравствуйте, по работе нужно модернизировать существующий макрос, чтобы он для ячеек из диапазона столбцов от G до N заполнял пустые ячейки прочерками «-«, как я полагаю, используя For Each, можете помочь?

Источник

Есть несколько
способов перебора ячеек диапазона в
цикле. Примеры из этого раздела
демонстрируют использование с этой
целью операторов For
Each…Next
и
Do…Loop.

3.6.4.1. For Each…Next

Предпочтительный
способ перебора ячеек диапазона —
организация цикла For
Each…Next
; этот
цикл рекомендуется и при переборе
элементов наборов.

Вот как строится
цикл, в котором программа перебирает
ячейки диапазона A1:D10 на листе Sheet1 и
обнуляет ячейки с абсолютными значениями,
меньшими 0.01:

Sub RoundToZero()

For
Each r In Worksheets(«Sheet1»).Range(«A1:D10»).Cells

If Abs(r.Value) < 0.01 Then

r.Value = 0

End If

Next r

End Sub

Допустим, Вы хотите
изменить этот код так, чтобы он обрабатывал
ячейки диапазона, выделенного
пользователем. Для этого подходит метод
InputBox,
который
позволяет предложить пользователю
выделить диапазон ячеек. Метод
InputBox
возвращает
объект Range,
представляющий выделенный диапазон.
Используя аргумент Type
и обработку ошибок, Вы сможете гарантировать
выделение допустимого диапазона до
того, как диалоговое окно будет убрано
с экрана.

Sub
RoundToZero()

Worksheets( «Sheet 1») .Activate

On
Error GoTo PressedCancel

Set r = Application.lnputBox(prompt:=
«Select a range of cells», Type:=8)

On Error GoTo 0

For Each с In r.Cells

If Abs(c.Value) < 0.01
Then

c.Value = 0

End If

Next с

Exit Sub

PressedCancel:

Resume

End Sub

Если выделения
диапазона не требуется, то для получения
объекта Range
можно
воспользоваться свойством
CurrentRegion
или
UsedRange.

Например, или Вы знаете, что данные на
листе Sheet1 начинаются с ячейки А1 и не
содержат пустых строк или колонок, то
свойство
CurrentRegion

позволяет автоматически получить весь
диапазон:

Sub RoundToZero()

Set
r = Worksheets(«Sheet1»).Range(«A1»).CurrentRegion

For Each с In r.Cells

If Abs(c.Value) < 0.01
Then

c.Value = 0

End If

Next с

End Sub

Следующие примеры
демонстрируют два способа скрыть каждую
вторую Колонку в использованном диапазоне
на листе Sheet1. Первый построен на цикле
For Each…Next,
в котором проверяется значение свойства
Column
объектной
переменной:

Sub HideColumns()

Set
r = Worksheets(«Sheet1»).UsedRange

For Each col In
r.Columns

If col.Column Mod 2 = 0 Then

col.Hidden = True

End If

Next col

End Sub

А второй — на цикле
For…Next
с проверкой счетчика цикла:

Sub HideColumns()

Set
r = Worksheets(«Sheet1»).UsedRange

For i = 1 To
r.Columns.Count

If i Mod 2 = 0 Then

r.Columns(i).Hidden =
True

End If

Next i

End Sub

3.6.4.2. Do …Loop

В некоторых случаях
цикл For
Each…Next
не
самый удачный способ перебора ячеек
диапазона. Допустим, Вам нужен макрос,
который сортирует колонку и удаляет
строки с одинаковыми данными. Можно
было бы попробовать Применить цикл For
Each…Next:

Sub BuggyRemoveDuplicates()
‘ HE ИСПОЛЬЗУЙТЕ ЭТОТ КОД!

Worksheets
(«Sheet1»).Range («А1») .Sort _

key1:=
Worksheets( «Sheet1 «).Range( «A1»)

Set r =
Worksheets(«Sheet1»).Range(«A1»).CurrentRegion.Columns(«A»)

For Each с In r.Cells

If c.Offset(1, 0).Value = c.Value
Then

c.Offset(1, 0).EntireRow.Delete

End If

Next c

End Sub

Увы, этот код
работает неправильно, так как метод
Delete
изменяет
диапазон, к которому обращается цикл
For Each…Next.
В итоге программа не сможет удалить
некоторые дубликаты данных. Лучше
использовать цикл
Do…Loop:

Sub
GoodRemoveDuplicates()

Worksheets(«Sheet1»).Range(«A1»).Sort
_

key1 :=Worksheets( «Sheet1 «).Range( «А1
«)

Set currentCell = Worksheets( «Sheet1 «).Range(
«А1 «)

Do While Not lsEmpty(currentCell)

Set
nextCell = currentCell.0ffset(1, 0)

If nextCell.Value =
currentCell.Value Then

currentCell.EntireRow.Delete

End
If

Set currentCell = nextCell

Loop

End Sub

Этот цикл проверяет
объектную переменную currentCell и завершается,
дойдя до пустой ячейки под колонкой
данных. Тот же эффект даст и сравнение
в цикле значения currentCell с пустой строкой:

Do While currentCell.Value
<> «»

‘ здесь обрабатываем
заполненные ячейки

Loop

В любом случае не
забывайте переходить к следующей ячейке
в конце тела цикла Do…Loop
(например, Set currentCell = nextCell).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]

  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #

Цикл For Each… Next в VBA Excel, его синтаксис и описание отдельных компонентов. Примеры использования цикла For Each… Next.

Цикл For Each… Next в VBA Excel предназначен для выполнения блока операторов по отношению к каждому элементу из группы элементов (диапазон, массив, коллекция). Этот замечательный цикл применяется, когда неизвестно количество элементов в группе и их индексация, в противном случае, более предпочтительным считается использование цикла For…Next.

For Each element In group

    [ statements ]

    [ Exit For ]

    [ statements ]

Next [ element ]

В квадратных скобках указаны необязательные атрибуты цикла For Each… Next.

Компоненты цикла For Each… Next

Компонент Описание
element Обязательный атрибут в операторе For Each, необязательный атрибут в операторе Next. Представляет из себя переменную, используемую для циклического прохода элементов группы (диапазон, массив, коллекция), которая предварительно должна быть объявлена с соответствующим типом данных*.
group Обязательный атрибут. Группа элементов (диапазон, массив, коллекция), по каждому элементу которой последовательно проходит цикл For Each… Next.
statements Необязательный** атрибут. Операторы вашего кода.
Exit For Необязательный атрибут. Оператор выхода из цикла до его окончания.

*Если цикл For Each… Next используется в VBA Excel для прохождения элементов коллекции (объект Collection) или массива, тогда переменная element должна быть объявлена с типом данных Variant, иначе цикл работать не будет.

**Если не использовать в цикле свой код, смысл применения цикла теряется.

Примеры циклов For Each… Next

Цикл для диапазона ячеек

На активном листе рабочей книги Excel выделите диапазон ячеек и запустите на выполнение следующую процедуру:

Sub test1()

Dim element As Range, a As String

  a = «Данные, полученные с помощью цикла For Each… Next:»

    For Each element In Selection

      a = a & vbNewLine & «Ячейка « & element.Address & _

      » содержит значение: « & CStr(element.Value)

    Next

  MsgBox a

End Sub

Информационное окно MsgBox выведет адреса выделенных ячеек и их содержимое, если оно есть. Если будет выбрано много ячеек, то полностью информация по всем ячейкам выведена не будет, так как максимальная длина параметра Prompt функции MsgBox составляет примерно 1024 знака.

Цикл для коллекции листов

Скопируйте следующую процедуру VBA в стандартный модуль книги Excel:

Sub test2()

Dim element As Worksheet, a As String

  a = «Список листов, содержащихся в этой книге:»

    For Each element In Worksheets

      a = a & vbNewLine & element.Index _

      & «) « & element.Name

    Next

  MsgBox a

End Sub

Информационное окно MsgBox выведет список наименований всех листов рабочей книги Excel по порядковому номеру их ярлычков, соответствующих их индексам.

Цикл для массива

Присвоим массиву список наименований животных и в цикле For Each… Next запишем их в переменную a. Информационное окно MsgBox выведет список наименований животных из переменной a.

Sub test3()

Dim element As Variant, a As String, group As Variant

group = Array(«бегемот», «слон», «кенгуру», «тигр», «мышь»)

‘или можно присвоить массиву значения диапазона ячеек

‘рабочего листа, например, выбранного: group = Selection

a = «Массив содержит следующие значения:» & vbNewLine

  For Each element In group

    a = a & vbNewLine & element

  Next

MsgBox a

End Sub

Повторим ту же процедуру VBA, но всем элементам массива в цикле For Each… Next присвоим значение «Попугай». Информационное окно MsgBox выведет список наименований животных, состоящий только из попугаев, что доказывает возможность редактирования значений элементов массива в цикле For Each… Next.

Sub test4()

Dim element As Variant, a As String, group As Variant

group = Array(«бегемот», «слон», «кенгуру», «тигр», «мышь»)

‘или можно присвоить массиву значения диапазона ячеек

‘рабочего листа, например, выделенного: group = Selection

a = «Массив содержит следующие значения:» & vbNewLine

  For Each element In group

    element = «Попугай»

    a = a & vbNewLine & element

  Next

MsgBox a

End Sub

Этот код, как и все остальные в этой статье, тестировался в Excel 2016.

Цикл для коллекции подкаталогов и выход из цикла

В этом примере мы будем добавлять в переменную a названия подкаталогов на диске C вашего компьютера. Когда цикл дойдет до папки Program Files, он добавит в переменную a ее название и сообщение: «Хватит, дальше читать не буду! С уважением, Ваш цикл For Each… Next.».

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

Sub test5()

Dim FSO As Object, myFolders As Object, myFolder As Object, a As String

‘Создаем новый FileSystemObject и присваиваем его переменной «FSO»

Set FSO = CreateObject(«Scripting.FileSystemObject»)

‘Извлекаем список подкаталогов на диске «C» и присваиваем

‘его переменной «myFolders»

Set myFolders = FSO.GetFolder(«C:»)

a = «Папки на диске C:» & vbNewLine

‘Проходим циклом по списку подкаталогов и добавляем в переменную «a«

‘их имена, дойдя до папки «Program Files«, выходим из цикла

  For Each myFolder In myFolders.SubFolders

    a = a & vbNewLine & myFolder.Name

    If myFolder.Name = «Program Files» Then

      a = a & vbNewLine & vbNewLine & «Хватит, дальше читать не буду!» _

      & vbNewLine & vbNewLine & «С уважением,» & vbNewLine & _

      «Ваш цикл For Each... Next.«

  Exit For

    End If

  Next

Set FSO = Nothing

MsgBox a

End Sub

Информационное окно MsgBox выведет список наименований подкаталогов на диске C вашего компьютера до папки Program Files включительно и сообщение цикла о прекращении своей работы.

В результате работы программы будут выведены не только наименования подкаталогов, видимых при переходе в проводнике к диску C, но и скрытые и служебные папки. Для просмотра списка всех подкаталогов на диске C, закомментируйте участок кода от If до End If включительно и запустите выполнение процедуры в редакторе VBA Excel.


Like this post? Please share to your friends:
  • Excel перебор строк в ячейке
  • Excel перебор пустых ячеек
  • Excel перебор по фильтру
  • Excel перебор всех значений
  • Excel перебор всех вариантов