Como converter dados em formato de tabela para formato pivot

0

Eu precisaria de ajuda para converter a tabela que está no formato de tabela para um formato dinâmico. Abaixo estão os dados da amostra que eu tenho:

Product     Currency    Value   US   UK   Japan     Ind  Local  MNC
Product 1    USD         200    56%  22%    0%      13%   68%    19%
Product 2    USD         300    67%  18%    15%      0%   85%    15%
Product 3    GBP         400    13%  68%    19%     67%   18%    15%

Eu preciso da saída no formato abaixo:

Product    Currency Value 1 Region   Customer     Value 2   Value 3
Product 1   USD      200    US         Ind           56%    13%
Product 1   USD      200    US         Local         56%    68%
Product 1   USD      200    US         MNC           56%    19%
Product 1   USD      200    UK         Ind           22%    13%
Product 1   USD      200    UK         Local         22%    68%
Product 1   USD      200    UK         MNC           22%    19%
Product 1   USD      200    Japan      Ind            0%    13%
Product 1   USD      200    Japan      Local          0%    68%
Product 1   USD      200    Japan      MNC            0%    19%

Se você vir para cada linha de Product 1 , preciso de três linhas de país e de três linhas de tipo de cliente. A única exceção é se um dos países do tipo de cliente for 0% , podemos ignorar essas células. Assim, por exemplo, da tabela de saída acima, podemos não precisar das Japan linhas porque Japan é dado como 0% para Product 1

Da mesma forma, para Product 2 , talvez não precisemos de Individual linhas porque é dado como zero. Eu não sei como escrever códigos vb, então tentei gravar macro, no entanto, devido ao enorme volume de dados, a macro não funciona.

Além disso, se for útil

Parte A - Consiste em Produto, Moeda e Valor
Parte B - EUA, Reino Unido e Japão - basicamente lista poucos países Parte C - Tipo de cliente - inclui Ind, Local, MNC

    
por user3197779 24.01.2014 / 12:40

1 resposta

0

Eu escrevi um código, por favor tente:

Option Explicit

Public Sub customePivot()
    Call makePivot(Sheets("Sheet1"), Sheets("Sheet2"))
End Sub

Private Sub makePivot(sourceWs As Worksheet, DestWs As Worksheet, Optional startRow As Long = 2)
    Dim i As Long, j As Integer, k As Integer, lastRow As Long
    Dim strTemp As String

    lastRow = startRow
    For i = startRow To sourceWs.Rows.Count
        strTemp = Trim(sourceWs.Cells(i, 1).Value & "")
        If (strTemp = "") Then Exit For
        '
        If (Val(sourceWs.Cells(i, 4).Value & "") <> 0) Or (Val(sourceWs.Cells(i, 7).Value & "") <> 0) Then
            For j = 1 To 3
                For k = 1 To 3
                    Call addNewRow(DestWs, lastRow, _
                                   (sourceWs.Cells(i, 1).Value & ""), (sourceWs.Cells(i, 2).Value & ""), (sourceWs.Cells(i, 3).Value & ""), _
                                   (sourceWs.Cells(1, 3 + j).Value & ""), (sourceWs.Cells(1, 6 + k).Value & ""), _
                                   (sourceWs.Cells(i, 3 + j).Value & ""), (sourceWs.Cells(i, 6 + k).Value & ""))
                    lastRow = lastRow + 1
                Next k
            Next j
        End If
    Next i
End Sub

Private Sub addNewRow(ws As Worksheet, inRow As Long _
                    , productI As String, currencyI As String, valueI As String _
                    , regionI As String, CustomerI As String _
                    , valu2 As String, value3 As String)
    '
    ws.Cells(inRow, 1).Value = productI
    ws.Cells(inRow, 2).Value = currencyI
    ws.Cells(inRow, 3).Value = valueI
    ws.Cells(inRow, 4).Value = regionI
    ws.Cells(inRow, 5).Value = CustomerI
    ws.Cells(inRow, 6).Value = valu2
    ws.Cells(inRow, 7).Value = value3
End Sub
    
por 18.03.2015 / 20:20