Excel转置公式
我对这个问题绞尽脑汁已经有一段时间了,只是不知道如何解决这个问题。我的表由我想从行转换到列的数据组组成。每一行在第一列中都有一个索引号,并且一个组中的所有行都有相同的索引Excel转置公式,excel,vba,excel-formula,transpose,Excel,Vba,Excel Formula,Transpose,我对这个问题绞尽脑汁已经有一段时间了,只是不知道如何解决这个问题。我的表由我想从行转换到列的数据组组成。每一行在第一列中都有一个索引号,并且一个组中的所有行都有相同的索引 1A 1b 1c 1d 1e 1 f 1g 1小时 2 as 2 bs 2 cs 5毫安 5 mb 5 mc 5马里兰州 我希望我的最终结果是: 1A b c d e f g h 2作为bs cs 5毫安mb mc md 是否可以使用公式或必须在VBA中执行此操作?是,这是可能的。您需要以下功能: 如果 匹配 伊斯纳 索引
1A
1b
1c
1d
1e
1 f
1g
1小时
2 as
2 bs
2 cs
5毫安
5 mb
5 mc
5马里兰州
我希望我的最终结果是:
1A b c d e f g h
2作为bs cs
5毫安mb mc md
是否可以使用公式或必须在VBA中执行此操作?是,这是可能的。您需要以下功能:
=MATCH(C1,A:A, 0)
=MATCH(C1,A:A, 1)
尽可能向下拖动单元格C2
E1
=MATCH(C1,A:A, 0)
=MATCH(C1,A:A, 1)
尽可能向下拖动单元格C2
第2页:
现在将以下公式放在表2中的单元格A1中:
=IF(ISNA(Sheet1!$D1), "", IF(Sheet1!$D1="", "", IF(COLUMN()-1+Sheet1!$D1 <=Sheet1!$E1, INDEX(Sheet1!$B:$B, COLUMN()-1+Sheet1!$D1), "")))
=IF(ISNA(Sheet1!$D1)、“”、IF(Sheet1!$D1=“”、“”)、IF(COLUMN()-1+Sheet1!$D1也可以使用宏执行此操作。以下是一种方法
要输入此宏(Sub),alt-F11打开Visual Basic编辑器。
确保项目在“项目资源管理器”窗口中高亮显示。
然后,从顶部菜单中选择插入/模块和
将下面的代码粘贴到打开的窗口中
若要使用此宏(Sub),alt-F8打开宏对话框。按名称选择宏,然后运行
Option Explicit
Sub ReArrange()
Dim vSrc As Variant, rSrc As Range
Dim vRes As Variant, rRes As Range
Dim I As Long, J As Long, K As Long
Dim lColsCount As Long
Dim Col As Collection
'Upper left cell of results
Set rRes = Range("D1")
'Assume Data in A1:Bn with no labels
Set rSrc = Range("a1", Cells(Rows.Count, "A").End(xlUp)).Resize(columnsize:=2)
'Ensure Data sorted by index number
rSrc.Sort key1:=rSrc.Columns(1), order1:=xlAscending, key2:=rSrc.Columns(2), order2:=xlAscending, MatchCase:=False, _
Header:=xlNo
'Read Source data into array for faster processing
' compared with going back and forth to worksheet
vSrc = rSrc
'Compute Number of rows = unique count of index numbers
'Collection object can only have one entry per key
' otherwise it produces an error, which we skip
Set Col = New Collection
On Error Resume Next
For I = 1 To UBound(vSrc)
Col.Add Item:=vSrc(I, 1), Key:=CStr(vSrc(I, 1))
Next I
On Error GoTo 0
'Compute Maximum Number of columns in results
' Since there is one entry per Index entry, maximum number of
' columns will be equal to the Index that has the most lines
' So we iterate through each Index and check that.
For I = 1 To Col.Count
J = WorksheetFunction.CountIf(rSrc.Columns(1), Col(I))
lColsCount = IIf(J > lColsCount, J, lColsCount)
Next I
'Set up Results array
' Need to add one to the columns to account for the column with the Index labels
ReDim vRes(1 To Col.Count, 1 To lColsCount + 1)
'Now populate the results array
K = 1
For I = 1 To Col.Count
vRes(I, 1) = vSrc(K, 1)
J = 2
Do
vRes(I, J) = vSrc(K, 2)
J = J + 1: K = K + 1
If K > UBound(vSrc) Then Exit Do
Loop Until vSrc(K, 1) <> vRes(I, 1)
Next I
'Set the results range to be the same size as our array
Set rRes = rRes.Resize(rowsize:=UBound(vRes, 1), columnsize:=UBound(vRes, 2))
'Clear the results range and then copy the results array to it
rRes.EntireColumn.Clear
rRes = vRes
'Format the width. Could also format other parameters
rRes.EntireColumn.ColumnWidth = 10
End Sub
选项显式
子重排()
尺寸vSrc作为变型,rSrc作为范围
变暗vRes作为变型,rRes作为范围
我长,J长,K长
暗淡的lColsCount尽可能长
收藏
'结果的左上角单元格
设置rRes=范围(“D1”)
'假设数据为A1:Bn,没有标签
设置rSrc=Range(“a1”,单元格(Rows.Count,“A”)。结束(xlUp))。调整大小(columnsize:=2)
'确保数据按索引编号排序
rSrc.Sort key1:=rSrc.Columns(1),order1:=xlAscending,key2:=rSrc.Columns(2),order2:=xlAscending,MatchCase:=False_
标题:=xlNo
'将源数据读入阵列以加快处理速度
“与来回查看工作表相比
vSrc=rSrc
'计算行数=索引数的唯一计数
'集合对象每个键只能有一个条目
'否则会产生一个错误,我们会跳过它
Set Col=新集合
出错时继续下一步
对于I=1至UBound(vSrc)
列添加项:=vSrc(I,1),键:=CStr(vSrc(I,1))
接下来我
错误转到0
'计算结果中的最大列数
'由于每个索引项有一个条目,因此
'列将等于具有最多行的索引
'因此,我们迭代每个索引并检查它。
对于I=1到列计数
J=工作表function.CountIf(rSrc.Columns(1),Col(I))
lColsCount=IIf(J>lColsCount,J,lColsCount)
接下来我
'设置结果数组
'需要向列中添加一个,以说明具有索引标签的列
ReDim vRes(1对列计数,1对lColsCount+1)
'现在填充结果数组
K=1
对于I=1到列计数
vRes(I,1)=vSrc(K,1)
J=2
做
vRes(I,J)=vSrc(K,2)
J=J+1:K=K+1
如果K>UBound(vSrc),则退出Do
循环直到vSrc(K,1)vRes(I,1)
接下来我
'将结果范围设置为与数组相同的大小
设置rRes=rRes.Resize(行大小:=UBound(vRes,1),列大小:=UBound(vRes,2))
'清除结果范围,然后将结果数组复制到其中
全部清除
rRes=vRes
'设置宽度的格式。还可以设置其他参数的格式
rRes.EntireColumn.ColumnWidth=10
端接头
是的,你可以用公式来做,但这有点困难。绝地波转置()
不是你想要的功能。我想你想在你的范围内设置一个循环这会在a列中查找一个值,然后连接并打印B列中的值。这更像是一个枢轴,而不是转置。非常感谢,它的工作原理很有魅力。如果你能简单解释一下它是如何工作的,我唯一的评论是。我在回答中扩展了注释。基本上,我们将数据读入一个变量数组(在VBA中处理数组比来回处理工作表更快)。然后,我们计算一个唯一的索引号列表。结果数组中的每个索引号都有一行,列数与包含最多条目的索引的列数相同。我们计算、创建数组并填充它,然后将其写入结果范围。您应该阅读有关集合对象的信息,并使用监视窗口和断点查看vSrc和vRes阵列的详细信息。单步执行宏也会有所帮助。