如何将 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
如果所有行的列数都相同,则可以使用 INDEX
、INT
、COUNTA
和 MOD
进行分解。
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)
,也就是0
。COUNTA
只是把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
我有 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
如果所有行的列数都相同,则可以使用 INDEX
、INT
、COUNTA
和 MOD
进行分解。
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)
,也就是0
。COUNTA
只是把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
)
之前:
之后:
代码:
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