Microsoft Excel

Herbers Excel/VBA-Archiv

Pivot Daten strukturieren

Betrifft: Pivot Daten strukturieren von: Sebastian
Geschrieben am: 23.09.2014 16:02:00

Hallo zusammen,

ich habe Daten in folgender Struktur vorliegen (siehe Link)

https://www.herber.de/bbs/user/92770.xlsx

Und möchste diese mit Pivot oder anderst in folgede Struktur bringen. (siehe Link)

Für jede Teilenummer soll demnach nur noch eine Zeile entstehen.

  

Betrifft: AW: Pivot Daten strukturieren von: fcs
Geschrieben am: 23.09.2014 17:35:32

Hallo Sebastian,

per Pivottabellenbericht kannst du deine Liste nicht in die gewünschte Struktur bringen.

Das geht nach meiner Einschätzung nur per Makkro.

Nachfolgend ein entsprechendes Makro, das du ggf. noch ein wenig anpassen muss.
Einfügen musst du es in einem allgemeinen Modul der Datei im VBA-Editor.

Gruß
Franz

Sub Aufbereiten_Teile_Preise()
  Dim wksTeile As Worksheet
  Dim wksErgebnis As Worksheet
  Dim ZeileE As Long, ZeileT As Long, SpalteE As Long
  Dim varTeil, varWerk, varLief, varCur, varPreis
  Dim arrTeile As Variant, arrErgebnis As Variant
  
  Set wksTeile = Worksheets("Tabelle1")
  Set wksErgebnis = Worksheets("Tabelle3")
  
  With wksTeile
    arrTeile = .Range(.Cells(7, 2), .Cells(.Rows.Count, 2).End(xlUp).Offset(0, 4))
  End With
  
  ReDim arrErgebnis(LBound(arrTeile, 1) To UBound(arrTeile, 1), 1 To 28)
  
  ZeileE = LBound(arrErgebnis, 1) - 1
  
  For ZeileT = LBound(arrTeile, 1) To UBound(arrTeile, 1)
    varWerk = arrTeile(ZeileT, 2)
    varLief = arrTeile(ZeileT, 3)
    varCur = arrTeile(ZeileT, 4)
    varPreis = arrTeile(ZeileT, 5)
    If varTeil <> arrTeile(ZeileT, 1) Then
      varTeil = arrTeile(ZeileT, 1)
      ZeileE = ZeileE + 1
      arrErgebnis(ZeileE, 1) = varTeil
    End If
    SpalteE = 0
    Select Case varWerk
      Case "EU": SpalteE = 2
      Case "JP": SpalteE = 11
      Case "US": SpalteE = 20
    End Select
    If SpalteE > 0 Then
      If arrErgebnis(ZeileE, SpalteE) = "" Then
        
      ElseIf arrErgebnis(ZeileE, SpalteE + 3) = "" Then
        SpalteE = SpalteE + 3
      ElseIf arrErgebnis(ZeileE, SpalteE + 6) = "" Then
        SpalteE = SpalteE + 6
      Else
        SpalteE = 0
      End If
    End If
    If SpalteE > 0 Then
      arrErgebnis(ZeileE, SpalteE) = varLief
      arrErgebnis(ZeileE, SpalteE + 1) = varCur
      arrErgebnis(ZeileE, SpalteE + 2) = varPreis
    End If
  Next ZeileT
  With wksErgebnis
    With .UsedRange
      ZeileT = .Row + .Rows.Count - 1
    End With
    If ZeileT > 3 Then
      .Range(.Rows(3), .Rows(ZeileT)).Clear
    End If
    .Cells(3, 2).Resize(UBound(arrErgebnis, 1), 28) = arrErgebnis
    With .Cells(3, 2).Resize(ZeileE, 28)
      .Borders.LineStyle = xlContinuous
      .HorizontalAlignment = xlCenter
    End With
    .Activate
  End With
  Erase arrTeile, arrErgebnis
End Sub



  

Betrifft: AW: Pivot Daten strukturieren von: Sebastian
Geschrieben am: 23.09.2014 19:15:57

Hallo Franz,

vielen Dank für deine schnelle Antwort. Ich habe bereits einige Tests gemacht. Funtioniert bisher sehr gut. Ich schaue es mir morgen noch genauer an. Muss noch weiter Werke hinzufügen. Hoffe das ich das bei deinem Code schaffe. :-)

Meld mich morgen nochmal.

Nochmals Danke und Grüße

Sebastian


  

Betrifft: AW: Pivot Daten strukturieren von: Sebastian
Geschrieben am: 23.09.2014 19:36:22

Hallo Franz,

ich hatte nun doch die Möglichkeit heute noch genauer drauf zu schauen. Ich versteh den Code nicht ganz.

Könntest du mir bitte noch sagen wie ich das Makro so anpasse, dass ich insgesamt 9 Werke nebeneinander stehen habe.

Hatte im Bsp nur 3 aufgelistet, die Orginaldaten enthalen aber 9.

Danke und Gruß.


  

Betrifft: AW: Pivot Daten strukturieren von: Sebastian
Geschrieben am: 24.09.2014 10:45:47

Habe den Code noch noch anpassen können. Funktioniert perfekt. Danke :-)


  

Betrifft: AW: Daten-Liste neu strukturieren von: fcs
Geschrieben am: 24.09.2014 11:33:31

Hallo Sebastian,

für 9 Werke muss im Code die 28 (=Anzahl der Spalten im Ergebnisarray) geändert werden in (1 + Anzahlwerke * 9) und es müssen entsprechende Case-Zeilen eingefügt werden, wobei die Nummer der Spalte zum Werk um jeweils 9 erhöht wird.

Gruß
Franz

Sub Aufbereiten_Teile_Preise_neu()
  Dim wksTeile As Worksheet
  Dim wksErgebnis As Worksheet
  Dim ZeileE As Long, ZeileT As Long, SpalteE As Long
  Dim varTeil, varWerk, varLief, varCur, varPreis
  Dim arrTeile As Variant, arrErgebnis As Variant
  Dim AnzahlWerke As Integer                            '##2014-09-24
  
  AnzahlWerke = 9  'Anzahl Werke                        '##2014-09-24
  
  Set wksTeile = Worksheets("Tabelle1")
  Set wksErgebnis = Worksheets("Tabelle3")
  
  
  With wksTeile
    arrTeile = .Range(.Cells(7, 2), .Cells(.Rows.Count, 2).End(xlUp).Offset(0, 4))
  End With
  
  ReDim arrErgebnis(LBound(arrTeile, 1) To UBound(arrTeile, 1), 1 To (1 + AnzahlWerke * 9)) '## _
2014-09-24
  
  ZeileE = LBound(arrErgebnis, 1) - 1
  
  For ZeileT = LBound(arrTeile, 1) To UBound(arrTeile, 1)
    varWerk = arrTeile(ZeileT, 2)
    varLief = arrTeile(ZeileT, 3)
    varCur = arrTeile(ZeileT, 4)
    varPreis = arrTeile(ZeileT, 5)
    If varTeil <> arrTeile(ZeileT, 1) Then
      varTeil = arrTeile(ZeileT, 1)
      ZeileE = ZeileE + 1
      arrErgebnis(ZeileE, 1) = varTeil
    End If
    
    'Spalte des Werks ermitteln
    SpalteE = 0
    Select Case varWerk
      Case "EU": SpalteE = 2
      Case "JP": SpalteE = 11
      Case "US": SpalteE = 20
      Case "X4": SpalteE = 29               '##2014-09-24
      Case "X5": SpalteE = 38               '##2014-09-24
      Case "X6": SpalteE = 47               '##2014-09-24
      Case "X7": SpalteE = 56               '##2014-09-24
      Case "X8": SpalteE = 65               '##2014-09-24
      Case "X9": SpalteE = 74               '##2014-09-24
    End Select
    
    If SpalteE > 0 Then
      If arrErgebnis(ZeileE, SpalteE) = "" Then
        
      ElseIf arrErgebnis(ZeileE, SpalteE + 3) = "" Then
        SpalteE = SpalteE + 3
      ElseIf arrErgebnis(ZeileE, SpalteE + 6) = "" Then
        SpalteE = SpalteE + 6
      Else
        SpalteE = 0
      End If
    End If
    If SpalteE > 0 Then
      arrErgebnis(ZeileE, SpalteE) = varLief
      arrErgebnis(ZeileE, SpalteE + 1) = varCur
      arrErgebnis(ZeileE, SpalteE + 2) = varPreis
    End If
  Next ZeileT
  With wksErgebnis
    With .UsedRange
      ZeileT = .Row + .Rows.Count - 1
    End With
    If ZeileT > 3 Then
      .Range(.Rows(3), .Rows(ZeileT)).Clear
    End If
    .Cells(3, 2).Resize(UBound(arrErgebnis, 1), (1 + AnzahlWerke * 9)) = arrErgebnis '##2014-09- _
24
    With .Cells(3, 2).Resize(ZeileE, (1 + AnzahlWerke * 9))            '##2014-09-24
      .Borders.LineStyle = xlContinuous
      .HorizontalAlignment = xlCenter
    End With
    .Activate
  End With
  Erase arrTeile, arrErgebnis
End Sub