答案 0 :(得分:0)
VBA解决方案非常自然。以下子集合从用户收集两个1单元格范围,原始结构的顶部单元格和要放置数据的范围的左上角。它遍历源列,将数据传输到目标,源列中有空白单元格,导致在目标范围内启动另一行数据:
Sub TransposeBlocks()
Dim sourceColumn As Range, target As Range
Dim A As Variant
Dim i As Long, j As Long, k As Long
Set sourceColumn = Application.InputBox("Click the top cell in source data", , , , , , , 8)
Set target = Application.InputBox("Click the corner of the target range", , , , , , , 8)
Application.ScreenUpdating = False
A = Range(sourceColumn, Cells(Rows.Count(), sourceColumn.Column).End(xlUp)).Value
For i = 1 To UBound(A)
If Len(Trim(A(i, 1))) > 0 Then
target.Offset(j, k).Value = A(i, 1)
k = k + 1
Else
k = 0
j = j + 1
End If
Next i
Application.ScreenUpdating = True
End Sub
上面的代码假设一个空行分隔每个问题块。如果这个假设是假的,那么很容易调整代码,以便它找到匹配模式Question*
的单元格,并在遇到这样的行时在目标区域开始一个新行。
答案 1 :(得分:0)
如果元素数量保持不变,您可以使用Indirect
来解决它。
=INDIRECT("A"&(ROW(C1))*6+COLUMN(C1)-7)
答案 2 :(得分:0)
如果没有VBA,您可以按照以下方式执行此操作[假设每个问题有4个值,您知道问题的数量,当前数据全部在B列,您想要在D列中新的'问题x'列,和值是文本]:
在D1中,输入以下内容并向下拖动[向下拖动等于您的问题数量的行数,或者向下拖动直到出现错误]:
="Question "&ROW()
如果你想让第一个问题在第2行,你需要像这样调整[或创建一个不同的迭代方法,例如使用另一个辅助列]:
="Question "&ROW()-1
然后在E1中,您有上面的第一个“A”,请输入以下内容:
=INDEX(B:B,MATCH(D1,B:B,0)+1)
然后在F1中,您有上面的第一个“B”,请输入以下内容:
=INDEX(B:B,MATCH(D1,B:B,0)+2)
然后在F1中,您拥有上面的第一个“C”,请输入以下内容:
=INDEX(B:B,MATCH(D1,B:B,0)+3)
然后在F1中,您有上面的第一个“D”,请输入以下内容:
=INDEX(B:B,MATCH(D1,B:B,0)+4)
这样做是在列B中搜索匹配“问题x”的行#,其中x =用于在列D中创建ID的行号。然后它返回下面1行,下面2行的值,3行以下或4行以下,与原始数据中显示的模式相匹配。