如何将 excel 中的多列转换为一列,但保留每列的第一个单元格并在新行中重复?

How to convert many columns to one column in excel but keep the 1st cell of each column and repeat it in new rows?

我有 excel 文档,如下所示:

我希望它像:

*逗号(,)表示数据在横向不同的单元格中。

是否有任何 vb 宏或表达式可以做到这一点?

一个简单的解决方案是使用 Split

Sub TransferIt()

Const SEP = ","

Dim rg As Range
Dim vdat As Variant
Dim lDat As Variant
Dim i As Long, j As Long
Dim col As Collection

    ' Assumption data is in column A, adjust accordingly
    Set rg = Range("A1:A4")
    vdat = WorksheetFunction.Transpose(rg)

    Set col = New Collection

    For i = LBound(vdat) To UBound(vdat)
        lDat = Split(vdat(i), SEP)
        For j = LBound(lDat) + 1 To UBound(lDat)
            ' first field always contains female or male
            col.Add lDat(LBound(lDat)) & SEP & lDat(j)
        Next j
    Next i

    vdat = collectionToArray(col)

    ' Write data into column B
    Range("B1").Resize(UBound(vdat) + 1) = WorksheetFunction.Transpose(vdat)

End Sub

' Source: http://www.iwebthereforeiam.com/iwebthereforeiam/2004/06/excel-vba-code-to-convert-coll.html
Function collectionToArray(c As Collection) As Variant()
    Dim a() As Variant: ReDim a(0 To c.Count - 1)
    Dim i As Integer
    For i = 1 To c.Count
        a(i - 1) = c.Item(i)
    Next
    collectionToArray = a
End Function

如果所有行的列数都相同,则可以使用 INDEXINTCOUNTAMOD 进行分解。

A 列:

=INDEX(Sheet1!$A:$D,1+INT((ROW()-1)/(COUNTA(Sheet1!:)-1)),1)

B 列:

=INDEX(Sheet1!$A:$D,1+INT((ROW()-1)/(COUNTA(Sheet1!:)-1)),2+MOD(ROW()-1,COUNTA(Sheet1!:)-1))

其中 Sheet1!$A:$D 是 'Input' 范围,Sheet1!: 是该范围内具有整行数据的任意行。

INDEX 可让您获得特定的 row/column 范围。我们的范围是 Sheet1!$A:$D,两个公式的行是相同的:

1+INT((ROW()-1)/(COUNTA(Sheet1!:)-1)),

对于 n 行,这将是 1,对于接下来的 n,这将是 2,等等,其中 n 是一行中的单元格数 减去 起始列(即每个性别有多少个名字)

(INT去掉数字的小数部分,所以INT(3/4)就是INT(0.75),也就是0COUNTA只是把non-blank 细胞)

两者的区别在于Column。在 A 列中,我们只需要 first 列,因此 Column 是 1。在 B 列中,我们希望第一列之后的第 x 项,其中 x A) 每行加 1,B) 重置为1 当我们从男性变为女性(或更高)

现在,MOD 函数让我们可以相当简单地做到这一点:MOD(0, 3) 是 0,MOD(1, 3) 是 1,MOD(2, 3) 是 2,MOD(3, 3) 回到 0。我们只需要从 0 开始行计数(从行中减去 1,然后将其添加回 MOD 之外)并从 items-per-row 中删除第一列(从 COUNTA 中减去 1 , 在 MOD)

外加 1

之前:

之后:

代码:

Sub settupp()
Set s1 = Sheets("Sheet1")
Set s2 = Sheets("Sheet2")
s1.Activate
n = Cells(Rows.Count, 1).End(xlUp).Row
k = 1
For i = 1 To n
namee = Cells(i, 1).Value
For j = 2 To 4
numberr = Cells(i, j).Value
s2.Cells(k, 1) = namee
s2.Cells(k, 2) = numberr
k = k + 1
Next
Next
End Sub