Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel转置公式_Excel_Vba_Excel Formula_Transpose - Fatal编程技术网

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中执行此操作?

是,这是可能的。您需要以下功能:

  • 如果
  • 匹配
  • 伊斯纳
  • 索引
  • 假设表1中的数据位于A列和B列:

    C1:

    将值“1”放在单元格C1中

    C2:

    =C1+1

    根据需要向下拖动

    D1

    =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阵列的详细信息。单步执行宏也会有所帮助。