![]() |
Betrifft: Extrem große Datenmengen verarbeiten und zuordnen
von: Barry White
Geschrieben am: 17.11.2014 17:42:26
Hallo,
ich habe folgende Aufgabe: Herunterbrechen von sehr großen Sammelrollen in kleinere funktionelle Einheiten (mehrere Einzelrollen), Dazu muss ich für die Sammelrollen herausfinden, welche TA sie enthalten und in welchen anderen Rollen diese TA enthalten sind.
Ziel: E:DE:SD_CAM MANAGER FOR DE enthält als einzige Rolle TA Z4D1 behalten
TA Z4D1 auch in Einzelrollen E:DE:Create Sales Order, etc. enthalten, nicht behalten
Datenmaterial: Abruf aus SAP R/3
Also Rolle E:DE:SD_CAM MANAGER FOR DE - TA Z4D1 - in E:DE:Create Sales Order, E:DE:Change Sales Order, etc.
Problem: 135.000 Zeilen, 230 Spalten, 1.215.000 Zellen
Auch eine Darstellung als Pivottabelle ist absolut nicht hilfreich, da es sich um extrem viele Daten handelt, die so nicht übersichtlich dargestellt werden können.
![]() ![]() |
Betrifft: AW: Extrem große Datenmengen verarbeiten und zuordnen
von: Barry White
Geschrieben am: 17.11.2014 17:44:15
https://www.herber.de/bbs/user/93833.xlsx
Da ist die Datei (ist nur eine Musterdatei, nicht die tatsächliche, die ist einfach zu groß), ich weiß aber nicht wie man sie hier reinstellt
![]() ![]() |
Betrifft: AW: Extrem große Datenmengen verarbeiten und zuordnen
von: Barry White
Geschrieben am: 17.11.2014 17:45:42
Für Eure Hilfe wäre ich sehr dankbar
![]() ![]() |
Betrifft: Extrem große Datenmengen verarbeiten und zuordnen
von: Erwin
Geschrieben am: 17.11.2014 20:36:42
Hallo Barry,
1. wenn unerledigt, dann Frage auf offen stellen (also Haken rein in Antwortformular)
2. für Excel ist das nicht wenig, vor allem bei den vielen Spalten; überleg mal ob das evtl besser in Access zu machen ist
3. ich habe keine Lösung
Grüße - Erwin
![]() ![]() |
Betrifft: AW: Extrem große Datenmengen verarbeiten und zuordnen
von: Barry White
Geschrieben am: 18.11.2014 04:53:22
Hallo Erwin,
Danke für Deine Antwort.
Bei der Spaltenzahl habe ich mich geirrt, so viele sind es gar nicht.
In der Mustertabelle in Tab Daten
Bereich - User ID - Rollenname - Role Type - TA -TA Beschreibung - CLUSTER - Lager - Sales Org
Wir sortieren nur nach Rollenname, Rollentyp (Sammel- oder Einzelrolle) und TA.
Es sind allerdings in Wirklichkeit tatsächlich 135.000 Zeilen.
Ich dachte, für Excel-Füchse sei das kein Problem. Vielleicht sind es ja auch drei Arbeitsschritte.
Tab Daten
Spalte C - Rollenname
Spalte D - Rollentyp (Sammel- oder Einzelrolle)
Spalte E - TA
Tab Ergebnis
Suche Sammelrolle
Sammelrolle A
Spalte F - alle TAs zu Sammelrolle A
Sammelrolle A - TA 1
Sammelrolle A - TA 2
Sammelrolle A - TA 3
(das lässt sich mit SVWEIS noch relativ einfach machen)
Jetzt kommt es:
Nimm TA 1 aus Sammelrolle A und suche aus Tab Daten alle Rollennamen, die diese TA enthalten.
Auswertung:
ROT: TA 1 kommt in Sammelrolle A, Sammelrolle B, Einzelrolle X vor, Konsequenz: LÖSCHEN
GRÜN: TA 3 nur und ausschließlich in Sammelrolle A enthalten, Konsequenz: BEHALTEN
Ziel:
Identifizierung von TA, die nur und ausschließlich in der Sammelrolle enthalten sind.
Herauslöschen von TA, die in der Sammelrolle enthalten sind.
Hört sich doch eigentlich gar nicht so schwer an, nur ich weiß nicht, wie ich dahinkomme.
Vielen Dank und Gruss
Gruss
![]() ![]() |
Betrifft: AW: Extrem große Datenmengen verarbeiten und zuordnen
von: fcs
Geschrieben am: 18.11.2014 16:53:38
Hallo Barry,
hier mal ein Ansatz. Ich bin mir aber aber nicht sicher, ob ich die Verarbeitung der Einzelrollen korrekt verstanden hab. Im Moment werden sie ignoriert.
Gruß
Franz
'Erstellt unter Excel 2010 'Code in einem allgemeinen Modul Sub TA_Sortieren_extrahieren() ' ' Sortieren Makro ' Dim wksData As Worksheet, wksErgebnis As Worksheet Dim Zeile_D As Long, Zeile_D1 As Long, Zeile_DL As Long, Spalte_DL As Long Dim arrData, arrErgebnis, iCount As Integer, iCount2 As Long, Spalte Dim strRolle As String, strTA As String ' Set wksData = ActiveWorkbook.Worksheets("Daten") Set wksErgebnis = ActiveWorkbook.Worksheets("Ergebnis") With wksData 'Daten sortieren nach Role Type / Tellenname / TA If .AutoFilterMode = True Then If .FilterMode = True Then .ShowAllData Else .UsedRange.AutoFilter End If .AutoFilter.Sort.SortFields.Clear .AutoFilter.Sort.SortFields.Add Key:=.Range("D2"), _ SortOn:=xlSortOnValues, Order:=xlDescending, _ DataOption:=xlSortNormal .AutoFilter.Sort.SortFields.Add Key:=.Range("C2"), _ SortOn:=xlSortOnValues, Order:=xlAscending, _ DataOption:=xlSortNormal .AutoFilter.Sort.SortFields.Add Key:=.Range("E2"), _ SortOn:=xlSortOnValues, Order:=xlAscending, _ DataOption:=xlSortNormal With .AutoFilter.Sort .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With 'letzte Daten-Zeile ermitteln Zeile_DL = .Cells(.Rows.Count, 1).End(xlUp).Row 'letzte Daten-Spalte setzen/berechnen Spalte_DL = 9 ' .Cells(1, .Columns.Count).End(xlToLeft).Column 'Daten in Array einlesen arrData = .Range(.Cells(1, 1), .Cells(Zeile_DL, Spalte_DL + 1)) 'Titelzeile als zu übernehmen kennzeichnen arrData(1, Spalte_DL + 1) = True: iCount2 = 1 For Zeile_D = 2 To Zeile_DL 'Prüfen, ob Zeile schon mit True oder False gekennzeichnet wurde If IsEmpty(arrData(Zeile_D, Spalte_DL + 1)) Then 'Rollenname in Variable einlesen, wenn er wechselt If strRolle <> arrData(Zeile_D, 3) Then strRolle = arrData(Zeile_D, 3) End If 'Prüfen, ob Sammelrolle If arrData(Zeile_D, 4) = "Sammelrolle" Then 'TA in Variable einlesen strTA = arrData(Zeile_D, 5) 'Zähler auf 1 setzen iCount = 1 'Liste bis zum Ende abarbeiten For Zeile_D1 = Zeile_D + 1 To Zeile_DL 'Prüfen, ob TA übereinstimmt If arrData(Zeile_D1, 5) = strTA Then 'Prüfen, ob Sammelrolle If arrData(Zeile_D1, 4) = "Sammelrolle" Then 'Prüfen, ob Rollenname verschieden If arrData(Zeile_D1, 3) <> strRolle Then iCount = iCount + 1 arrData(Zeile_D, Spalte_DL + 1) = False End If End If End If Next Zeile_D1 If iCount = 1 Then 'TA kommt nur einmal vor arrData(Zeile_D, Spalte_DL + 1) = True: iCount2 = iCount2 + 1 Else arrData(Zeile_D, Spalte_DL + 1) = False End If iCount = 0 Else 'Einzelrollen arrData(Zeile_D, Spalte_DL + 1) = False ': iCount2 = iCount2 + 1 End If End If Next Zeile_D End With 'wksData 'Ergebnis-Array dimensionieren ReDim arrErgebnis(1 To iCount2, 1 To Spalte_DL) iCount2 = 0 'Alle mit True markierten Zeilen ins ErgebnisArray übernehmen For Zeile_D = 1 To Zeile_DL If arrData(Zeile_D, Spalte_DL + 1) = True Then iCount2 = iCount2 + 1 For Spalte = 1 To Spalte_DL arrErgebnis(iCount2, Spalte) = arrData(Zeile_D, Spalte) Next End If Next Zeile_D Application.ScreenUpdating = False With wksErgebnis 'Inhalte löschen .UsedRange.ClearContents 'Ergebnis-Array eintragen .Cells(1, 1).Resize(iCount2, Spalte_DL) = arrErgebnis End With Application.ScreenUpdating = True Erase arrErgebnis, arrData End Sub
![]() ![]() |
Betrifft: AW: Extrem große Datenmengen verarbeiten und zuordnen
von: Barry White
Geschrieben am: 19.11.2014 05:04:31
Guten Morgen Franz,
großartig. Wo hast Du das denn so schnell hergezaubert?
Ich habe noch nie mit VBA-Scripts gearbeitet, höchstens bereits erstellte benutzt. Also ich gehe in die "Entwickleransicht", kopiere Dein Script und aktiviere ein Kontrollkästchen. Makro ausführen und dann sehe ich ob es läuft. Bei Fehlermeldung "Debug"....ich werde es einfach probieren und mich heute abend oder morgen wieder melden.
Bis dahin erst einmaml ganz herzlichen Dank an Dich, Franz.
Gruss, Barry
![]() ![]() |
Betrifft: AW: Extrem große Datenmengen verarbeiten und zuordnen
von: fcs
Geschrieben am: 19.11.2014 10:54:15
Hallo Barry,
im Makro ist noch ein kleiner aber folgenschwerer Fehler enthalten, den ich beim Testen übersehen hab.
Es muss einmal Zeile_D1 statt Zeile_D in der inneren For-Next-Schleife sein
Gruß
Franz
'Prüfen, ob Rollenname verschieden If arrData(Zeile_D1, 3) <> strRolle Then iCount = iCount + 1 arrData(Zeile_D1, Spalte_DL + 1) = False End If
![]() ![]() |
Betrifft: AW: Extrem große Datenmengen verarbeiten und zuordnen
von: Barry White
Geschrieben am: 19.11.2014 17:40:37
Hallo Franz,
ich habe Dein Makro getestet. Erst gab es Probleme wie "Index außerhalb des gültigen Bereichs" und "Typen unverträglich", doch dann funktionierte es einwandfrei.
Ich habe einen Kollegen zu Rate gezogen. Seine Überlegungen sind:
1. Prüfe Sammelrolle
2. wenn ja, prüfe 1. Zeile gleiche Rolle bis n (n also letzte Zeile)
3. wenn nein TA - Sammelrolle = TA Prüfrolle
4. wenn ja Ergebnisfeld: Sammelrolle, TA, Rollenname
Also das Ergebnisfeld ist das Entscheidende und das muss hinreichend definiert sein.
Einzel- oder Sammelrolle ist eigentlich nicht das Entscheidende.
Sondern alle TAs zur gegebenen Sammelrolle, welche dieser TAs sind in welchen anderen Rollen enthalten? Also im Ergebnisfeld soll stehen: Sammelrolle 1 - alle zugehörigen TAs (TA1 - TA1000) und alle anderen Rollen, welche die TAs von Sammelrolle 1 enthalten.
Das Ergebnis soll damit eine Entscheidungsbasis liefern: TA 1 nur in Sammelrolle 1 enthalten -BEHALTEN
oder TA1 auch in anderen Rollen (egal ob andere Sammel- oder Einzelrollen) enthalten - LÖSCHEN
Ist vielleicht auch zu aufwendig?
Gruss, Barry
![]() ![]() |
Betrifft: AW: Extrem große Datenmengen verarbeiten und zuordnen
von: fcs
Geschrieben am: 20.11.2014 12:24:13
Hallo Barry,
ich hab mal versucht das Makro in die Richtung umzuschreiben.
Im Ergebnisblatt werden im Moment alle Zeilen angezeigt. Diese kann man jetzt per Autofilter oder auch Pivot-Bericht zeilenmäßig komprimieren.
Das sollte zumindest für weitere Modifikationen des Makros/der Prüfungen im Makro eine Basis sein.
Gruß
Franz
Deine Beispieldatei mit Makr (alt und neu)
https://www.herber.de/bbs/user/93907.xlsm
![]() ![]() |
Betrifft: AW: Extrem große Datenmengen verarbeiten und zuordnen
von: Barry White
Geschrieben am: 21.11.2014 04:43:05
Guten Morgen Franz,
das ist genau das, was ich gesucht habe. Großartig, klasse!! Ich muss anhand der Datengröße das Ergebnisblatt so einstellen, dass immer nur eine Rolle mit ihren zugehörigen TAs dargestellt wird. Franz, ein ganz großes Dankeschön an Dich und die Mühe, die Du Dir gemacht hast. Vielen, vielen Dank!! Gruss, Barry
![]() ![]() |
Betrifft: AW: Extrem große Datenmengen verarbeiten und zuordnen
von: Barry White
Geschrieben am: 20.11.2014 05:01:40
Guten Morgen Franz,
D1 habe ich korrigiert aber das ist es nicht.
Das Geheimnis liegt in der richtigen Definition des Ergebnisfeldes.
Anderer Ansatz:
neuer Tab: Eingabe einer beliebigen Rolle, Aktivierung Makro und als Ergebnis alle TAs zu dieser Rolle und alle Rollen zu diesen TAs.
Ich kann mich da leider so schlecht artikulieren, worauf ich eigentlich hinaus will.
Gruss,
Barry
![]() |