Как перебрать объединенные ячейки (и заполнить значения из одномерного массива)? - PullRequest
0 голосов
/ 21 января 2019

Я хотел бы найти способ циклически проходить через объединенные ячейки, например, используя цикл For ... Next.

Мне удалось только заставить его работать так:

Cells(1,1).Select

For i=1 to 6
      Selection.Value = arrData(i)
      Selection.Offset(0,1).Select
Next i

Я ненавижу использовать .Select - но если я использую .Offset(0,i), он не будет перемещаться из объединенной ячейки в объединенную ячейку, а будет просто количеством столбцов из исходной ячейки.

Для получения более подробной информации -Я копирую значения из csv-подобного формата в более отформатированный выходной лист, который затем предполагается экспортировать с кучей объединенных ячеек.

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

Мой единственный рабочий раствор без .Select должен использовать .Cells

Пример:

For row=0 to 12
   with rng.Offset(1,0)
      .cells(row+1,1)=arrdata(1+(row*6))
      .cells(row+1,3)=arrdata(2+(row*6))
      .cells(row+1,7)=arrdata(3+(row*6))
      .cells(row+1,9)=arrdata(4+(row*6))
      .cells(row+1,14)=arrdata(1+(row*6))
      .cells(row+1,16)=arrdata(1+(row*6))
   End with
Next row

но это довольно тяжело.

РЕДАКТИРОВАТЬ : Вот скриншот: целевая область

Идея состоит в том, что количество строк является полностью гибкимв зависимости от сделки.Поэтому иногда есть только одна строка, но на самом деле может быть что угодно.

Мой код генерирует этот раздел, используя относительные ссылки на основе именованных диапазонов.

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

Если на листе нет объединенных ячеек, формула будет выглядеть довольно просто:

Dim i as integer, j as integer
Dim ws as worksheet: set ws = Worksheets("Printable")

'data array has already been filled with info in a linear order beforehand

k=1
For i=1 to item_qt 'number of cost items lines
   For j=1 to item_col 'number of detail columns (in this section)
      ws.Range("item_title").Offset(1,0).Cells(i,j).Value=data(k)
      k=k+1
   Next j
Next i

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

Надеюсь, что это Правило прояснило некоторые вещи.

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

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Если вы проходите через объединенные столбцы, вы можете использовать что-то вроде

For i = startColumn To endColumn
    If Cells(row,StartColumn).MergeArea.Columns.Count > 1 Then
        'Do Stuff
        i = i + Cells(row,StartColumn).MergeArea.Columns.Count - 1
    End If
    Debug.Print i
Next i

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

EDIT:

Видя, что ваша структура данных добавлена ​​в ваши правки, вы можете включить метод MergeArea.Columns.Count в ваш цикл For j-Next j, например

k=1
For i=1 to item_qt 'number of cost items lines
   For j=1 to item_col 'number of detail columns (in this section) <-this will need to
                       'be the total number of columns, not just the number of 
                       'detail fields
      ws.Range("item_title").Offset(1,0).Cells(i,j).Value=data(k)
      j = j + ws.Range("item_title").Offset(1,0).Cells(i,j).MergeArea.Columns.Count - 1
      k=k+1
   Next j
Next i
0 голосов
/ 21 января 2019

Поиском "Excel найти объединенные ячейки VBA" Google находит:

Как определить и выбрать все объединенные ячейки в Excel?
https://www.extendoffice.com/documents/excel/962-excel-select-merged-cells.html

Sub FindMergedcells()
'updateby Extendoffice 20160106
    Dim x As Range
    For Each x In ActiveSheet.UsedRange
        If x.MergeCells Then
            x.Interior.ColorIndex = 8
        End If
    Next
End Sub



и

2 практических метода поиска объединенных ячеек в вашем Excel
https://www.datanumen.com/blogs/2-practical-methods-find-merged-cells-excel/

Sub FindMerge()
    Dim cel As Range
    For Each cel In ActiveSheet.Range(“A1:G13”)
        If cel.MergeCells = True Then
            ‘change the color to make it different
            cel.Interior.Color = vbYellow
        End If
    Next cel
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...