使用第一列关系将平面数据更改为水平

时间:2013-10-22 19:57:11

标签: excel vba

有没有人知道如何让Excel执行以下示例中显示的内容

A         |     B
================================
Apple     |     Pie
Apple     |     Sauce
Apple     |     Juice
Banana    |     Smoothie
Banana    |     Split

进入这个结构?

A        |    B         |     C      |    D      | 
==================================================
Apple    |   Pie        |    Sauce   |   Juice   |
Banana   |   Smoothie   |    Split   |           |

我一直在网上搜索,到目前为止找不到支持的方式,我想知道在尝试编写一些VBA代码之前是否有一种支持的方式。

通常的粘贴特殊> transpose不提供这种格式,因为它不应该。

我显然希望为大型数据集自动执行此操作。

2 个答案:

答案 0 :(得分:2)

我会选择VBA,但是如果你想要一个非VBA解决方案,那就看看吧。这是我很快就提出来的,我相信可以有更好的公式来实现同样的目标。

D2:D6值可以从Col A上的Pivot获得

E2有一个公式

=IF(OFFSET(INDIRECT(CELL("address",INDEX($A$2:$A$16,MATCH(D2,$A$2:$A$16,0),1))),0,1)=0,"",OFFSET(INDIRECT(CELL("address",INDEX($A$2:$A$16,MATCH(D2,$A$2:$A$16,0),1))),0,1))

F2有一个公式

=IF(OFFSET(INDIRECT(CELL("address",INDEX($A$2:$A$16,MATCH(D2,$A$2:$A$16,0),1))),1,1)=0,"",OFFSET(INDIRECT(CELL("address",INDEX($A$2:$A$16,MATCH(D2,$A$2:$A$16,0),1))),1,1))

G2有一个公式

=IF(OFFSET(INDIRECT(CELL("address",INDEX($A$2:$A$16,MATCH(D2,$A$2:$A$16,0),1))),2,1)=0,"",OFFSET(INDIRECT(CELL("address",INDEX($A$2:$A$16,MATCH(D2,$A$2:$A$16,0),1))),2,1))

现在只需复制公式即可。

enter image description here

答案 1 :(得分:2)

如果您想尝试使用宏,请尝试一下:

Sub TwoDimension()
    Dim s1 As Worksheet, s2 As Worksheet
    Dim N As Long, i As Long, K As Long
    Dim ii As Long
    Set s1 = Sheets("Sheet1")
    Set s2 = Sheets("Sheet2")
    s1.Range("A1:B1").Copy s2.Range("A1:B1")
    N = s1.Cells(Rows.Count, "A").End(xlUp).Row
    K = 3
    ii = 1
    For i = 2 To N
        If s1.Cells(i, 1) = s1.Cells(i - 1, 1) Then
            s2.Cells(ii, K) = s1.Cells(i, 2)
            K = K + 1
        Else
            ii = ii + 1
            s2.Cells(ii, 1) = s1.Cells(i, 1)
            s2.Cells(ii, 2) = s1.Cells(i, 2)
            K = 3
        End If
    Next i
End Sub

数据将在单独的工作表上重新格式化。