Excel langsam durch viele Tabellenformeln bei großen Datenmengen

Mindfork

Cadet 4th Year
Registriert
Aug. 2014
Beiträge
108
Hallo zusammen,

ich bräuchte nochmal euren Support. Da es letztens super geklappt hat dachte ich, ich probiere es nochmal.

Ich habe ein ziemliches Performance-Problem in Excel und suche nach Lösungsansätzen, wie man mein vorhandenes Setup schneller bekommt.

Meine Datei ist derzeit so aufgebaut, dass ich vordefinierte Daten aus verschiedenen Quellen ungefiltert (keine Formatierungsänderung etc) in einer Tabelle meines Arbeitsblatt "RawData" einfüge.

Diese Informationen kommen in einer Tabelle "Absätze" eines anderen Arbeitsblatts "Absätze_Insgesamt" und werden dort entsprechend umgewandelt. Diese Tabelle dient als meine Quelltabelle und anhand dieser baue ich mir meine Anzeigen über Pivots (mit und ohne Dax Formeln), über Diagramme und sonstige Veranschaulichungen auf.

Ich habe bereits um die 40 Spalten in der Tabelle "Absätze" und es werden vermutlich auch noch mehr werden. Mein Problem hierdran ist, dass jede Spalte und in jeder Zeile ihre entsprechende Formel hat (alle mit KI erstellt), vor allem existieren viele und lange LET-Spaltenformeln.

Angefangen von
XML:
=RawData[@Bestelldatum]

Code:
=LET(
  SKU_Text; GLÄTTEN(""&[@SKU]);
  Anzahl_Wert; WENNFEHLER(1*[@AnzahlArtikel]; 0);
  PT_Text; ""&[@Rabatt];
  PT_Geputzt; GLÄTTEN(WECHSELN(WECHSELN(WECHSELN(PT_Text;"€";"");ZEICHEN(160);"");ZEICHEN(9);""));
  PT_Komma; WENNFEHLER(FINDEN(",";PT_Geputzt);0);
  PT_Punkt; WENNFEHLER(FINDEN(".";PT_Geputzt);0);
  PT_Norm; WENN(PT_Komma>0; WECHSELN(PT_Geputzt;".";""); WENN(UND(PT_Punkt>0; PT_Komma=0); WECHSELN(PT_Geputzt;".";","); PT_Geputzt));
  PT_Raw; WENNFEHLER(WERT(PT_Norm);0);
  IstSummenzeile; UND( ODER(SKU_Text=""; KLEIN(SKU_Text)="0"); ODER(Anzahl_Wert=0; ""&[@AnzahlArtikel]=""); PT_Raw>0 );

  KostenEinheit; WENNFEHLER( 1*XVERWEIS([@[Artikel_kurz]]; tbl_Shop[Artikel]; tbl_Shop[Versandkosten]); 0 );

  WENN( IstSummenzeile; ""; Anzahl_Wert * KostenEinheit )
)

Code:
=LET(
  Bestell;[@BestellNr];
  ZeilenMaske;[BestellNr]=Bestell;

  ArtAlle;FILTER([Artikel_kurz];ZeilenMaske);
  MengeAlle;FILTER([AnzahlArtikel];ZeilenMaske);
  SKUAlle;FILTER([SKU];ZeilenMaske);
  PTAlle;FILTER([Rabatt];ZeilenMaske);
  LandAlle;FILTER([Land];ZeilenMaske);
  MwStAlle;FILTER([MwSt];ZeilenMaske);
  RowIdxAlle;FILTER(ZEILE([BestellNr]);ZeilenMaske);
  AnzZeilen;ZEILEN(RowIdxAlle);
  KeyAlle;FILTER([Schlüssel_BRV];ZeilenMaske);

  MengeZ;WENNFEHLER(1*MengeAlle;0);
  PT_Text;""&PTAlle;
  PT_Putz;GLÄTTEN(WECHSELN(WECHSELN(WECHSELN(PT_Text;"€";"");ZEICHEN(160);"");ZEICHEN(9);""));
  PT_k;WENNFEHLER(FINDEN(",";PT_Putz);0);
  PT_p;WENNFEHLER(FINDEN(".";PT_Putz);0);
  PT_norm;WENN(PT_k>0;WECHSELN(PT_Putz;".";"");WENN(UND(PT_p>0;PT_k=0);WECHSELN(PT_Putz;".";",");PT_Putz));
  PT_Wert;WENNFEHLER(WERT(PT_norm);0);
  SKU_T;GLÄTTEN(""&SKUAlle);
  SumSKUleer;WENN(SKU_T="";WAHR;WENN(KLEIN(SKU_T)="0";WAHR;FALSCH));
  SumAnzLeer;WENN(MengeZ=0;WAHR;WENN(""&MengeAlle="";WAHR;FALSCH));
  SumPreisPos;WENN(PT_Wert>0;WAHR;FALSCH);
  SummenFlag_Key;WENNFEHLER(ISTZAHL(SUCHEN("||";KeyAlle));FALSCH);
  IstSummenzeile_Arr;WENN(SummenFlag_Key;WAHR;WENN(SumSKUleer;WENN(SumAnzLeer;WENN(SumPreisPos;WAHR;FALSCH);FALSCH);FALSCH));
  PosMaske;NICHT(IstSummenzeile_Arr);

  art;FILTER(ArtAlle;PosMaske);
  menge;WENNFEHLER(1*FILTER(MengeAlle;PosMaske);0);
  anzpos;ZEILEN(art);
  landfil;FILTER(LandAlle;PosMaske);
  landtxt;WENNFEHLER(GROSS(GLÄTTEN(INDEX(FILTER(landfil;landfil<>"");1)));"");
  land_ISO2;WENN(LÄNGE(landtxt)>=2;LINKS(landtxt;2);"");

  gewicht;WENNFEHLER(1*XVERWEIS(art;tbl_Shop[Artikel];tbl_Shop[Gewicht_kg]);0);
  rolle;XVERWEIS(art;tbl_Shop[Artikel];tbl_Shop[Kategorie];"");
  FlagHA;WENN(IDENTISCH(rolle;"HA");1;0);
  FlagNA;WENN(IDENTISCH(rolle;"NA");1;0);
  FlagMB;WENN(IDENTISCH(rolle;"MB");1;0);

  gesamtMengeHA;SUMMENPRODUKT(menge;FlagHA);
  idxErsteHA;WENN(gesamtMengeHA>0;VERGLEICH(1;FlagHA;0);0);
  FlagErsteHA;WENN(anzpos>0;WENN(SEQUENZ(anzpos)=idxErsteHA;1;0);0);
  gewichtErsteHA;WENN(gesamtMengeHA>0;SUMMENPRODUKT(gewicht;FlagErsteHA);0);
  gewichtNA;SUMMENPRODUKT(gewicht;menge;FlagNA);
  gewicht_Paket1;WENN(gesamtMengeHA>0;gewichtErsteHA+gewichtNA;gewichtNA);

  LC_Text;WENNFEHLER(""&tbl_Versandtarife[Landcode];"");
  LC_Clean;GROSS(GLÄTTEN(WECHSELN(LC_Text;ZEICHEN(160);"")));
  LC_ISO2_raw;WENN(LÄNGE(LC_Clean)>=2;LINKS(LC_Clean;2);"");
  LC_ISO2;WENN(LC_ISO2_raw="UK";"GB";LC_ISO2_raw);

  grp_all;WENNFEHLER(1*tbl_Versandtarife[Tarifgruppe];"");
  preis_all;WENNFEHLER(1*tbl_Versandtarife[R_Versandpreis];0);
  grp_land;WENNFEHLER(FILTER(grp_all;LC_ISO2=land_ISO2);SEQUENZ(0));
  preis_land;WENNFEHLER(FILTER(preis_all;LC_ISO2=land_ISO2);SEQUENZ(0));
  anz_tarife;ZEILEN(grp_land);

  preis_paket1;WENN(ODER(land_ISO2="";anzpos=0;anz_tarife=0);0;WENNFEHLER(XVERWEIS(gewicht_Paket1;grp_land;preis_land;0;1);0));

  mengeErsteHA;WENN(anzpos>0;SUMMENPRODUKT(menge;FlagErsteHA);0);
  restErsteHA;MAX(mengeErsteHA-1;0);
  preis_ersteHA;WENN(gesamtMengeHA>0;WENNFEHLER(XVERWEIS(gewichtErsteHA;grp_land;preis_land;0;1);0);0);
  kosten_ersteHA_rest;restErsteHA*preis_ersteHA;

  FlagHA_Other;WENN(FlagHA=1;WENN(FlagErsteHA=1;0;1);0);
  gew_HA_other;WENNFEHLER(FILTER(gewicht;FlagHA_Other=1);0);
  menge_HA_other;WENNFEHLER(1*FILTER(menge;FlagHA_Other=1);0);
  preis_HA_other;WENNFEHLER(XVERWEIS(gew_HA_other;grp_land;preis_land;0;1);0);
  kosten_HA_other;SUMMENPRODUKT(menge_HA_other;preis_HA_other);

  gew_MB;WENNFEHLER(FILTER(gewicht;FlagMB=1);0);
  menge_MB;WENNFEHLER(1*FILTER(menge;FlagMB=1);0);
  preis_MB;WENNFEHLER(XVERWEIS(gew_MB;grp_land;preis_land;0;1);0);
  kosten_MB;SUMMENPRODUKT(menge_MB;preis_MB);

  nettoGesamt; preis_paket1 + kosten_ersteHA_rest + kosten_HA_other + kosten_MB;

  HatSummenzeile;NICHT(ISTFEHLER(VERGLEICH(WAHR;IstSummenzeile_Arr;0)));

  Mw_S_Text;""&WENNFEHLER(INDEX(FILTER(MwStAlle;IstSummenzeile_Arr);1);"");
  Mw_P_Text;""&WENNFEHLER(INDEX(FILTER(MwStAlle;NICHT(IstSummenzeile_Arr));1);"");

  Mw_S_Clean;GLÄTTEN(WECHSELN(WECHSELN(WECHSELN(Mw_S_Text;"%";"");ZEICHEN(160);"");ZEICHEN(9);""));
  Mw_P_Clean;GLÄTTEN(WECHSELN(WECHSELN(WECHSELN(Mw_P_Text;"%";"");ZEICHEN(160);"");ZEICHEN(9);""));

  Mw_S_k;WENNFEHLER(FINDEN(",";Mw_S_Clean);0);
  Mw_S_p;WENNFEHLER(FINDEN(".";Mw_S_Clean);0);
  Mw_S_norm;WENN(Mw_S_k>0;WECHSELN(Mw_S_Clean;".";"");WENN(UND(Mw_S_p>0;Mw_S_k=0);WECHSELN(Mw_S_Clean;".";",");Mw_S_Clean));
  Mw_S_Val;WENNFEHLER(WERT(Mw_S_norm);"");

  Mw_P_k;WENNFEHLER(FINDEN(",";Mw_P_Clean);0);
  Mw_P_p;WENNFEHLER(FINDEN(".";Mw_P_Clean);0);
  Mw_P_norm;WENN(Mw_P_k>0;WECHSELN(Mw_P_Clean;".";"");WENN(UND(Mw_P_p>0;Mw_P_k=0);WECHSELN(Mw_P_Clean;".";",");Mw_P_Clean));
  Mw_P_Val;WENNFEHLER(WERT(Mw_P_norm);"");

  Mw_S_Faktor;WENN(Mw_S_Val="";"";WENNS(Mw_S_Val>5;1+Mw_S_Val/100;Mw_S_Val>=1;Mw_S_Val;WAHR;1+Mw_S_Val));
  Mw_P_Faktor;WENN(Mw_P_Val="";"";WENNS(Mw_P_Val>5;1+Mw_P_Val/100;Mw_P_Val>=1;Mw_P_Val;WAHR;1+Mw_P_Val));
  MwStFaktor;WENN(HatSummenzeile;Mw_S_Faktor;Mw_P_Faktor);

  SKU_Akt;GLÄTTEN(""&[@SKU]);
  Anzahl_Akt;WENNFEHLER(1*[@AnzahlArtikel];0);
  PT_Text_Akt;""&[@Rabatt];
  PT_Putz_Akt;GLÄTTEN(WECHSELN(WECHSELN(WECHSELN(PT_Text_Akt;"€";"");ZEICHEN(160);"");ZEICHEN(9);""));
  PT_K_Akt;WENNFEHLER(FINDEN(",";PT_Putz_Akt);0);
  PT_P_Akt;WENNFEHLER(FINDEN(".";PT_Putz_Akt);0);
  PT_Norm_Akt;WENN(PT_K_Akt>0;WECHSELN(PT_Putz_Akt;".";"");WENN(UND(PT_P_Akt>0;PT_K_Akt=0);WECHSELN(PT_Putz_Akt;".";",");PT_Putz_Akt));
  PT_Raw_Akt;WENNFEHLER(WERT(PT_Norm_Akt);0);
  IstSummenzeile_Akt;ODER(WENNFEHLER(FINDEN("||";""&[@[Schlüssel_BRV]])>0;FALSCH);UND( ODER(SKU_Akt="";KLEIN(SKU_Akt)="0"); ODER(Anzahl_Akt=0; ""&[@AnzahlArtikel]=""); PT_Raw_Akt>0));
  SollSchreiben;ODER(IstSummenzeile_Akt;AnzZeilen=1);

  WENN(SollSchreiben; WENN(MwStFaktor="";""; RUNDEN(nettoGesamt*MwStFaktor;2)); "")
)

Code:
=LET(
  Land_Text;      ""&[@Land];
  Land_Bereinigt; GROSS(GLÄTTEN(Land_Text));
  Land_ISO2_raw;  WENN(LÄNGE(Land_Bereinigt)>=2; LINKS(Land_Bereinigt;2); "");
  Land_ISO2;      WENN(Land_ISO2_raw="UK"; "GB"; Land_ISO2_raw);

  Vertrieb_Text;  GROSS(GLÄTTEN(""&[@[Vertrieb_auto]]));

  Laender_ISO2_Liste; {"DE";"AT";"CH";"NL";"BE";"LU";"FR";"IT";"ES";"PT";"IE";"GB";"US";"CA";"AU";"NZ";"JP";"SE";"NO";"DK";"PL";"CZ";"HU";"RO";"BG";"SK";"SI";"HR";"GR";"TR"};
  Waehrungen_Liste;   {"EUR";"EUR";"CHF";"EUR";"EUR";"EUR";"EUR";"EUR";"EUR";"EUR";"EUR";"GBP";"USD";"CAD";"AUD";"NZD";"JPY";"SEK";"NOK";"DKK";"PLN";"CZK";"HUF";"RON";"BGN";"EUR";"EUR";"EUR";"EUR";"TRY"};

  Waehrung_Code;
    WENNS(
      Vertrieb_Text="SHOP EU";                          "EUR";
      ODER(Vertrieb_Text="SHOP US"; Vertrieb_Text="SHOP USA"); "USD";
      LINKS(Vertrieb_Text;3)="AMZ";                     WENNFEHLER( XVERWEIS(Land_ISO2; Laender_ISO2_Liste; Waehrungen_Liste; "EUR"; 0 ); "EUR");
      WAHR;                                             WENNFEHLER( XVERWEIS(Land_ISO2; Laender_ISO2_Liste; Waehrungen_Liste; "EUR"; 0 ); "EUR")
    );

  Betrag_Nativ;   WENNFEHLER(1*[@[PreisTotal_Brutto_Num]]; "");

  Datentyp_Spalte; tbl_Währungstabelle[Datentyp];
  Von_Spalte;      tbl_Währungstabelle[Von];
  Zu_Spalte;       tbl_Währungstabelle[Zu];
  Kurs_Spalte;     tbl_Währungstabelle[Aktueller Umrechnungskurs];

  Direkter_Kurs; WENNFEHLER(
    XVERWEIS(Waehrung_Code&":EUR"; Datentyp_Spalte; Kurs_Spalte;
    XVERWEIS(Waehrung_Code&"/EUR"; Datentyp_Spalte; Kurs_Spalte;
    XVERWEIS(Waehrung_Code; FILTER(Von_Spalte; Zu_Spalte="EUR"); FILTER(Kurs_Spalte; Zu_Spalte="EUR")))); "");

  Umgekehrter_Roh; WENNFEHLER(
    XVERWEIS("EUR:"&Waehrung_Code; Datentyp_Spalte; Kurs_Spalte;
    XVERWEIS("EUR/"&Waehrung_Code; Datentyp_Spalte; Kurs_Spalte;
    XVERWEIS("EUR"; FILTER(Von_Spalte; Zu_Spalte=Waehrung_Code); FILTER(Kurs_Spalte; Zu_Spalte=Waehrung_Code)))); "");
  Umgekehrter_Kurs; WENN(ISTZAHL(Umgekehrter_Roh); 1/Umgekehrter_Roh; "");

  Kurs_Cur_USD; WENNFEHLER(
    XVERWEIS(Waehrung_Code&":USD"; Datentyp_Spalte; Kurs_Spalte;
    XVERWEIS(Waehrung_Code&"/USD"; Datentyp_Spalte; Kurs_Spalte;
    XVERWEIS(Waehrung_Code; FILTER(Von_Spalte; Zu_Spalte="USD"); FILTER(Kurs_Spalte; Zu_Spalte="USD")))); "");

  Kurs_USD_EUR; WENNFEHLER(
    XVERWEIS("USD:EUR"; Datentyp_Spalte; Kurs_Spalte;
    XVERWEIS("USD/EUR"; Datentyp_Spalte; Kurs_Spalte;
    XVERWEIS("USD"; FILTER(Von_Spalte; Zu_Spalte="EUR"); FILTER(Kurs_Spalte; Zu_Spalte="EUR")))); "");

  Kurs_EUR_USD; WENNFEHLER(
    XVERWEIS("EUR:USD"; Datentyp_Spalte; Kurs_Spalte;
    XVERWEIS("EUR/USD"; Datentyp_Spalte; Kurs_Spalte;
    XVERWEIS("EUR"; FILTER(Von_Spalte; Zu_Spalte="USD"); FILTER(Kurs_Spalte; Zu_Spalte="USD")))); "");

  Kurs_via_USD; WENNS(
    UND(ISTZAHL(Kurs_Cur_USD); ISTZAHL(Kurs_USD_EUR)); Kurs_Cur_USD*Kurs_USD_EUR;
    UND(ISTZAHL(Kurs_Cur_USD); ISTZAHL(Kurs_EUR_USD)); Kurs_Cur_USD / Kurs_EUR_USD;
    WAHR; ""
  );

  Kurs_Gesucht; WENNS(
    ISTZAHL(Direkter_Kurs);     Direkter_Kurs;
    ISTZAHL(Umgekehrter_Kurs);  Umgekehrter_Kurs;
    ISTZAHL(Kurs_via_USD);      Kurs_via_USD;
    Waehrung_Code="EUR";        1;
    WAHR;                        ""
  );

  Ergebnis_EUR; WENN(ODER(Betrag_Nativ=""; Kurs_Gesucht=""); ""; Betrag_Nativ*Kurs_Gesucht);
  Ergebnis_EUR
)
Bei 20+k Zeilen a 40 Spalten kommt da einiges zusammen und mir geht jeder Rechner ein. Derzeit hat die Excel-Datei nur durch diese Formeln in der Tabelle "Absätze" über 100mb.
Ich finde einfach keinen Ansatz wie ich das ganze Performancetechnisch optimieren kann.

Eine Idee war per VBA die Tabellenformeln nach der Berechnung zu ich nenns mal „materialisieren“, also in Werte umwandeln (dass nicht mehr die Formel sondern der Wert einfach steht). Das würde auch die Größe der Excel Liste von >100mb auf ~ 5mb runterdrücken und damit wird alleine das Öffnen nicht mehr über 5 Minuten Brauchen (bei nem RYZEN 7 5825U).
Kurz gesagt:
1. Erste Datenzeile in der Tabelle Absätze behält die Formeln (Vorlage).
2. Alle weiteren Zeilen werden in Werte konvertiert.
3. Beim nächsten Sync kopiert Excel die Formeln aus Zeile 1 automatisch in neu hinzugekommene Zeilen; danach werden diese wieder materialisiert.
Ich denke das funktioniert zwar für alles statischen Formeln gut, ich habe damit aber dann zwei Probleme in einem und zwar: wenn jemand eine Information ändert, auf die sich eine Formel bezogen hat, passt sich nichts dynamisch an und zudem; die Auto-Aktualisierung der Währungsumrechnung wird damit sowieso zerschossen - und > das alles wird dann irgendwann keiner mehr auf den Schirm haben.

Eine andere Idee war die Excel Formeln in Power Query zu übertragen, weil ich gehört habe, dass Power Query Berechnungen nur durchführt, wenn sich die Daten laden oder aktualisieren und auch schneller ist (Wie auch immer das verarbeitet wird?). Kriege aber keine der Beispielformeln im M-code für Power Query umgewandelt und sehe zudem auch keine Möglichkeit für meine vorhandene Tabelle in den jeweiligen Spalten Formeln einzubauen. Das geht scheinbar nur wenn ich neue Spalten erstelle in Power Query.

Oder sind die Formeln einfach Murks, dass ich mir einen Deadlock damit geschaffen habe und müsste da eher drangehen?

Würde mich sehr freuen, wenn mir jemand eine idee geben könnte wie man DAS -.- Lösen könnte.
 
Zuletzt bearbeitet:
Supi wäre ne Datenbank zu benutzen, Ab gewissen Größen ist so Excel zeug nicht mehr gut geeignet, meine Meinung jedenfalls.

Aber da sagst du sicher, das ne Datenbank keine Option ist.

Wie wäre es mit python? (+Datenbank) das ist ziemlich beliebt bei Wissenschaftlern, die mit Daten umgehen.
Edit: (Ist nur als Idee/Alternative/Denkanstoss gedacht, ist meine unprofessionelle Idee dazu..)
 
  • Gefällt mir
Reaktionen: w764, dms, Jacek Pavlovski und 12 andere
Da kann ich mich nur anschliessen, man sollte zu einer Datenbank uebergehen. Excel ist fuer solche Datenmengen mit Formeln nicht wirklich geeignet. VBA ist auch nicht ideal, da es auch oft Probleme macht.
 
  • Gefällt mir
Reaktionen: Jacek Pavlovski, Autokiller677 und LingUaan
Ich hab bei so großen/langsamen Sheet'S immer die automatische Neuberechnung abgeschaltet, dann kannst du deine Daten zurecht fummeln und sporadisch immer mal manuell neuberechnen.

Wo genau diese Einstellung ist, weis ich aber nicht mehr auswendig.
 
  • Gefällt mir
Reaktionen: F1database und Tornhoof
Wenn die Logik und Daten weiterhin in Excel bleiben sollen, dann würde ich die Formeln in VBA Code umwandeln. Der ist schneller in der Ausführung, als komplex verschachtelte Formeln.
Es kann sich dabei durchaus auch lohnen, nicht alles in einem Rutsch berechnen zu lassen, sondern Hilfspalten einzufügen, wo man Zwischenergebnisse speichert. Damit werden die Logiken übersichtlicher und bei gewissen Daten, entspricht ggf ja schon das Zwischenergebnis dem finalen Wert.

Deine ganzen Datentransformationsschritte würde ich über PowerPivot lösen - oder hast du dies schon per DAX Formel?

PS da es ja keine Excel Datei für den Heimgebrauch ist, sondern für die Verwendung innerhalb des Unternehmens - ebenfalls mein Vote für den Einsatz einer Datenbank. Der Performance-Sprung ist dabei einfach extrem. Weiterhin baust du da ja auch irgendwelche Bestandslisten und/oder Preiskalkulationen auf ... kleine Fehler und du verursachst da noch finanziellen Schaden. Sowas rechtfertigt den Einsatz von IT Ressourcen.
 
  • Gefällt mir
Reaktionen: AAS
Hier einmal ein praxisbezogenes Beispiel. Wir hatten damals einen Kunden, der ne komplexe Rechnung in excel gemacht hat.

Es bestand aus riesigen Datensätzen, ich weiß leider nicht mehr exakt wieviele Zeilen und Spalten es waren.

Man musste ein paar Daten eingeben und dann hat Excel zusammen mit VBA bis zu 5 Minuten gebraucht, diese zu berechnen. Das musste man bis zu 20-30 mal machen, hat also insgesamt Stunden gedauert, bis alles berechnet war.

Unsere Firma wurde dann damit beauftragt, dass zu optimieren. Wir haben es dann in c# überführt, wobei wir weiterhin die Rohdaten aus eine excel Datei eingelesen haben und das Ergebnis auch wieder in eine excel Datei geschrieben haben. Es war also keine Datenbank enthalten.

Am Ende war die Berechnung für alle Konstellationen dann in 10 Sekunden statt in wenigen Stunden fertig. Selbst der Import/Export von und nach excel war ziemlich zügig.

Sowohl excel, als auch unser Programm hätte man auch noch weiter optimieren können. Gerade wenn man noch weiter in Richtung Datenbanken weiter gegangen wäre. Dennoch war dies für den Kunden ein vertretbarer Aufwand und hat massiv Zeit gespart über Häufigkeit der Ausführung.

Mein Vorschlag wäre also auch hier, dass du dir die alternativen wie Python Mit ner Datenbank zusammen anguckst, da man dort am meisten Zeit sparen kann auf lange Sicht.
 
  • Gefällt mir
Reaktionen: trb85, w764, Krik und 2 andere
Grundsätzlich würde ich sagen, dass Daten vor der Verarbeitung in Excel normalisiert und hinsichtlich der weiteren Aufgaben in Excel so aufbereitet werden, dass dort keine weiteren Konvertierungen mehr erforderlich sind und direkt mit der fachlichen Bearbeitung weitergemacht wird (Trennung der Import-Daten von der fachlichen Aufbereitung).

Das fängt idealerweise schon beim Erstellen der zu verarbeitenden Daten mit der Datenorganisation an der Quelle an, sofern sich das beeinflussen lässt.

Die so aufbereiteten Daten können in einer externen Quelle vorgehalten und bspw. per Power Query eingelesen werden. Power Query erlaubt auch beim Import noch Datenformate anzupassen.

Jede Anpassung in Excel kostet halt Ressourcen und Performance. Und wenn VBA für etwas nicht ausgelegt ist, dann für Performance.
 
  • Gefällt mir
Reaktionen: trb85, TomH22, AAS und 2 andere
Ich würde für eine solche Aufgabe auch eine Datenbank Anwendung nutzen und Excel dann zur Visualisierung der (in der Datenbank bereits formatierten) Ergebnisse verwenden.
 
Azghul0815 schrieb:
Lässt sich ja auch alles mit relativ überschaubarem Aufwand mit KI erledigen.
Der TE schreibt ja, dass er sein "Chaos" mittels KI erstellt hat. Irgendwann muss da auch mal ein Entwickler ran - der stellt die richtigen Fragen damit am Ende auch das richtige Ergebnis rauskommt.
 
Je nachdem wo die Daten herkommen, ist entweder der Ansatz mit der Datenbank, oder eben eine Business Intelligence Lösung angebracht.

Hängt natürlich auch davon ab wofür und an wen die Ergebnisse der ganzen Konstruktion richten. Allein der Umstand, das hier eine erhebliche Datenmenge mit Logik transformiert werden soll spricht in jedem Fall für etwas professionelle IT-Unterstützung mit geeigneteren Tools.

Excel hat da ganz klar seine Grenzen.
 
  • Gefällt mir
Reaktionen: Vigilant und Azghul0815
Insbesondere bei kleineren Unternehmen sind die Ressourcen dafür evtl. begrenzt. Auch für die Inanspruchnahme von Dienstleistern. Nicht jeder Laden kann sich ein eigenes Datawarehouse, Datalake etc. leisten. Oder es wäre evtl. auch nicht verhältnismäßig hinsichtlich Aufwand und Kosten.

Aber auch mit geringen Ressourcen lässt sich durch etwas Organisations-Arbeit eine Art Low-Budget/Mini-ETL-Prozess basteln.

1. Schauen, ob bei der Datenerfassung schon alles für späteres Auswerten/Controlling optimiert ist.
2. Datensatz definieren, Daten aus Datenquelle extrahieren, normalisieren, formatieren und dann die so aufbereiteten Daten für die Weiterverarbeitung bereitstellen. Evtl. ist eine Faktentabelle ausreichend, wenn die Daten komplexer sind, könnte über ein passendes Datenmodell mit mehreren Tabellen nachgedacht werden.
3. Daten strukturiert (Datenabfrage, Power Query, etc.) in Excel importieren.
4. Fachliche Aufbereitung, Analyse etc. in Excel durchführen.

Je nach Office-Lizenz ist evtl. auch Power-BI verfügbar. Das würde ein paar weitere Möglichkeiten eröffnen.
 
  • Gefällt mir
Reaktionen: TomH22
Danke euch allen erstmal für die ganzen Infos.
Alexander2 schrieb:
Aber da sagst du sicher, das ne Datenbank keine Option ist.
Nun, so wie ich es den Aussagen hier entnehme wird es eine Option sein müssen. Die Herausforderung ist halt, dass wir das mit Minimalaufwand betreiben, da die Excel-Dateierstellung nebenbei läuft zwischen meinen anderen Aufgaben. Zumal ich bei Excel zumindest ein gewisses Grundverständnis habe und bei allem anderen absolut von 0 anfangen muss - wie Python.
_killy_ schrieb:
Wenn die Logik und Daten weiterhin in Excel bleiben sollen, dann würde ich die Formeln in VBA Code umwandeln. Der ist schneller in der Ausführung, als komplex verschachtelte Formeln.
Werde ich auch machen, wobei das mehr eine dirty Bastellösung dann ist, aber es wird wohl keine saubere Lösung geben. Da ich VBA-Code auch mit Ki schreiben lasse, war es immer schwierig das so hinzubekommen das er das sequenziell abarbeitet und nicht parallel. Sprich, es muss erst die Quelltabelle erweitert werden um die Größe der Datenbank-Tabelle, dann Syncen mit Formeln, darauf gefolgt die Datumsspalte auf das Datumsformat formatieren, dann PowerPivot-Datenmodell aktualisieren und dannach andere für Pivot notwendige Tabellen Syncen um dann Pivots zu syncen, usw.... - war immer ein Problem diese manuellen Schritte sauber automatisiert hinzubekommen per VBA.
_killy_ schrieb:
Deine ganzen Datentransformationsschritte würde ich über PowerPivot lösen - oder hast du dies schon per DAX Formel?
Ja, die Tabelle ist in einer PowerPivot drin und ich habe derzeit um die 9 PowerPivot Tabellen, mit gerade 20+ Dax-Formeln. Hilfsspalten habe ich so gut es geht angelegt, wollte aber vermeiden die Tabelle auf 60 Spalten hochzuprügeln und bisschen übersichtlicher anzugehen. Dafür ist der Code zwar länger aber gut entweder - oder.

Vigilant schrieb:
Grundsätzlich würde ich sagen, dass Daten vor der Verarbeitung in Excel normalisiert und hinsichtlich der weiteren Aufgaben in Excel so aufbereitet werden, dass dort keine weiteren Konvertierungen mehr erforderlich sind und direkt mit der fachlichen Bearbeitung weitergemacht wird (Trennung der Import-Daten von der fachlichen Aufbereitung).
Ich wollte das so einrichten, dass sich die Daten sich dynamisch ändern können, was aktive Formeln zwingend erforderlich macht, zumindest in einigen Bereichen. Das mit dem normalisieren ist mir nur als Bastellösung eingefallen, da ich Nachts mal geforscht habe, was den eigentlich das ganze bremst (schlussendlich halt mumpitz meine Idee da ich damit praktisch wieder zurück zur Roh-Datenbank gehen würde).


Also, ich denke ich werde erstmal eine Bastellösung nehmen mittels VBA und der ersten Tabellenzeile alles zu normalisieren damit es zumindest einmal läuft. Mit der statischen Methode muss man damit dann leben, ist aber kurzfristig erstmal hinnehmbar.

Dann werde ich mich mal mit Python beschäftigen, Roh-Datenbank dort aufbauen, Daten aufbereiteln mit der Logik aus den Excel-Formeln und diese dann in der Excel Absatz-Tabelle übertragen | oder das Excel diese sich daraus zieht. Damit dann die ganzen Visualisierungen (Pivots,Diagramme etc) ausgeben. Hoffe mal, das funktioniert irgendwie so und denke, dass würde die KI auch noch hinbekommen.
Ergänzung ()

Ist aber gut zu wissen, dass es einfach technisch durch die Größe begrenzt ist und ich nicht herausfinden muss, ob irgendwelche Formeln das ganze schrotten (sicherlich auch, aber wird nicht das Hauptaugenmerk sein). Dachte ja sonst auch, dass man vllt etwas durch die Grafikkarte jagen könnte an Berechnungen.
 
Zuletzt bearbeitet:
@Azghul0815

Wenn man nicht weiß, was man eingeben/fragen muss ... dann bauen die KIs auch nur Müll.

@Mindfork

Mit Excel wirst du nicht die GPU ansprechen können. Hier läuft alles auf CPU Power aus. Durch die Trennung der Formeln und einfügen von Hilfsspalten, kannst du aber die Parallelisierung erhöhen und Berechnungen ggf. insgesamt reduzieren, weil nicht immer alle "IFs" durchgegangen werden müssen.

Über eine simple Datenbank kannst du ja auch einiges an Logik in Views einbauen und dann die Daten dann einfach per Excel abziehen.
Auch Zwischenschritte können berechnet werden und können lokal in der Datenbank gespeichert werden.

Persönlich würde ich dir wirklich empfehlen, eine vernünftige IT Lösung bauen zu lassen. Es geht im Firmendaten die am Ende auch für Entscheidungen genutzt werden. Man spart wirklich an der falschen Stelle, wenn man alles in Excel macht. Ist super für Prototyp, um zu beschreiben, was man will - aber nicht stabil genug um da wirklich GuV relevante Entscheidungen abzuleiten.
 
  • Gefällt mir
Reaktionen: trb85, ferris19 und Azghul0815
Mindfork schrieb:
Ist aber gut zu wissen, dass es einfach technisch durch die Größe begrenzt ist und ich nicht herausfinden muss, ob irgendwelche Formeln das ganze schrotten (sicherlich auch, aber wird nicht das Hauptaugenmerk sein).
Excel macht vor jeder Rechnung eine Typprüfung*, da es ja nicht weiß, ob der Kram in der Zelle eine verrechenbare Zahl oder Text oder was anderes ist. Das zwingt bei zigtausenden Zellen jede CPU in die Knie.
Da kannst du nicht machen. Das ist per Design so.

* Sofern eine komplette Neuberechnung beauftragt wurde.

Mindfork schrieb:
Dachte ja sonst auch, dass man vllt etwas durch die Grafikkarte jagen könnte an Berechnungen.
Nope. Dafür wären Grafikkarten auch weniger gut geeignet, da die auf Vektor- und Matrixrechnungen optimiert sind. AVX könnte hier sicher gut was reißen, ich habe aber nichts davon gehört, dass Excel davon Verwendung macht.


Ich hatte in meiner damaligen Firma ähnliche Probleme. Ich habe von meinem Vorgänger ein gigantisches Excel-"Projekt" übernommen. Der Junge hatte keine Ahnung und hat auch offen zugegeben, dass er sich alles aus ein paar Schnipseln aus dem Internet zusammengebaut hat. Es gab da nicht nur eine Tabelle mit Rohdaten, es gab derer vier (je ca. 200-250 MB), weil eine alleine die Datenmengen nicht fassen konnte. Da war dann auch erst mal Kaffeepause angesagt, wenn man das Monstrum geöffnet hat.
Nach reichlich flehen hab ich dann eine Datenbank gestellt bekommen, in die ich dann immer alle Daten geworfen habe. Per VBA-Skript habe ich dann passende SQL-Abfragen an die DB geschickt und statt mit 4x 250 MB musste die Tabelle oft nur noch mit 1-2 MB an Daten umgehen. Auf einmal war am Ende des Rechnens noch Arbeitszeit übrig. :freak:
Das war dann erst mal ok so.

Und wie das so ist, haben sich dann im Laufe der Zeit neue Anforderungen ergeben. Die VBA-Skripte wurden immer komplexer. Ich kann mich an eine Tabelle erinnern, da hat das Skript 25 Minuten gerattert. Das war so ätzend, dass ich den Kram dann in ein C#-Programm gegossen habe. Da war auch Parallelisierung auf mehrere Threads möglich. Die Laufzeit schrumpfte dann auf ca. 10 Sekunden. Gleichzeitig habe ich auch Views in der DB angelegt, sodass Excel am Ende fast nichts mehr selber rechnen musste, sondern eigentlich nur noch dargestellt hat.

Den Arbeitstag habe ich dadurch von ca. 8 h Vollzeit Excel-Heckmeck in Pi mal Daumen 5 Minuten Tabellengenerierung mit anschließender 1/2 bis 1 Stunde durchschauen reduziert. Den Rest der so gewonnenen Zeit habe ich darin investiert, das System leistungsfähiger und funktionsreicher zu machen, um die Daten zukünftig noch einfacher und "automatischer" verarbeiten zu können.

Eines hat mich das ganze gelehrt:
Excel ist keine Datenbank und sollte auch nicht als solche verwendet werden. Es ist gut für kleinere Rechnungen und Präsentationen von wichtigen Zahlen und Rechnungen, aber auch um mal schnell quer zu gucken, was so los ist.
Alles, was darüber hinausgeht, sollte unbedingt ausgelagert werden, wenn man sich das Leben nicht schwer machen will.


Statt Power Query wäre vielleicht auch Microsoft Power BI eine Lösung.
 
  • Gefällt mir
Reaktionen: trb85, Limmbo und xone92
@Mindfork

Bitte denke bei deiner ganzen Excel Arbeit auch daran, ob gewisse Daten auch historisiert werden müssen. Bestandslisten für den Monatsabschluss, Preiskalkulationen um nachträglich Storno von Rechnungen richtig zu verarbeiten.
 
Zurück
Oben