Excel-将行(大小不同的组)转置为列

时间:2018-11-10 20:53:41

标签: excel rows transpose

我有一些excel数据,这些数据现在都排成行,并且我想以一种简单有效的方式将它们分成几列,但我不知道该怎么做。任何建议都将受到欢迎!谢谢。

示例:在Excel中像这样

Team A
John
Team B
Peter
John
Team C
John
Peter
Oliver
Anna
Team D
Anna

进入:

Team A John
Team B Peter John
Team C John Peter Oliver Anna
Team D Anna

2 个答案:

答案 0 :(得分:0)

列到垂直列表

Sample

Option Explicit

'*******************************************************************************
' Purpose:  Processes a one-column range containing groups of title-values data,
'           transposing the titles to the first column of a range and the values
'           to columns next to the title thus creating a vertical list.
'*******************************************************************************

Sub ColumnToVerticalList()

  Const cStrSheet As String = "Sheet1"  ' Worksheet Name
  Const cLngFirstRow As Long = 2        ' First Row of Source Data
  Const cStrColumn As String = "A"      ' Column of Source Data
  Const cStrSearch As String = "Team"   ' Search String
  Const cStrCell As String = "C2"       ' Target Cell

  Dim arrSource As Variant      ' Source Array
  Dim lngArr As Long            ' Source Array Row Counter

  Dim arrTarget As Variant      ' Target Array
  Dim lngRows As Long           ' Number of Rows (Counter) in Target Array
  Dim iCols As Integer          ' Number of Columns (Counter) in Target Array
  Dim iColsTemp As Integer      ' Target Array Columns Counter
  Dim strTargetRange As String  ' Target Range

  ' Paste the calculated source range into the source array - arrSource.
  With ThisWorkbook.Worksheets(cStrSheet)
    arrSource = .Range( _
        .Cells(cLngFirstRow, cStrColumn), _
        .Cells(.Cells(Rows.Count, cStrColumn).End(xlUp).Row, cStrColumn))
  End With

  ' Calculate the number of rows and columns of the target array - arrTarget.
  iColsTemp = 1
  For lngArr = LBound(arrSource) To UBound(arrSource)
    If InStr(1, arrSource(lngArr, 1), cStrSearch, vbTextCompare) <> 0 Then
      If iColsTemp > iCols Then
        iCols = iColsTemp
      End If
      iColsTemp = 1
      Debug.Print arrSource(lngArr, 1)
      lngRows = lngRows + 1
     Else
      iColsTemp = iColsTemp + 1
    End If
  Next

  ' Calculate the target range address.
  strTargetRange = Range(Cells(Range(cStrCell).Row, Range(cStrCell).Column), _
      Cells(Range(cStrCell).Row + lngRows - 1, _
      Range(cStrCell).Column + iCols - 1)).Address

  ' Resize the target array.
  ReDim arrTarget(1 To lngRows, 1 To iCols)

  ' Write data from source array to target array.
  lngRows = 0
  iCols = 1
  For lngArr = LBound(arrSource) To UBound(arrSource)
    If InStr(1, arrSource(lngArr, 1), cStrSearch, vbTextCompare) <> 0 Then
      iCols = 1
      lngRows = lngRows + 1
      arrTarget(lngRows, 1) = arrSource(lngArr, 1)
     Else
      iCols = iCols + 1
      arrTarget(lngRows, iCols) = arrSource(lngArr, 1)
    End If
  Next

  ' Paste data of the target array into the target range
  ThisWorkbook.Worksheets(cStrSheet).Range(strTargetRange) = arrTarget

End Sub

答案 1 :(得分:0)

我猜您的真实数据比该列表长得多,所以这就是我在这种情况下要做的事情。

首先,将列表放在B列中,并添加一个公式,将“团队”复制到A列中:

[1]: https://i.stack.imgur.com/hDWJO.png

*请注意,您必须将b2中的值复制并粘贴到a2中,然后在a3上启动公式。 在单元格a3中键入公式= IF(LEFT(B3,4)=“ Team”,B3,A2)并将其向下拖动(或向下移动控件,然后向下移动d控件)。这个公式在做什么?它查看B单元格,如果它以“ Team”开头,则使用该单元格的值,否则使用上面的单元格的值(将是另一个“ Team”)。

然后,复制并粘贴值A列,以免在后续步骤后失去公式结果:

enter image description here

过滤搜索词“ team”中的B列“ player”,并删除整行:

enter image description here

现在您拥有团队的A列,球员的B列,并在C列中使用此公式:= IF(A2 = A1,CONCATENATE(C1,“”,B2),CONCATENATE(A2,“”,B2)) 。 此公式将查看“团队”列,如果不同,它将启动一个新的团队和玩家链,否则将玩家添加到团队和玩家上方的链中。

enter image description here

我希望您可以遵循这里的逻辑并完成您想做的事情。让我知道怎么回事。