如何在合并的单元格之间循环(并填充一维数组中的值)?

时间:2019-01-21 16:36:22

标签: excel vba

我想找到一种方法来循环浏览合并的单元格,例如使用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

但这很麻烦。

编辑:以下是屏幕截图: target area

这个想法是,行数是完全灵活的,取决于事务。所以有时只有一排,但实际上可以是任何一排。

我的代码使用基于命名范围的相对引用来生成此部分。

然后从丑陋的工作表(所有信息存储在单行中)中,将值馈入一维数组,然后将该数组馈入美观的工作表中。

如果工作表没有合并的单元格,则公式将看起来非常简单:

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 :(得分:0)

通过搜索“ 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

答案 1 :(得分:0)

如果要逐步浏览合并的列,则可以使用类似的

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

这将测试合并的列,然后在合并后跳到下一列。

编辑:

看到您的数据结构已添加到编辑中,您可以将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