【问题标题】:Convert Excel rows to columns将 Excel 行转换为列
【发布时间】:2013-11-07 21:45:38
【问题描述】:

如何将 A 列中的行转换为列,将 B 列中的行转换为单行?

这是我目前的设置:

   ColumnA   ColumnB
  Question1  Answer1
  Question2  Answer2
  Question3  Answer3
  Question4  Answer4
  Question5  Answer5
  Question1  Answer6
  Question2  Answer7
  Question3  Answer8
  Question4  Answer9
  Question5  Answer10

我想要的是:

Question1 Question2 Question3 Question4 Question5
 Answer1   Answer2   Answer3   Answer4   Answer5
 Answer6   Answer7   Answer8   Answer9   Answer10

【问题讨论】:

  • 如果没有太多这样的组,用转置粘贴将是最简单的方法...
  • 不幸的是,大约有 400000 行,但我同意最少的行,这样很容易转置它们。

标签: excel csv pivot pivot-table


【解决方案1】:

我认为这最好用 VBA 宏来解决。如果您在Sheet1 中获得了当前表并想要转换为Sheet2,那么以下宏将进行转换。

Option Explicit
Sub ConvertRows()
    Dim ws1 As Worksheet, ws2 As Worksheet
    Dim i As Integer, j As Integer
    Set ws1 = ActiveWorkbook.Sheets("Sheet1")
    Set ws2 = ActiveWorkbook.Sheets("Sheet2")

    'Lists each value from column 1
    For i = 1 To ws1.Cells(Rows.Count, 1).End(xlUp).Row Step 1
        For j = 1 To ws2.Cells(1, Columns.Count).End(xlToLeft).Column + 1 Step 1
            If ws2.Cells(1, j).Value = ws1.Cells(i, 1).Value Then Exit For
            If ws2.Cells(1, j).Value = vbNullString Then
                ws2.Cells(1, j).Value = ws1.Cells(i, 1).Value
                Exit For
            End If
        Next j
    Next i

    'Fills columns with matching values
    For i = 1 To ws1.Cells(Rows.Count, 1).End(xlUp).Row Step 1
        For j = 1 To ws2.Cells(1, Columns.Count).End(xlToLeft).Column Step 1
            If ws2.Cells(1, j).Value = ws1.Cells(i, 1).Value Then
                ws2.Cells(Rows.Count, j).End(xlUp).Offset(1, 0).Value = ws1.Cells(i, 2).Value
            End If
        Next j
    Next i
End Sub

【讨论】:

    【解决方案2】:

    非 VBA 方法:

    如果您正在处理一次性问题,处理从列到行的转换的一种简单方法是使用 INDEX() 函数。我建议在第一个目标单元格中​​使用以下内容(对于您希望放置“Question1”和“Question2”的位置):

    Question1 Destination Cell:
    =INDEX($A:$A,COLUMN(A1))
    
    Answer1 Destination Cell:
    =INDEX($B:$B,COLUMN(A1))
    

    从那里,只需将方程式复制到右侧,直到您跨越与行数一样多的列,因为这允许您的列到行转换无限期地向右扩展。

    **只要您的问答数据在您指定的 ColumnA 和 ColumnB 中,这将起作用,但可以进行相应修改(使用 COLUMN(A1) 的替代方法来定位您要移动的行)。

    并且,如果您希望在完成如上所示的一组 5 列后堆叠您的问题和答案,请按如下方式设置:

    Question1 Destination Cell:
    =INDEX($A:$A,COLUMN(A1))
    
    Answer1 Destination Cell:
    =INDEX($B:$B,COLUMN(A1))
    
    Answer6 Destination Cell:
    =INDEX($B:$B,MATCH([non-locked cell address of Answer1],$B:$B,0)+5)
    

    从那里,将这三个单元格复制到右侧的 5 列中。然后,要向下扩展,只需复制以 Answer6 开头的计算行并将其粘贴到工作表中以覆盖 ColumnA 和 ColumnB 中的行数。

    这个方法会产生这样的结果:

    Question1 Question2 Question3 Question4 Question5
     Answer1   Answer2   Answer3   Answer4   Answer5
     Answer6   Answer7   Answer8   Answer9   Answer10
    

    干杯。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-02
      相关资源
      最近更新 更多