Office: MATRIX-Formel über VBA -> zu langsam

Helfe beim Thema MATRIX-Formel über VBA -> zu langsam in Microsoft Excel Hilfe um das Problem gemeinsam zu lösen; Hallo allerseits, bräuchte mal bitte euren fachmännischen Rat *Smilie Also, habe folgende MATRIX-Formel Code:... Dieses Thema im Forum "Microsoft Excel Hilfe" wurde erstellt von mücke, 2. August 2010.

  1. MATRIX-Formel über VBA -> zu langsam


    Hallo allerseits,

    bräuchte mal bitte euren fachmännischen Rat *Smilie

    Also,
    habe folgende MATRIX-Formel
    Code:
    in VBA abgebildet … funktioniert auch so weit …nur ist die Ausführung sehr, sehr langsam. *frown.gif*
    Die Bereiche der einzelnen Tabellenblätter (Übersicht und Sollzeit) belaufen sich > 20.000 Zeilen!
    Wenn ich den nachstehenden CODE laufen lasse, kann ich für heute Feierabend machen und hoffen, dass er morgen zum Dienstbeginn fertig ist *biggrin.gif*
    Code:
    Gibt es vielleicht eine elegantere, respektive schnellere Lösung für mein Vorhaben?

    Vielen Dank ... Sachdienliche Hinweise werden immer gerne gesehen. *Smilie

    :)
     
    mücke, 2. August 2010
    #1
  2. Hallo Dirk,

    versuch doch mal anstatt ganze Spalten zu referenzieren, dynamische Bereichsnamen zu definieren.
    Das sollte doch zumindest die Rechenzeit etwas vermindern.
     
  3. Hallo Dirk,

    Rainers Hinweis wird umso wichtiger wenn man bedenkt, dass Du offensichtlich Excel 2007 nutzt, das deutlich mehr Zeilen hat. Matrixfunktionen sind ohnehin nicht als "Turbos" verschrien...

    Ein alternatives Makro zum Testen:
    Code:
    Wenn Du Fragen dazu hast, frag! *wink.gif*

    Grüße
    EarlFred
     
    EarlFred, 4. August 2010
    #3
  4. MATRIX-Formel über VBA -> zu langsam

    Hallo IHR 2,

    vielen Dank für die schnelle Rückmeldung.

    @EarlFred
    Dein CODE ist wie immer Weltklasse *10points Danke ...
    ... und ob ich Fragen dazu hab *laugh ... eine ? ... bestimmt hunderte … und hier kommt auch gleich die Erste *wink.gif*
    Wenn der rngEintrag leer ist, wird in den Zellen ja auch nichts eingetragen, logisch! Besteht denn die Möglichkeit anstelle von "" (also leer) eine 0 (in Worten NULL) in die Zelle zu schreiben?

    Vielen Dank
     
    mücke, 4. August 2010
    #4
  5. Hallo Dirk,

    danke für die Blumen! Ich werd ja ganz *redface

    Ja klar, Du kannst die Existenz eines Datensatzes im Dictionary prüfen (sollte man ja eigentlich auch machen, aber da ist der Earl immer etwas faul...):
    Nutze die Exists-Methode vom Dictionary.

    Um noch ein paar Sekundenbruchteile rauszuholen, habe ich noch 2 Dinge gemacht:

    Ich nutze Early Binding - also binde bitte den Verweis auf die "Microsoft Scripting Runtime" mit ein (im VBE unter Extras|Verweise)

    Zudem waren mir das noch viel zu viele Tabellenzugriffe. Habe daher noch ein paar Arrays eingebaut. Steigst schon durch...

    Code:
    Grüße
    EarlFred
     
    EarlFred, 4. August 2010
    #5
  6. Seitlicher Einwurf: Größere Datenmengen und Matrixberechnungen - als Datenbänkler denke ich da an SQL (Massendatenverarbeitung). Ergebnisse lassen sich da auch sehr zügig erstellen.

    @Dirk: Wenn Du die Mappe Excel2000-lesbar bereitstellst und ich die Aufgabe verstehe, könnte ich versuchen, eine Alternative bereitzustellen und weitere Sekundenbruchteile zu schinden.
    Im Ernst: Abfragen auf lokale Tabellen mit deutlich weniger als 50k Datensätzen sollten im einstelligen Sekundenbereich liegen (natürlich abhängig von der Aufgabe).
     
  7. Hallo Eberhard,

    ich musste beim Schreiben schon daran denken, dass Dein Einwurf kommt - und ganz ehrlich hatte ich auch darauf gehofft.

    An einem konkreten Beispiel auf SQL-Basis von einem Datenbankprofi wär auch ich sehr interessiert.

    Grüße
    EarlFred
     
    EarlFred, 4. August 2010
    #7
  8. MATRIX-Formel über VBA -> zu langsam

    Hallo miteinander,

    @EarlFred
    … ist wohl leicht untertrieben. Habe beide Varianten in der Original-Mappe laufen lassen, der Unterschied ist gigantisch.
    Variante 1 (#3) 105 Sekunden
    Variante 2 (#5) < 2 Sekunden
    Ich steig da zwar noch nicht wirklich durch, aber es läuft ohne Probleme und das in einer Zeit die (wohl) alle Rekorde schlägt. *top

    @Eberhard
    Vielen Dank für dein Interesse!
    Gerne nehme ich (und wie ich sehe auch EarlFred) dein Angebot einer Alternative über SQL an.
    In der angehängten (hoffentlich lesbaren) Datei sind beide Varianten von EarlFred nochmal hinterlegt.

    Auch wenn ich mir sicher bin, das du die Aufgabe auch ohne weiterer Beschreibung verstehen wirst, hier noch mal eine Kurzfassung: *wink.gif*

    Die Daten stammen aus SAP (woher auch sonst) und resultieren aus verschiedenen Auswertungen. Das TB Übersicht ist das Masterblatt und dienst als Grundlage für alle weiteren Auswertungen. Hier sollen alle Daten aus den verschiedenen TB´s zusammengefast werden. … und alles klar?

    Dann bin ich (wir) mal auf deine SQL-Alternative gespannt … Vielen Dank dafür!
     
    mücke, 4. August 2010
    #8
  9. Ich muss noch einmal rückfragen: Worin besteht die Zusammenfassung aus mehreren TB´s? Momentan erkenne ich nur das Kopieren von Werten aus einem Arbeitsblatt in ein anderes, kein Gruppieren, Summieren. Und zufällig ist sogar die Reihenfolge identisch ...
     
  10. Hallo Eberhard,

    sinngemäß wird ein "SVerweis mit 2 Bedingungen" ausgeführt - zumindest habe ich das so aus Dirks Formel interpretiert.

    Nach dem Prinzip: Nimm in Blatt "Übersicht" das erste Wertepaar aus PersNr und Datum und suche in Blatt "Sollzeit" nach dem entsprechenden Eintrag mit Rückgabe der Solltstunden (Feld "Anzahl").

    Diese Abfrage dann für alle Wertepaare im Blatt "Übersicht" wiederholen.

    [Ergänzung]
    Wenn das Wertepaar in "Sollstunden" nicht gefunden wurde, soll stattdessen idealerweise eine 0 zurückgegeben werden.
    [/Ergänzung]

    Grüße
    EarlFred
     
    EarlFred, 4. August 2010
    #10
  11. Hallo Eberhard,

    das die Reihenfolge identisch ist, purer Zufall und nicht beabsichtigt!

    In der Originaldatei gibt es noch mehrere TB´s,
    _Übersicht (Master für alles)
    _Sollzeit, Mehrarbeit, Nebenleistungen usw.
    Jedes TB eine andere SAP-Auswertung mit (fast) immer dem gleichen Aufbaut. Die Anzahl der Mitarbeiter ist unterschiedlich, die dazugehörigen Datumsangaben können variieren usw.

    Im TB Übersicht sollen dann die Daten aus den verschiedenen TB´s zusammengefast werden.
    Spalte H für Sollzeit, Spalte I für Mehrarbeit usw.

    Ich habe bis dato nur von einem TB (Sollzeit) gesprochen um das Ganze nicht zu kompliziert zu gestallten. Mein “Gedanke“ war, das Makro für die Sollzeit als Grundlage für alle anderen TB´s zu nutzen und entsprechend anzupassen.

    War das jetzt ein Fehler von mir?! … wenn ja, sorry!

    @EarlFred
    Deine Beschreibung trifft den Nagel auf den Kopf!
     
  12. Hallo zusammen,

    hier mal ein Versuch von mir - das ist aber auch für mich ein unbekanntes Terrain:

    Gruß Ingolf
     
  13. MATRIX-Formel über VBA -> zu langsam

    Da sieht mein Vorschlag doch sehr ähnlich aus:
    Code:
    Anmerkung: Da das Laden der ADODB-Bibliothek etwas dauert, ist der erste Makroaufruf von längerer Dauer als die folgenden. Bei Verwendung von Early Binding (=> Verweis setzen und Konstante auf False setzen) geht es noch etwas schneller. Da es aber verschiedene ADO-Versionen gibt, könnte es bei Weitergabe der Mappe zu Verweisproblemen kommen, Late Binding ist da sicherer.

    Etwas zum Nachlesen gibt es hier:
    ADO und Excel
    SQL-Tutorial
    The Connection String Reference

    Allgemein: Man kann sehen, dass da ordentlich Overhead notwendig ist, damit die Abfrage ausgeführt und deren Ergebnis dargestellt werden kann. Dieser VBA-Teil ist aber (in Varianten) relativ konstant (und kopierbar).
    Die eigentliche Abfrage sieht (für die gestellte Anforderung) so aus:
    Code:
    Da die SQL-Logik sich deutlich von der in Excel verwendeten Logik unterscheidet, möchte ich zum Verständnis einige Erläuterungen geben:
    Zeile 2: Verknüpfung der beiden Tabellen, wobei von der linken Tabelle alle Datensätze und von der rechten nur die Treffer verwendet werden. Die Buchstaben U und S werden hier als Aliasnamen für die vollständigen Tabellennamen in der übrigen Anweisung verwendet. Das spart Schreibarbeit und erhöht die Übersicht. Darüber hinaus bieten Aliasnamen die Möglichkeit, eine Tabelle mit sich selber zu verknüpfen.
    Zeile 3: Schlüssel für die Verknüpfung. Das dürfen auch deutlich mehr sein und weitere Ausdrücke enthalten (>=, Berechnungen u.a.)
    Zeile 1: Auswahl nur des benötigten Feldes (Anzahl). Über IIf (Wenn-Anweisung) wird für fehlende Werte eine 0 gesetzt. SX ist nur ein Aliasname für das berechnete Feld in der virtuellen Tabelle (muss hier nur vorhanden sein)
    Zeile 4: Stellt sicher, dass keine zusätzlichen Zeilen (gelöschte Zellen) einbezogen werden.

    Eine SQL-Anweisung kann deutlich komplexere Anforderungen bewältigen. Wer da Wünsche hat und alleine nicht klar kommt, kann gerne in einem passenden Fachforum (Access, SQL) nachfragen. Das Lernen auch dieses Stoffgebietes dauert ein wenig. Auch im Access-Forum bewegen sich viele, die gerade den Entwurfsassistenten für Abfragen bedienen können, es gibt aber viel mehr Möglichkeiten als ein Assistent bietet. Also bei Bedarf keine falsche Zurückhaltung und fragen.

    Grundsätzlich: Bezüglich Anwendung von SQL in Excel ist es das Hauptproblem, eine Tabelle (Arbeitsblatt oder aber ein Bereich) als Datenbanktabelle "greifen" zu können. Dazu ist notwendig:
    - Datensätze (Zeilen) ohne Leerzeilen
    - eine einzeilige Zeile mit Feldnamen
    - Feldnamen ohne Leer- und Sonderzeichen
    - Jedes Feld (Spalte) beinhaltet nur Werte gleichen Datentyps. Datentyp ist eine deutliche Verschärfung gegenüber dem Formatbegriff in Excel und etwa dem Gewohnten in VBA gleichzusetzen.

    In der vorgelegten Beispielmappe wurde das vorbildlich eingehalten. Recht oft werden aber die Möglichkeiten des Gestaltens und Verschönens genutzt, die dann behindernd bis verhindernd wirken können.

    Allgemein: Zur Ausführung von SQL-Anweisungen wird die Jet-Engine (ab Office 10 ACE) benötigt. Diese ist normalerweise mit einer beliebigen Office-Installation vorhanden und ohne zu setzenden Verweis verwendbar.

    Das ist kein Fehler. Es ist aber effektiver, eine Teillösung in Kenntnis der Gesamtlaufgabe zu entwickeln, um entsprechende Schnittstellen bereitstellen zu können. Außerdem kann die Codegestaltung davon abhängen: Eine relativ zeitraubende Objekterstellung (hier ADODB-Recordset) würde man nun nicht gerade in einer oft zu durchlaufenden Schleife wiederholen wollen.

    Wie beurteilst Du die Geschwindigkeit dieser Lösung?
     
  14. Guten Morgen zusammen,

    und herzlich willkommen in der Runde Ingolf.

    @Eberhard
    Was für eine Beschreibung *Smilie

    Werde die neuen Lösungsansätze testen und mich wieder melden. Muss jetzt leider erst zum Meeting, kann also mit der Rückmeldung etwas dauern.

    Bis dato schon mal vielen Dank!
     
  15. Hallo Ingolf,
    Hallo Eberhard,

    von meiner Seite erstmal ein herzliches Dankeschön an Euch beide für die Codes und die ausführlichen Erläuterungen sowie Links. Eure Anregungen werde ich sicherlich nutzen, um mein rudimentäres Wissen auf diesem Gebiet zu erweitern.

    Grüße
    EarlFred
     
    EarlFred, 4. August 2010
    #15
Thema:

MATRIX-Formel über VBA -> zu langsam

Die Seite wird geladen...
  1. MATRIX-Formel über VBA -> zu langsam - Similar Threads - MATRIX Formel VBA

  2. Formel bei Veränderung von dynamischem Array "mitziehen"?

    in Microsoft Excel Hilfe
    Formel bei Veränderung von dynamischem Array "mitziehen"?: Hallo liebes Forum, ich komme bei folgendem Problem nicht weiter und habe mir hier etwas Hilfe erhofft: Ich habe eine Tabelle mit Feedbacks zu Lehrgängen/Kursen. Diese will ich nach Dozent erst...
  3. Matrix Formel = "Falsch"

    in Microsoft Excel Hilfe
    Matrix Formel = "Falsch": Hallo, ich habe folgende Tabelle siehe Muster, bei der hinterlegten Formel in B51 {=WENNFEHLER(WENN(@PRabatt[Nettopreis]=0;WENN(SVERWEIS("Rabatt 1";MRabatt;2;0)=0;"";"Mengenrabatt ab...
  4. Matrix-Bezug von MTRANS-Formel dynamisch verändern?

    in Microsoft Excel Hilfe
    Matrix-Bezug von MTRANS-Formel dynamisch verändern?: Guten Abend zusammen, ich heiß Sarah und freue mich wieder ein gutes Excel-Forum gefunden zu haben, nachdem Office-Lösung.de ja leider weiterhin (?) offline ist. Folgendes Anliegen habe ich: Ich...
  5. Excel Matrix: Search Value and provide value next to it

    in Microsoft Excel Hilfe
    Excel Matrix: Search Value and provide value next to it: I have an Excel table that is a bit messy with different dates below each other. User Date0 property0 Date1 property1 User1 28/10/21 1000 27/10/21 3000 User2 27/10/21 2000 26/10/21 300 User1...
  6. Beim Einfügen von Spalten läst sich die Matrix Formel nicht ändern

    in Microsoft Excel Hilfe
    Beim Einfügen von Spalten läst sich die Matrix Formel nicht ändern: Hallo Ich habe ein Einbefeld von A-d20 In einer Matrixformel ab E1 wird ein Wert verglichen und dann in der Spalte-E als Doppelwerte übertragen, diese werden dann als vergleich für Markierung der...
  7. Matrix - Formel kombrimierbar?

    in Microsoft Excel Hilfe
    Matrix - Formel kombrimierbar?: Hallo zusammen, aktuell versuche ich den zeitlichen Ablauf von einem Produktionsprozess abzubilden. Die (Rüst)Zeiten ergeben sich durch die Umrüstung von der Merkmalskombination (vertikal) der...
  8. Formel für Datumssuche in generierter Matrix

    in Microsoft Excel Hilfe
    Formel für Datumssuche in generierter Matrix: Hallo zusammen, ich habe eine Herausfordung, deren Lösung sich mir einfach nicht erschließen will. Ich hoffe, jemand kann mir helfen :). Ich habe eine Tabelle, in der im Kopf zwei Zeilen...
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Auf dieser Website werden Cookies für die Zugriffsanalyse und Anzeigenmessung verwendet.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden