转置Excel单元格组

时间:2016-01-14 15:48:44

标签: excel transpose

我有一个看起来像图像左侧的结构,我愿意转向一个看起来像右边的结构:

enter image description here

我可以通过单独复制和转置每个问题分开来轻松地做到这一点,但是要复制的问题超过一千个。有没有办法自动执行此操作?

谢谢。

3 个答案:

答案 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行以下,与原始数据中显示的模式相匹配。