Мне нужна помощь в преобразовании таблицы в формате таблицы в сводный формат. Ниже приведен пример данных, которые у меня есть:

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%

Мне нужно в выходной в следующем формате:

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%

Если вы видите для каждой строки Product 1 , мне нужно три строки страны и три строки типа клиента. Единственное исключение - если любая из стран типа клиента равна 0% мы можем игнорировать эти ячейки. Так, например , из приведенных выше таблиц выходных данных мы не нужны строки Japan , потому что Japan даются как 0% для Product 1

Точно так же для Product 2 нам могут не понадобиться Individual строки, поскольку они заданы как ноль. Я не знаю, как писать коды VB, поэтому попытался записать макрос, однако из-за огромного объема данных макрос не работает.

Кроме того, если это полезно

Часть A - Состоит из продукта, валюты и стоимости
Часть B - США, Великобритания и Япония - в основном перечисляет несколько стран
Часть C - Тип клиента - включает в себя Ind, Local, MNC

1 ответ1

0

Я написал код, пожалуйста, попробуйте:

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .