Office: Performance- bzw. Verständnisfrage

Helfe beim Thema Performance- bzw. Verständnisfrage in Microsoft Excel Hilfe um das Problem gemeinsam zu lösen; Hallo, ich habe früher mit einem ACCESS-basierten und selbst geschriebenen (nicht von mir) Warenwirtschaftssystem gearbeitet. Das größte Problem... Dieses Thema im Forum "Microsoft Excel Hilfe" wurde erstellt von fette Elfe, 11. November 2010.

  1. fette Elfe Erfahrener User

    Performance- bzw. Verständnisfrage


    Hallo,

    ich habe früher mit einem ACCESS-basierten und selbst geschriebenen (nicht von mir) Warenwirtschaftssystem gearbeitet.
    Das größte Problem damals war, dass (wenn überhaupt) nur wenige Werte fest hinterlegt wurden, somit also bei jedem Aufruf die entsprechenden Bestände und zugehörigen Werte neu berechnet wurden.
    Da die Datenbank recht umfangreich war und die Bestandsführung schon mehrere Jahre umfasste, hat so ein Aufruf meist etwas gedauert.
    Am aller nervigsten war, nach jedem Wechsel wurde wieder neu berechnet, sprich was ich noch vor ein oder zwei Minuten aufgerufen hatte, musste erneut berechnet werden wenn ich zwischenzeitlich etwas anderes aufrief.

    Da ich gerade eine einfache, und bei weitem nicht so umfangreiche Bestandsführung in Excel2007 programmiere, habe ich aus dieser Erfahrung heraus sämtliche Berechnungen reduziert.
    Alle Werte werden in Hilfszellen oder in den Stammdaten hinterlegt, und nur bei Änderungen aktualisiert (ohne immer alles von Anfang an neu zu berechnen).
    Auch habe ich in den einzelnen Blättern keinerlei Formeln hinterlegt (da die ja bei jedem Start und bei jeder Änderung immer alles neu berechnen würden), sondern lasse alles über Macros laufen, die nur die hinterlegten Werte mit den Änderungen zusammen rechnen und aktualisieren.

    D.h. ich arbeite sehr viel mit Zellbezügen, Blattverweisen usw.

    Die Grundfunktionen sind fertig, ich arbeite seit etwa zwei Wochen damit und alles läuft schneller als ich befürchtet hatte. Bin also zufrieden.


    Dies zur Erklärung, ich hoffe sie ist soweit verständlich.


    Nun meine eigentliche Frage:

    Ist mein eingeschlagener Weg der generell schnellere?
    Oder merke ich nur keine großartige Verzögerung weil die Datenmenge noch relativ gering ist?

    Sprich was geht bei hoher Auslastung schneller:
    - viele Zahlen via eingebettete Formeln ständig neu berechnen
    oder
    - viele Aufrufe von Zellwerten, Verweise auf andere Blätter, springen zwischen zwei Dateien, neu errechnete Werte in Zellen schreiben etc.


    Ich frage jetzt nicht weil ich ein konkretes Problem habe, sondern weil ich lernen und verstehen möchte.
     
    fette Elfe, 11. November 2010
    #1
  2. schatzi Super-Moderator
    Hallo!

    Das kommt natürlich auf die Formeln an, die du verwendest.
    In der Regel sind die "Grund"-Funktionen (WENN, SUMME, SVERWEIS, usw.) schneller als eine entsprechend programmierte VBA-Variante.
    Verwendest du aber viele verschachtelte Formeln, die möglicherweise darüberhinaus auch noch Matrix-Formeln sind, dann kann eine clever programmierte VBA-Routine sogar deutlich schneller sein.

    Aber zum Punkt:
    Bloß, weil du Formeln verwendest, heißt das noch lange nicht, dass diese auch ständig neu berechnet werden müssen!
    Du kannst in den Excel-Optionen die Berechnung für deine Mappe auf "manuell" stellen; dann werden die Formeln nur beim Tastendruck auf [F9] neu berechnet.
     
  3. fette Elfe Erfahrener User
    Hallo schatzi,

    bisher habe ich eigentlich nur Grundrechenarten verwendet.
    Eventuell kommt später noch Statistik dazu, da weiß ich jetzt noch nicht was ich dann alles brauche.

    Allerdings sind diese Grundrechenarten natürlich an diverse Bedingungen geknüpft, die ich über if then oder select case abfrage.
    Die Formeln dazu würden mehrfach verschachtelt, denke ich.

    Mein Gedanke war halt:
    es müsste doch eigentlich effizienter sein, einen bestehenden Wert mit einem neuen zu verrechnen und zu aktualisieren, als eine ständig wachsende Liste von Werten zu summieren, subtrahieren etc., vor allem wenn an jede Berechnung verschiedene Bedingungen geknüpft sind, und auch bei weitem nicht jede Berechnung bei jeder Änderung erneuert werden muss.
    Per Makro wird halt immer nur das neu berechnet, was sich auch wirklich ändert.

    Danke für den Tipp mit den Excel-Optionen. Habe ich noch nie benutzt und dachte bisher, das gehe nicht nur für eine Mappe, sondern wäre dann für Excel komplett.

    Dazu habe ich 2 Fragen:

    - wird bei F9 jeweils nur das aktive Blatt, oder halt das Blatt wo sich etwas geändert hat neu berechnet? Oder dann halt auch wieder die komplette Mappe? Denn wir reden hier von im Moment knapp 100 verschiedenen Artikeln, jeder mit einem eigenen Blatt. Und die Anzahl wird auf vermutlich etwa 200 steigen.
    Und jeden Tag werden die Listen auf den Blättern länger.

    - könnte man den Tastendruck auf F9 auch per Makro auslösen? Denn es soll ja automatisch gehen, manuell nutzt mir das nichts.
     
    fette Elfe, 11. November 2010
    #3
  4. schatzi Super-Moderator

    Performance- bzw. Verständnisfrage

    Hallo!

    Soweit ich weiß, berechnet [F9] alle geöffneten Mappen neu.
    Shift+[F9] berechnet nur das aktive Tabellenblatt.
    Der VBA-Befehl lautet
    Code:
    Application.Calculate
    Oder du rufst den Tastendruck per "SendKeys" auf.


    edit: http://office.microsoft.com/en-us/excel-help/excel-shortcut-and-function-keys-HP001111659.aspx
     
  5. Beverly
    Beverly Erfahrener User
    Hi Achim,

    mal eine generelle Antwort auf die Frage - Formel vs. VBA:

    ich habe die Erfahrung gemacht, dass bei großen Projekten eine Kombination aus beiden das Optimale ist. Häufig ist es auch so, dass eine komplizierte Formel sich nicht so ohne Weiteres in VBA umsetzen lässt, wenn überhaupt.

    Auf jeden Fall sollte man (bei umfangreichen Projekten), wenn man VBA-Code laufen lässt, zu Beginn mittels Application.Calculation = False die automatische Berechnung aus- und am Ende mit = True wieder einschalten. Zu beachten ist dabei, dass man beim Öffnen der Arbeitsmappe überprüft, welche Berechnungsart eingestellt ist, weil dies Excel-weit gilt. Somit kann man sie bei Deaktivieren bzw. Schließen der Arbeitsmappe wieder in den Ursprungszustand zurücksetzen. Das betrachte ich als einen ganz wichtigen Punkt, weil sich sonst der Benutzer wundert, weshalb seine Einstellungen möglicherweise nicht mehr stimmen. Außerdem kann es durchaus sein, dass man in einer weiteren geöffneten Arbeitsmappe nicht die manuelle sondern die automatische Einstellung benötigt, falls automatisch die vorherige Grundeinstellung war.

    Was das Springen zwischen Arbeitsmappen per Code angeht, da kann man vieles vereinfachen, indem man auf Select und Activate verzichtet, was das Projekt um ein Vielfaches schneller macht.

    Datenübernahmen lassen sich auch häufig mit Hilfe von Arrays lösen wenn es sich nicht um einzelne Zellen sondern Zellbereiche handelt, sodass man nicht jede Zelle in einer Schleife einzeln übertragen muss; auch Berechnungen lassen sich so schneller erledigen.

    Daten, die man immer wieder verwendet, legt man besser in versteckten Tabellenblättern ab, als dass man sie z.B. immer wieder neu berechnet. Oder man gibt sie als Konstanten im Code vor. Bei sehr vielen derartigen Daten ist ein Tabellenblatt aber wesentlich übersichtlicher (für den Programmierer).

    Wenn man sowohl Code hat der auf Veränderungen im Tabellenblatt reagiert als auch Code, der Daten in ein Tabellenblatt einträgt, dann kann man zu Beginn mit Application.EnableEvents = False die Reaktion auf die Eingabe abschalten, wenn diese nicht erwünscht ist - aber am Ende nicht vergessen sie mittels = True wieder einschalten, denn sonst reagiert nichts mehr auf eine Eingabe.

    Wichtig ist auch, dass man die Bildschirmaktualisierung zu Beginn eines Codes aus- und am Ende wieder einschaltet - aber das weist du sicher, ich wollte es nur der Vollständigkeit halber noch einmal aufführen.

    Das sind mal einige grundlegende Dinge, die mir gerade einfallen und die ich immer beachte, wenn ich ein umfangreiches Projekt plane und erstelle. Ich hoffe, die Tipps helfen dir weiter.

    Bis später,
    Karin
     
  6. fette Elfe Erfahrener User
    Hallo Karin und schatzi,

    danke an Euch beide,
    Ihr habt mir wieder einige neue Denkanstöße gegeben.

    @schatzi

    die Geschichte mit F9 ist sehr interessant (überhaupt der komplette Link).
    Auch wenn ich bei diesem Projekt wohl darauf verzichten werde, so ist dieses neue Wissen abgespeichert und wird bestimmt irgendwann mal hilfreich sein.


    @Karin

    die automatische Berechnung während des Code-Durchlaufes auszuschalten ist ein guter Tipp. Daran habe ich noch garnicht gedacht.
    Allerdings, so vermute ich, brauche ich es diesmal nicht, denn wenn ja eh keine Formeln in den Zellen stehen, sondern alles über Code läuft, was sollte Excel denn dann automatisch berechnen?
    Oder habe ich da mal wieder einen Denkfehler?

    Auf select und activate so weit wie möglich zu verzichten, wurde mir schon ganz am Anfang meines VBA-Lernens hier im Forum ans Herz gelegt.
    Aber man kann es vermutlich nicht oft genug wiederholen. *zwinker*

    Allerdings habe ich festgestellt, dass es wohl Situationen gibt, wo man nicht drumherum kommt.
    Bsp. aus meinem aktuellen Projekt:
    Startblatt ist aktiv, über dortigen Command-Button wird eine UserForm aufgerufen, über diese UserForm wird ein Vorlagenblatt mit Daten befüllt und ausgedruckt.
    Ohne dieses Vorlagenblatt zwischenzeitlich zu aktivieren kann ich es nicht ausdrucken.

    Code der auf Veränderungen im Blatt reagiert habe ich diesmal nicht, ich habe den direkten Zugriff auf die Blätter unterbunden und mache alles über Eingabemasken (UserForms).
    Aber, auch dieser Tipp ist abgespeichert.

    Überhaupt sind Deine Tipps hilfreich, egal ob neu für mich, oder bereits bekannt. Denn dann bestärken sie mich, dass ich auf dem richtigen Weg bin, oder erinnern mich, was ich mal wieder vergessen habe.




    Bei der Gelegenheit möchte ich einfach mal generell Danke sagen.
    Vor gut einem Jahr war Excel für mich noch ein "besserer Taschenrechner".
    Klar, etwas Vorwissen hatte ich, aber sehr begrenzt.

    Und auch wenn ich vermutlich immernoch nur an der Oberfläche der Möglichkeiten dieses Programms kratze, ohne das heutige Internet, und damit meine ich die vielen hilfsbereiten Menschen, die diese Technologie mit Leben erfüllen, ohne Hilfeseiten, Foren nach ähnlichen Problemen durchsuchen bzw. direkte Frage in Foren stellen zu können, ohne eben diese Menschen die mir Ihre Zeit und Aufmerksamkeit schenken, die wer weiß wie weit von mir entfernt sind und mich garnicht kennen, ohne das alles hätte ich nicht die geringste Chance gehabt auch nur annähernd soviel zu lernen, bzw. zu lösen und zu machen.

    Natürlich gibt es Bücher etc., aber abgesehen vom Geld (welches während einer Ausbildung nunmal immer knapp ist), hätte ich auch garnicht die Zeit gehabt erst mal Monate- oder Jahrelang zu lernen und mir alle Lösungen selber zu erarbeiten.

    Bei all dem Müll der durch das Web in unser Leben kommt, entspricht dies doch genau dem ursprünglichen Geist der Idee zu einem weltweiten Netzwerk.
    Wissen teilen.
    Und das sich so etwas in unserer heutigen Gesellschaft hält, das es gepflegt wird, das finde ich bemerkenswert.

    Danke.
     
    fette Elfe, 13. November 2010
    #6
  7. Beverly
    Beverly Erfahrener User
    Hi Achim,

    die automatische Berechnung auszuschalten ist natürlich nur erforderlich, wenn man Berechnungen im Tabellenblatt ausführt, also Formeln vorhanden sind. Allerdings ist das auch zweckmäßig, wenn Diagramme enthalten sind, denn auch bei Werteveränderungen in Diagramm erfolgt eine Berechnung.
    Berechnungen kann man auch erzwingen, ohne dass die automatische Berechnung eingeschaltet wird, und zwar mit dieser Codezeile:

    Code:
    Application.Calculate
    Will man die Berechnung nur auf ein bestimmtes Tabellenblatt oder nur auf einen bestimmten Bereich beziehen, kann man dies verwenden:

    Code:
    Worksheets("Tabelle1").Calculate
    bzw.
    Code:
    Worksheets("Tabelle1").Range("A1:C200").Calculate

    Du hast natürlich Recht, dass es Situationen gibt, in denen eine Zelle, Tabellenblatt oder Arbeitsmappe selektiert bzw. aktiviert werden müssen, aber die sollte man nach Möglichkeit so gering wie möglich halten. In einigen Fällen kann man auch Application.Goto verwenden, anstelle zuerst das Tabellenblatt zu aktivieren und dann eine Zelle zu selektieren - das spart schon einen Zwischenschritt ein.
    In dem von dir genannten Beispiel beim Drucken muss man das Tabellenblatt jedoch nicht per Code aktivieren - das geschieht automatisch von Excel aus, wenn du so etwas schreibst wie:
    Code:
        Worksheets("Tabelle1").PrintOut
    
    während du dich auf einem anderen Tabellenblatt befindest.

    Bis später,
    Karin
    Code:
    
    
     
  8. fette Elfe Erfahrener User

    Performance- bzw. Verständnisfrage

    Hallo Karin,

    ich benutze aber nicht:

    Code:
    Worksheets("Tabelle1").PrintOut 
    sondern

    Code:
    Application.Dialogs(xlDialogPrint).Show
    damit der richtige Drucker ausgewählt werden kann, nicht immer alle Seiten ausgedruckt werden, usw.
     
    fette Elfe, 13. November 2010
    #8
  9. Beverly
    Beverly Erfahrener User
    Hi Achim,

    in diesem Fall ist das natürlich etwas anderes - aber da ich es ablehne, übers Internet auf fremde Rechner zu schauen :lol:, konnte ich das natürlich nicht wissen :-). Spaße beiseite - wie ich schon geschrieben hatte: es gibt Situationen, in denen es nicht anders geht, aber man sollte sie so gering wie möglich halten bzw. nur so oft wie unbedingt nötig herbeiführen.

    Bis später,
    Karin
     
  10. miriki Erfahrener User
    Ich würde dazu gerne noch anmerken:

    Es gibt Situationen, wo es nicht zeingend notwendig ist, aber "ergonomisch" sinnvoll erscheint.

    Ich habe hier Job-bedingt überwiegend Excel-Applikationen, die elend lange Liste abarbeiten. Also die übliche Schleife mit y=2 und dann while bis cells(y,1)="" oder so in der Art. Diese Listen haben typischerweise mehr als 10.000, ein Großteil sogar mehr als 30.000 Zeilen.

    Die Auswertungen werden meist über einen Button auf dem Blatt "Auswertung" gestartet, wo man auch noch diverse Parameter einstellen kann. Nach Button-Druck werden dann z.B. die CSV-Dateien importiert und abgearbeitet.

    Obwohl es die Abarbeitung ausbremst: Ich schalte per Code auf das Listen-Blatt und verfolge mit dem Cursor auch die aktuell bearbeitete Zeile.

    Der Grund ist simpel: Als ich das nicht gemacht hatte, kamen hier die Anrufe, daß sich die Anwendung wohl aufgehangen habe. Denn nach Button-Druck passierte ja nix mehr und wenn man dann noch 1, 2 mal mit der Maus klickt, meldet Windows für das Excel-Fenster sogar "keine Rückmeldung". Einige waren auch schlau genug, Excel über den Task-Manager abzuschießen.

    Screen-Updating und Konsorten schalte ich eigentlich nur aus, wenn durch derartige Beschleunigung die Abarbeitung weniger als 2 bis 5 Sekunden dauert. Dauert es länger, lasse ich den Anwender lieber wissen, was so alles passiert, auch wenn es die Abarbeitung noch weiter ausbremst.

    Letztendlich: Dem Anwender ist es meistens völlig egal, ob die Abarbeitung 13 oder 15 Minuten dauert, aber 5 Sekunden ohne sichtbare Rückmeldung machen jeden nervös. Und da hilft meist auch keine Userform mit "bitte warten..." mehr.

    Die Königsklasse wäre aber sicherlich eine Userform mit "Ladebalken", wenn man weiß, wieviele Durchläufe insgesamt notwendig sind. Alternativ wäre eine Userform mit rotierender (oder was auch immer) Animation bei unbekannter Gesamtdauer auch möglich.

    Gruß, Michael
     
  11. Beverly
    Beverly Erfahrener User
    Hi Michael,

    Dann bist du aber einer der wenigen Ausnahmen an Usern, die länger als unbedingt notwendig vor dem Bildschirm sitzen wollen... ;-) - die meisten wollen das nicht. Ich bin überzeugt (und kenne das aus eigener Erfahrung im Job), dass die Zeit, wie lange ein Programm braucht, in den überwiegenden Fällen ausschlaggebend ist und der Wunsch besteht, sie so gering wie möglich zu halten. Deine Ausführungen widersprechen aber in keiner Weise meiner Aussage, dass man die Situationen, in denen man etwas selektiert nur so oft wie unbedingt nötig herbeiführen sollte - wenn du meinst, dass es für dich (oder die Benutzer deines Programms) notwendig ist, dann ist das eine derartige Ausnahmesituation.

    Damit Abläufe ohne sichtbare Aktion auf dem Bildschirm niemanden nervös machen, kann man sinnvollerweise dadurch umgehen, dass man den Benutzer richtig in das Programms einweist und auf entsprechende Wartezeiten aufmerksam macht. Ein UserForm mit dem entsprechenden Hinweis tut danach schon Wunder. Und wenn - wie du geschrieben hast - etwas gedruckt wird, kann man den Benutzer durchaus darauf hinweisen, dass während dieser Zeit der Druckmanager aktiv ist und man daran erkennt, dass noch eine Aktion abläuft.

    Bezüglich eines UserForms mit Fortschrittsanzeige findest du auf der HP von Hajo Ziplies: Fortschrittsanzeige

    Bis später,
    Karin
     
  12. fette Elfe Erfahrener User
    Hallo Karin & Michael,

    sehr interessant was Ihr zwei so schreibt.

    Teilweise zum lachen (Excel über Task-Manager abzuschießen...),
    teilweise aber auch ein böser, böser Spiegel in den ich blicke. *schäm*

    Ich gehöre selber zu den Leuten die ruckzuck ungeduldig werden.

    Handelt es sich um eine kommerzielle Anwendung, erwarte ich das auch etwas passiert wenn ich *klicke*.
    Handelt es sich um eines meiner Makros, habe ich immer sofort Panik im Hinterkopf das irgendwas schief läuft oder sich gerade aufhängt, wenns mal wieder länger dauert. *lach*

    Deshalb färbe ich Command-Buttons beim Auslösen um, und wenn alles abgearbeitet ist färbe ich wieder zurück.
    So sieht man schonmal wenn etwas feddich ist.

    Oder ich arbeite mit Application.Screenupdating .
    Ein ab und zu flackernder Bildschirm beruhigt die Nerven... *grins*

    Und bei ein oder zwei Makros häng ich nen Zettel an meinen Monitor "Finger Weg! Work in Progress!" und geh mir erstmal eine rauchen...
    (das Mauskabel ist nicht lang genug, so komme ich nicht in Versuchung)


    Allerdings habe ich auch den Vorteil, das meine Machwerke außer mir nur ein oder höchstens zwei Leute benutzen.
    Die kann man noch halbwegs *erziehen*.




    Habe gerade die Tage was sehr interessantes zum verhalten der Leute in solchen Situationen gelesen, finde es nur leider gerade nicht mehr.
     
    fette Elfe, 15. November 2010
    #12
  13. Beverly
    Beverly Erfahrener User

    Performance- bzw. Verständnisfrage

    Hi Achim,

    es gibt viele Möglichkeiten, dem Benutzer/Bediener anzuzeigen, dass noch irgendetwas abläuft - ein gefärbter Schalter (wie du richtig genannt hast), eine veränderte Schalteraufschrift, eine MsgBox die vom Benutzer mit Ok bestätigt werden muss, ein UserForm welches erst nach Beendigung des Codes geschlossen wird usw. Diese Verfahrensweisen kann man problemlos anwenden, ohne dass man den Programmablauf durch sichtbares Anwählen von Zellen, Tabellenblättern u.ä. verlangsamt - aber das ist meine ganz persönliche Meinung.

    Das funktioniert auch korrekt, solange es sich um Prozesse innerhalb von Excel handelt. Es kann allerdings Probleme geben, wenn Fremdprogramme angesprochen werden, weil es nicht in jedem Fall möglich ist, den Zeitpunkt der Beendigung des Fremdprogramms festzustellen und erst danach per Excel die entsprechende Information auszugeben, denn meist ist der Code schon komplett durchgelaufen und in Excel passiert nichts mehr. Deshalb ist es - wie ich schon geschrieben habe - wichtig, den Benutzer auf derartige Dinge hinzuweisen, sodass er eben nicht einfach das Schließen von Excel erzwingt.

    Bis später,
    Karin
     
  14. miriki Erfahrener User
    ... gehören gerade nicht dazu. ;-)

    Der User weiß dann nicht, daß "immer noch" etwas läuft. Was passiert denn da letztendlich? Er hat einen Button gedrückt und, sagen wir mal, eine Messagebox hat ihn darauf hingewiesen, daß dieser Vorgang einige Minuten dauern kann. An diese Meldung erinnert er sich nach 2 Minuten, nach 5 Minuten auch noch, nach 10 Minuten wird er nervös, nach 15 Minuten spätestens kommen die ersten nervösen Mausklicks, Escape-Drücke usw. Wenn Windows daraufhin auch noch ein "keine Rückmeldung" in die Titelleiste von Excel schreibt, dann ist's endgültig mit dem User-Vertrauen dahin.

    ScreenUpdating ausschalten? Das bringt gar nicht mal so viel, wenn nicht gescrollt, positioniert und neuberechnet wird. Da steht der Bildschirm sowieso und braucht keine Updates. Neuberechnen ausschalten? Das bringt auch nur wirklich was, wenn durch das Makro Werte beeinflußt werden, die wiederum Formel-Ergebnisse beeinflussen.

    Aber selbst das Positionieren des Cursors durch "cells(y,x).activate" ist eigentlich gar nicht sooo schlimm, wie man denken könnte. Was ein wirklicher Killer ist, das ist das Wechseln zwischen Arbeitsblättern mittels "worksheets(nnn).activate".

    Ich hab mal ein Beispiel ohne größeren Nährwert gebastelt. Man könnte es als die so ziemlich komplizierteste Form, eine Dezimalzahl in eine Hexadezimalzahl unter Zuhilfenahme eines manuellen SVerweis umzurechnen, bezeichnen. Auf "Tabelle1" befindet sich:
    <TABLE border="1" cellspacing="0" cellpadding="3"><TR><TD width="20" bgcolor="#c0c0c0">.</TD><TD width="100" align="center" bgcolor="#c0c0c0">A</TD><TD width="100" align="center" bgcolor="#c0c0c0">B</TD><TD width="100" align="center" bgcolor="#c0c0c0">C</TD><TD width="100" align="center" bgcolor="#c0c0c0">D</TD><TD width="100" align="center" bgcolor="#c0c0c0">E</TD><TD width="100" align="center" bgcolor="#c0c0c0">F</TD><TD width="100" align="center" bgcolor="#c0c0c0">G</TD><TD width="100" align="center" bgcolor="#c0c0c0">H</TD><TD width="100" align="center" bgcolor="#c0c0c0">I</TD></TR><TR><TD align="center" bgcolor="#c0c0c0">1</TD><TD bgcolor="#FFFFFF">=ZEILE()-1</TD><TD bgcolor="#FFFFFF">=GANZZAHL(A1/(16^3))</TD><TD bgcolor="#FFFFFF">=A1-(B1*16^3)</TD><TD bgcolor="#FFFFFF">=GANZZAHL(C1/(16^2))</TD><TD bgcolor="#FFFFFF">=C1-(D1*16^2)</TD><TD bgcolor="#FFFFFF">=GANZZAHL(E1/(16^1))</TD><TD bgcolor="#FFFFFF">=E1-(F1*16^1)</TD><TD bgcolor="#FFFFFF">=GANZZAHL(G1/(16^0))</TD><TD bgcolor="#FFFFFF">=G1-(H1*16^0)</TD></TR></TABLE>und das ganze heruntergezogen bis Zeile 32768.

    Auf "Tabelle2" befindet sich
    <TABLE border="1" cellspacing="0" cellpadding="3"><TR><TD width="20" bgcolor="#c0c0c0">.</TD><TD width="100" align="center" bgcolor="#c0c0c0">A</TD><TD width="100" align="center" bgcolor="#c0c0c0">B</TD></TR><TR><TD align="center" bgcolor="#c0c0c0">1</TD><TD bgcolor="#FFFFFF">0</TD><TD bgcolor="#FFFFFF">0</TD></TR><TR><TD align="center" bgcolor="#c0c0c0">2</TD><TD bgcolor="#FFFFFF">1</TD><TD bgcolor="#FFFFFF">1</TD></TR><TR><TD align="center" bgcolor="#c0c0c0">3</TD><TD bgcolor="#FFFFFF">2</TD><TD bgcolor="#FFFFFF">2</TD></TR><TR><TD align="center" bgcolor="#c0c0c0">4</TD><TD bgcolor="#FFFFFF">3</TD><TD bgcolor="#FFFFFF">3</TD></TR><TR><TD align="center" bgcolor="#c0c0c0">5</TD><TD bgcolor="#FFFFFF">4</TD><TD bgcolor="#FFFFFF">4</TD></TR><TR><TD align="center" bgcolor="#c0c0c0">6</TD><TD bgcolor="#FFFFFF">5</TD><TD bgcolor="#FFFFFF">5</TD></TR><TR><TD align="center" bgcolor="#c0c0c0">7</TD><TD bgcolor="#FFFFFF">6</TD><TD bgcolor="#FFFFFF">6</TD></TR><TR><TD align="center" bgcolor="#c0c0c0">8</TD><TD bgcolor="#FFFFFF">7</TD><TD bgcolor="#FFFFFF">7</TD></TR><TR><TD align="center" bgcolor="#c0c0c0">9</TD><TD bgcolor="#FFFFFF">8</TD><TD bgcolor="#FFFFFF">8</TD></TR><TR><TD align="center" bgcolor="#c0c0c0">10</TD><TD bgcolor="#FFFFFF">9</TD><TD bgcolor="#FFFFFF">9</TD></TR><TR><TD align="center" bgcolor="#c0c0c0">11</TD><TD bgcolor="#FFFFFF">10</TD><TD bgcolor="#FFFFFF">A</TD></TR><TR><TD align="center" bgcolor="#c0c0c0">12</TD><TD bgcolor="#FFFFFF">11</TD><TD bgcolor="#FFFFFF">B</TD></TR><TR><TD align="center" bgcolor="#c0c0c0">13</TD><TD bgcolor="#FFFFFF">12</TD><TD bgcolor="#FFFFFF">C</TD></TR><TR><TD align="center" bgcolor="#c0c0c0">14</TD><TD bgcolor="#FFFFFF">13</TD><TD bgcolor="#FFFFFF">D</TD></TR><TR><TD align="center" bgcolor="#c0c0c0">15</TD><TD bgcolor="#FFFFFF">14</TD><TD bgcolor="#FFFFFF">E</TD></TR><TR><TD align="center" bgcolor="#c0c0c0">16</TD><TD bgcolor="#FFFFFF">15</TD><TD bgcolor="#FFFFFF">F</TD></TR></TABLE>

    So... Jetzt soll eine Schleife Tabelle1 durchlaufen und die Werte aus den Spalten B, D, F, H auslesen, jeweils in Tabelle2 nachschlagen und die 4 Werte als einen kombinierten String in Spalte J auf Tabelle1 eintragen.

    Das schlimmste Vorgehen ist, in jedem Auslese-Vorgang das jeweilige Blatt und die dortige Zelle zu aktivieren. Aber das ist, glaube ich, auch ganz offensichtlich. Neben den 32768 Positionierungen auf Tabelle1 würden dann noch 32.768 Wechsel auf Tabelle2 (und wieder zurück) und dort 278.528 Positionierungen dazukommen. Overkill... Auf dem Rechner hier hat ein derartiger Durchlauf über 27 Minuten gedauert und der Bildschirm hat durch die Blattwechsel wie irre geflackert. Vom "Kreislauf"-Kollaps des Lüfters mal ganz abgesehen...

    Als ich nur den Wechsel auf das 2. Blatt weggelassen, die Positionierung auf der bearbeiteten Zeile in Tabelle1 aber belassen hatte, reduzierte sich die Laufzeit auf ca. 1 Minute. Es gab kein wildes Geflacker, der Lüfter blieb ruhig und man sah, wie die Zeilen an einem vorbeihuschten. Schön, anderen bei der Arbeit zuzugucken...

    Dann hatte ich auch noch die Positionierung auf Tabelle1 weggelassen. Es gab nochmals einen kräftigen Schub auf ca. 1/2 Minute runter. Nur, daß man jetzt eben nicht mehr sah, ob noch was passierte, war schon ziemlich komisch. Bei 1/2 Minute kann man das aber noch durchstehen.

    Wäre durch Abschalten des Bildschirm-Updates oder der Neuberechnung noch was rauszuholen? Nöe... Die +/- 1 Sekunde halte ich mal für Meßungenauigkeit, aber nicht für eine Performance-Verbesserung. Aber: Da der Cursor nicht bewegt wurde, gab es ja auch keine Notwendigkeit, den Bildschirm zu aktualisieren. Und die Ergebnisse, die in das Blatt geschrieben wurden, hatten keinen Einfluß auf die Formeln, so daß also auch keine Neuberechnung notwendig war. In diesem Fall wurden also 2 Punkte ausgeschaltet, die sowieso nicht zum Tragen kamen.

    Dann hatte ich per UserForm noch einen Ladebalken dazugebastelt. Die zusätzliche Verwaltung schlug dann mit ca. 5 Sekunden zu Buche. Eine Investition, die sich lohnt.

    Meine Favoriten bleiben nach wie vor:
    a) Positionierung auf der "Master"-Tabelle, um ohne weiteren Aufwand den Fortschritt bei der Abarbeitung des Haupt-Tasks anzuzeigen = keine Abschaltung von Bildschirm-Update und Abschalten der Neuberechnung je nach Situation
    b) Weglassen der Positionierung, dafür aber Anzeige einer Animation, die im Idealfall ein Ladebalken ist, aber mindestens aus einer kontinuierlichen Bewegung bestehen sollte. Heißt aber auch: Zusätzlicher Aufwand durch UserForm und Modul.

    Meine "no go" sind nach wie vor:
    a) Abschalten des Bildschirms - Sieht aus, als wenn sich der Rechner aufgehangen hat. Besonders schlimm, wenn ein Button dann im "eingedrückten" Zustand stehenbleibt und der Mauscursor zur Sanduhr wird.
    b) einmalige Hinweise beim Start des Rechenlaufs - Die sind nach wenigen Minuten vergessen und weichen der Nervosität, ob sich der Rechner nicht vielleicht doch aufgehangen hat. Vergleiche: Eine Haftnotiz "komme gleich wieder" direkt neben dem Klingelschild eines gewissen Godot...

    Die Formeln auf Blatt "Tabelle1" im Anhang sind auf die 1. Zeile reduziert, um die Größe des Attachments klein zu halten. Vor Benutzung sollten diese also bis z.B. Zeile 32768 heruntergezogen werden... (Bei anderer Zeilen-Anzahl stimmt der Ladebalken nicht, die 32768 ist hardcodiert.)

    Gruß, Michael
     
  15. miriki Erfahrener User
    Oh, ich hab doch glatt vergessen, daß dort ja auch noch 4x durchlaufen wird. Also sind's dann 1.114.112 Positionierungen...

    Gruß,. Michael
     
Thema:

Performance- bzw. Verständnisfrage

Die Seite wird geladen...
  1. Performance- bzw. Verständnisfrage - Similar Threads - Performance Verständnisfrage

  2. Performance bei Ausführung Tabellenerstellungsabfrage

    in Microsoft Access Hilfe
    Performance bei Ausführung Tabellenerstellungsabfrage: Guten Tag miteinander. Ich habe eine Access-DB (.mdb) auf die ca 10 Leute zugreifen. Wenn ich zwischendrin mal ein oder zwei Tabellenerstellungsabfragen (für damit verknüpfte Brief-Vorlagen)...
  3. Schnellere Lösung als Index Vergleich gesucht um aus Zeileninfos Matrix zu bilden

    in Microsoft Excel Hilfe
    Schnellere Lösung als Index Vergleich gesucht um aus Zeileninfos Matrix zu bilden: Hallo ich habe folgenden Sachverhalt: Personaldaten und Veränderungen in Gehältern werden im Sheet 'Liste' in Listenform erfasst. Für jede Gehaltsänderung bekommt der jeweilige MA eine neue Zeile...
  4. Performance Probleme beim Makro

    in Microsoft Excel Hilfe
    Performance Probleme beim Makro: Hallo zusammen, ich habe mir folgendes kleines Programm gebastelt. Als "Laie" macht es zumindest was es soll... aber wenn es über 36 TSD Zeilen läuft, ist die Performance unterirdisch. Habt ihr...
  5. KPIs (Key Performance Indicators) in Power Pivot

    in Microsoft Excel Tutorials
    KPIs (Key Performance Indicators) in Power Pivot: KPIs (Key Performance Indicators) in Power Pivot Excel für Microsoft 365 Excel 2019 Excel 2016 Excel 2013 Mehr... Weniger...
  6. For Schleife, schlechte Performance

    in Microsoft Excel Hilfe
    For Schleife, schlechte Performance: Hallo zusammen, ich habe eine Tabelle mit 22.000 Ids, welche ich in einer 55.000 Zeilen großen Bestandstabelle Suche und bei Treffer einen Wert in einer Nachbarspalte überprüfe. Je nach...
  7. Performance / langsames Netzwerk / Frontend

    in Microsoft Access Hilfe
    Performance / langsames Netzwerk / Frontend: Hallo zusammen, Ich habe mal eine Frage an die erfahrenen hier: Situation: - Netzwerk ist unglaublich langsam - Aufteilung in Front- und Backend war notwendig Lösung: jegliche Stammdaten sind...
  8. einen BIS-Wert aus Tabelle auslesen

    in Microsoft Access Hilfe
    einen BIS-Wert aus Tabelle auslesen: Hallo zusammen, stehe wieder auf dem Schlauch.... :(. Folgendes Problem: In einer Abfrage habe ich eine Prozentwert. In einer Tabelle habe ich mehrer Prozentbereiche und einen...
  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