Excel vba цикл по объединенным ячейкам

The above answers look to have you sorted.

If you don’t know where the merged cells are then you can use the following routine to quickly detect them.

When I built Mappit! I realised that when I developed merged cell reporting that merged cells were part of xlBlanks

So you can use the code to detect merged cells immediately rather than loop through each cell testing for the MergedCells property being true.

Sub DetectMerged()
Dim rng1 As Range
Dim rng2 As Range
On Error Resume Next
Set rng1 = Intersect(Cells.SpecialCells(xlFormulas), Cells.SpecialCells(xlBlanks))
Set rng2 = Intersect(Cells.SpecialCells(xlConstants), Cells.SpecialCells(xlBlanks))
On Error GoTo 0
If Not rng1 Is Nothing Then MsgBox "Merged formulae cells in " & rng1.Address(0, 0)
If Not rng2 Is Nothing Then MsgBox "Merged constant cells in " & rng2.Address(0, 0)
End Sub

Переход по объеденённым ячейкам

imxotep

Дата: Среда, 18.11.2015, 13:38 |
Сообщение № 1

Группа: Пользователи

Ранг: Новичок

Сообщений: 22


Репутация:

0

±

Замечаний:
0% ±


Excel 2010

Добрый день. Подскажите есть ли возможность перейти на объеденённую ячейку?
Допустим есть ячейка А1 в которой объеденено 3 строки, следовательно следующая за ней ячейка будет с адресом А4, можно ли как то сразу перейти на ячейку если не известно сколько строк объеденено в А1??

 

Ответить

Manyasha

Дата: Среда, 18.11.2015, 13:49 |
Сообщение № 2

Группа: Модераторы

Ранг: Старожил

Сообщений: 2198


Репутация:

898

±

Замечаний:
0% ±


Excel 2010, 2016

imxotep, примерно так:[vba]

Код

    i = 1
    Do
        Debug.Print Cells(i, 1).Value
        i = i + Cells(i, 1).MergeArea.Cells.Count
    Loop While (Cells(i, 1)) <> «»

[/vba]


ЯД: 410013299366744 WM: R193491431804

 

Ответить

imxotep

Дата: Среда, 18.11.2015, 13:51 |
Сообщение № 3

Группа: Пользователи

Ранг: Новичок

Сообщений: 22


Репутация:

0

±

Замечаний:
0% ±


Excel 2010

Manyasha, Спасибо попробую.

 

Ответить

imxotep

Дата: Среда, 18.11.2015, 13:57 |
Сообщение № 4

Группа: Пользователи

Ранг: Новичок

Сообщений: 22


Репутация:

0

±

Замечаний:
0% ±


Excel 2010

Manyasha, у меня вывелось число 65 — это количество объединённых ячеек??

 

Ответить

Manyasha

Дата: Среда, 18.11.2015, 14:04 |
Сообщение № 5

Группа: Модераторы

Ранг: Старожил

Сообщений: 2198


Репутация:

898

±

Замечаний:
0% ±


Excel 2010, 2016

imxotep, Cells(i, 1).Value — возвращает значение ячейки.
За количество объединенных ячеек отвечает MergeArea.Cells.Count


ЯД: 410013299366744 WM: R193491431804

 

Ответить

imxotep

Дата: Среда, 18.11.2015, 14:36 |
Сообщение № 6

Группа: Пользователи

Ранг: Новичок

Сообщений: 22


Репутация:

0

±

Замечаний:
0% ±


Excel 2010

В общем получаем количество объединённых строк и на это количество сдвигаемся вниз.

 

Ответить

Manyasha

Дата: Среда, 18.11.2015, 14:46 |
Сообщение № 7

Группа: Модераторы

Ранг: Старожил

Сообщений: 2198


Репутация:

898

±

Замечаний:
0% ±


Excel 2010, 2016

В данном случае, да. Если у Вам объединены ячейки НЕ одного столбца (напр. А1:С3), то нужно писать MergeArea.Rows.Count.
Чтобы посчитать кол-во объединенных столбцов — MergeArea.Columns.Count.
Короче, работайте с MergeArea, как с обычным диапазоном (Range).


ЯД: 410013299366744 WM: R193491431804

 

Ответить

Alex_ST

Дата: Четверг, 19.11.2015, 14:36 |
Сообщение № 8

Группа: Друзья

Ранг: Участник клуба

Сообщений: 3176


Репутация:

604

±

Замечаний:
0% ±


2003

imxotep, вот Вам пара примеров работы с объединёнными ячейками:



С уважением,
Алексей
MS Excel 2003 — the best!!!

Сообщение отредактировал Alex_STЧетверг, 19.11.2015, 14:37

 

Ответить

Приведенные выше ответы выглядят так, как будто вы отсортированы.

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

Когда я построил Mappit! Я понял, что когда я разработал объединенную ячейку, отчет о том, что объединенные ячейки были частью xlBlanks

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

Sub DetectMerged()
Dim rng1 As Range
Dim rng2 As Range
On Error Resume Next
Set rng1 = Intersect(Cells.SpecialCells(xlFormulas), Cells.SpecialCells(xlBlanks))
Set rng2 = Intersect(Cells.SpecialCells(xlConstants), Cells.SpecialCells(xlBlanks))
On Error GoTo 0
If Not rng1 Is Nothing Then MsgBox "Merged formulae cells in " & rng1.Address(0, 0)
If Not rng2 Is Nothing Then MsgBox "Merged constant cells in " & rng2.Address(0, 0)
End Sub

Формулировка задачи:

Доброе время суток! Собственно в названии темы все показано, но я повторюсь. Как пройтись циклом по всей колонке? Я пишу такой код, но он доходит до первой соединенной ячейки и останавливается

Код к задаче: «Цикл по колонке содержащей объединенные ячейки»

textual

Sub tt()
    Dim cc As Range
    For Each cc In UsedRange.Columns(1).Cells
        If cc.Value = "Итого" Then MsgBox ("Stroka = " & cc.Row)
    Next
End Sub

Полезно ли:

5   голосов , оценка 4.400 из 5

Цикл 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 vba цикл по всем листам
  • Excel vba цикл до первой пустой строки
  • Excel vba цикл внутри цикла
  • Excel vba цикл row
  • Excel vba цикл for по ячейкам