Tablo formatındaki verilerin pivot formatına dönüştürülmesi


0

Tablo biçiminde olan tabloyu bir pivot biçimine dönüştürmede yardıma ihtiyacım olacak. Aşağıda sahip olduğum örnek veriler:

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%

Çıktıda aşağıdaki biçimde ihtiyacım var:

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%

Her bir sıra için görürseniz Product 1, üç sıra ülkeye ve üç sıra müşteri türüne ihtiyacım var. Bunun tek istisnası, müşteri türlerinden herhangi birinin ülkesinden 0%biriyse, bu hücreleri görmezden gelebilirsek. Yukarıdaki çıktı tablodan örneğin ihtiyacımız olmayabilir Yani Japançünkü satırları Japanolarak verilir 0%içinProduct 1

Benzer şekilde Product 2, Individualsatırlara ihtiyacımız olmayabilir, çünkü sıfır olarak verilir. Ben vb kodları yazmayı bilmiyorum, bu yüzden makro kaydetmeyi denedim, ancak büyük veri hacmi nedeniyle makro çalışmıyor.

Ayrıca, eğer faydalıysa

Bölüm A - Ürün, Para Birimi ve Değerden Oluşur
Bölüm B - ABD, İngiltere ve Japonya - temel olarak birkaç ülke listeler
Bölüm C - Müşteri tipi - Ind, Local, MNC dahil


VBA kodları yazmayı bilmiyorum, bu yüzden makro kaydetmeyi denedim. Böylece tüm kombinasyonlar için çoklu satırlar oluşturuldu ve sonra index ve match formülünü ve ayrıca sumif formülünü kullandı. Ancak bunun sonu, excel, verilerin büyük hacmi nedeniyle askıda kalıyor. Eğer bütün kombinasyonları yaratırsam, 10 lakh sıraya çıkar, böylece çalışmaz.
user3197779

Değerler her zaman aynıysa, bir makro kaydetmeyi ve buradan başlamayı deneyebilirsiniz. Bir for eachdöngü kullanmak işe yarayabilir.
Raystafarian

Merhaba Raystafarian, Değerlerden bahsettiğinizde sütun başlıklarını kastediyorsunuz (örneğin, ürün, para birimi, değer, ABD, japonya vb.). Eğer evet ise, değerler veya başlık sabit olacaktır. Makroyu kaydederken karşılaştığım tek sorun, örneğin her ürün için 9 satır oluşturmak gibi satırlar oluşturmaktır. Yaklaşık 10 lakhs satırım var (gerçek verilerde), sonra indeks ve eşleşme formülünü kullanıyorum. Bu emin değilim ve kod yazma konusunda en az bilgiye sahibim.
user3197779

Buraya yükleyemediğim excel dosyasındaki veriler var, bu yüzden e-posta adresinizi bildirirseniz, dosyayı size gönderebilirim. ya da dosyayı sizinle paylaşabileceğim herhangi bir yoldan bildirin.
user3197779

Biri bana bu konuda yardımcı olabilir mi? Raystafarian benim için bir kod yazmak mümkün müdür?
kullanici3197779

Yanıtlar:


0

Bir kod yazdım, lütfen deneyin:

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.