Макрос перебора всех ячеек в 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. Введите или вставьте код.

Цикл 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.


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

Знакомство с объектной моделью 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

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

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

How to use VBA/Macros to iterate through each cell in a range, either a row, a column, or a combination of both. This is for when you need to look into each cell or do something with each cell in a range; if you just need to search for a piece of data within a range, use the Find method (link coming soon).

Sections:

How to Loop Through a Range of Cells

Loop through a User-Selected Range

Selecting Multiple Contiguous Rows and Columns

Proper Technique (Doesn’t Matter)

Notes

How to Loop Through a Range of Cells

Here I will hard-code a specific range in Excel and create the code needed to loop or iterate through that range.

Code:

This is the full code.  Below, I will explain it.

'get the range through which we want to loop
Set cell_range = Range("A1:A10")

'start the loop
For Each cell In cell_range

    'you are now inside the loop
    MsgBox "Cell value = " & cell.Value

'continue the loop
Next cell

Get the Range to Loop Through

f64543872feb401157cee4791df71d07.jpg

Set cell_range = Range("A1:A10")

Here, the range A1:A10 has been assigned to the variable cell_range.  You can name the variable whatever you want basically but not «Range».

I have hard-coded the range here but, below, I will show you another way to get the range, including by user selection.

Loop through the Range

Now that we have a range, we can loop through it.

There are a few ways to do this and I will show you the easiest method here.

We use the For EachNext loop.  It looks like this:

'start the loop
For Each cell In cell_range

    'you are now inside the loop

'continue the loop
Next cell

Put this under the code we already have like this:

abe1ec9c66388a7f27ea9b4d03de10a3.jpg

This is the most basic way to loop through a range of cells in Excel using VBA/Macros.

The loop always has this format:

For Each current_cell_variable_name In range_reference(can also be a variable like in this example)

                What you want to do in the loop here.

Next current_cell_variable_name

The only thing that you need to understand about this loop is where to put two variables.  You need a variable that will represent the current cell that you are looping through, I called this cell in my example, and you need a variable that contains a range reference, I called this cell_range in my example.

cell_range is just what contains the range reference.  You can use an actual range reference here if you want instead of using a variable that contains a range reference, but putting it into a variable like in this example will make it easier to maintain in the future.

cell is just a variable that you use ONLY for this loop.  You can name it what you want, but make sure to put it after where it says «For Each» AND after where you put «Next».

Test the Loop

I will output a simple message box that shows the value of each cell so you can see that it works.

Here is the complete code (the macro has been named loop_range_1 now):

'get the range through which we want to loop
Set cell_range = Range("A1:A10")

'start the loop
For Each cell In cell_range

    'you are now inside the loop
    MsgBox "Cell value = " & cell.Value

'continue the loop
Next cell

8b65106ee04160c6371a5314e29121aa.jpg

Go back to Excel, hit Alt + F8 and select the macro and hit Run and we see this:

b2bdce2f91cede872ee6087e692a3845.jpg

The box will iterate through all 10 cells in the range and display the value from each cell.

Loop through a User-Selected Range

We follow the example from above but change one little thing:

'get the range through which we want to loop
Set cell_range = Selection

'start the loop
For Each cell In cell_range

    'you are now inside the loop
    MsgBox "Cell value = " & cell.Value

'continue the loop
Next cell
 

I replaced Range(«A1:A10») with Selection. Nothing else was changed.

Now, go back to Excel, select a range of cells, hit Alt + F8 and click the macro loop_range_selection and hit run and you will see it work.

4f8739d3414e1ae0812fc7837b5c008d.jpg

Selecting Multiple Contiguous Rows and Columns

This works exactly the same as the previous examples. Excel doesn’t care if you select data from one row, one column, or multiples of each. It will iterate through the cells from left-to-right until it hits the end of the range and then it will go down to the next row and do the same thing.

Proper Technique (Doesn’t Matter)

Technically, you are supposed to declare all variables at the top of the macro but, for such simple things as Excel macros, this is almost never important. As such, I left that out here. If you want, you can read about variables in our other tutorials and add those, but, trust me, it is probably not worth your time and, if it is, then you are creating a macro so sophisticated that you already know about variables and won’t be reading this tutorial in the first place.

Notes

This is a pretty basic technique in Excel. It has only two parts, figuring out the range through which to loop and looping through that range.

In this example, if you select empty cells and iterate through them, there will be nothing after the «Cell value = » text in the pop-up message box.

(If you don’t know how to install/create a macro, read this tutorial: Install a Macro in Excel)

Download the accompanying Excel file to use the macros from this tutorial.

Subscribe for Weekly Tutorials

BONUS: subscribe now to download our Top Tutorials Ebook!

Доброго дня, уважаемые!
Не могу осознать принцип работы следующего макроса и прошу разъяснить на пальцах:

Цитата
16 Май 2013 10:05:26 Казанский написал:

Код
With Range("A1", Cells(Rows.Count, "A").End(xlUp))
    .Value = Evaluate("INDEX(TRIM(" & .Address & "),)")
End With

По отдельности прочиталпосмотрел значения, но логика всего этого в одну строку не уловил. А также прошу подсказать, как указать текущую ячейку. Как я понял, из-за оператора «Evaluate» ссылка на ячейку происходит с помощью фразы » & .Address & «.
Конкретно мне требуется перебрать все ячейки (их значение — текст) удалив «лишние» пробелы, включая невидимые.
Нашёл несколько вариаций, включая цитируемый способ, и решил его доработать, другим вариантом:

Код
TRIM(CLEAN(SUBSTITUTE(("A1",CHAR(160),"" "")))

который, мне кажется, более предпочтительным, но может я ошибаюсь в правильности выбора, так как не очень понял их описание, трактовка порой разная. Одни пишут, что удаляют всё, но зачем-то отдельно 160-ый символ обрабатывают, а другие перечисляют 120-ые вручную помимо операторов… В примере применяется 2 оператора TRIM(сжпробелы) и Clean(печсимв), но я не уверен, что они так же стирают эти 120-ые символы; и для 160 символа отдельно используется 3-ий оператор SUBSTITUTE(подставить).
В любом случае, я не понимаю, как мне указать текущую ячейку, которую требуется обработать, т. е. в другом коде:

Код
With Range("A1", Cells(Rows.Count, "A").End(xlUp))
    .Value =TRIM(CLEAN(SUBSTITUTE((XXX,CHAR(160),"" "")))
End With

Вместо XXX должно быть что-то вроде того же «.Value» или » & .Address & «, который мне и нужно обработать каждым шагом перебора или «Range(«A1», Cells(Rows.Count, «A»).End(xlUp)).Value» — но это всё не работает.
Циклом For это выглядело бы нагляднее (пример)

Код
For i=1 to 10
    If Range("A" & i).Value = " " Then Range("A" & i).Value = ""
End If: End For

Т. е. тут в ячейку i-тую присваиваем результат работы с нею же, И-той ячейкой — я явно указал с какой ячейкой работал, а в коде выше я не знаю, как указать ссылку на И-тую ячейку, потому что не вижу упоминания «И-тости».
В первом коде, в качестве ссылки используется » & Address & » — тоже не понятная мне конструкция, и ничего умнее этого не придумал:

Код
With Range("I1", Cells(Rows.Count, "I").End(xlUp))
    .Value = Evaluate("INDEX(TRIM(" & .Address & "),)")
    .Value = TRIM(CLEAN(SUBSTITUTE((" & .Address & ",CHAR(160),"" "")))
    'или
    '.Value = TRIM(CLEAN(SUBSTITUTE((.Value,CHAR(160),"" "")))
End With

где вместо XXX указал «Аддресс», но так не сработало =(

Да, в пользу найденного мною варианта с 3 операторами:

Цитата
Функция СЖПРОБЕЛЫ (TRIM) предназначена для удаления из текста знаков пробела 7-разрядного кода ASCII (значение 32). В наборе знаков Юникода существует дополнительный знак пробела, который называется знаком неразрывного пробела и имеет десятичное значение 160. Этот знак обычно используется на веб-страницах как сущность HTML  . Сама по себе функция СЖПРОБЕЛЫ не удаляет этот знак неразрывного пробела. Пример синтаксиса, позволяющего удалить из текста оба знака пробела, см. в разделе Удаление пробелов и непечатаемых знаков из текста.
ПЕЧСИМВ (CLEAN) Удаляет из текста первые 32 непечатаемых знака в 7-битном коде ASCII (значения с 0 по 31).
СЖПРОБЕЛЫ (TRIM) Удаляет из текста знак пробела в 7-битной кодировке ASCII (значение 32).
ПОДСТАВИТЬ (SUBSTITUTE) Можно использовать для замены символов Юникода с более высокими значениями (127, 129, 141, 143, 144, 157 и 160) знаками 7-битной кодировки ASCII, для которых предназначены функции СЖПРОБЕЛЫ и ПЕЧСИМВ.

*Если я пойму принцип работы такого «цикла», то я многое смогу переделать с цикла for на этот.

*Косвенный вопрос: какой циклспособ перебора быстрее работает? В итоге требуется перебирать много ячеек и либо редактировать их, например, удалять пробелы, а затем почищенные диапазоны сравнивать между собой (~80+ тысяч строк сравнить с ~60+ тысячами строк). Писать всё по детскине профессионально циклом For мне, конечно, проще, нагляднее, но есть «пинок» сделать это лучшебыстрее, удобнее и короче в разы.

Благодарю за внимание и терпение!

Понравилась статья? Поделить с друзьями:
  • Макрос поиска строки excel
  • Макрос пароль на книгу excel
  • Макрос объединить ячейки word
  • Макрос поиска решений в excel
  • Макрос очистки диапазона ячеек excel