我想找到一种方法来循环浏览合并的单元格,例如使用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
但是由于这张纸的性质-应该可以打印并且在眼睛上看起来更好-我无法做到这一点,必须找到一种方法来在合并的单元格之间进行切换。
希望此修改清除了一些内容。
我现在也正在研究建议,看看我是否可以以某种方式应用这些建议,但是如果有人知道更好的建议,那么我愿意接受所有建议。
答案 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