Zeitbedarf Schleifenabarbeitung

Hallo zusammen,

ich habe eine Schliefe, welche eine wechselnde Anzahl von Datensätzen einliest, diese aufhübscht und dann eine xlsx-Datei abspeichert. Die Daten werden über Direktlinks eingelesen und dann festgeschrieben. Der Code selbst ist auch nicht das Problem.

Ich habe jetzt allerdings festgestellt, dass die Erstellung der Dateien und abhängig von den zu verarbeitenden Daten jeweils 25 Sekunden länger dauert als die vorhergehende Auswertung, sprich als der vorhergehende Schleifendurchlauf. Bei über 100 auszuwertenden Datensätzen ist das nciht so schön.

Da ich mit jedem neuen Durchlauf unsere Vorlage neu öffne, kann ich mir nicht vorstellen, dass die Vorlage selbst vollgemüllt wird.

Kennt jemand Ansätze im Bereich von Codes, die dazu führen, dass die Abarbeitung immer mehr Zeit in Anspruch nimmt?

Grüße und Dank.

Hallo kackei,

mal ein Schuss ins Blaue: Hast du in der Excel-Mappe, in die du die Daten einliest, viele Formeln, die sich auf die eingelesenen Daten beziehen? Wenn ja, schalte mal die Automatische Neuberechnung ab:

Application.Calculation = xlCalculationManual

Am Ende kannst du dann mit

Application.Calculate

neu berechnen.

Gruß, Andreas

Hallo Andreas,

keine schlechte Idee. Ich habe hier und da eine Formel (im Excel-Sinne), überschreibe aber alles direkt danach, so dass ich im Endeffekt keine Formeln mehr in der Datei stehen habe.

Ich meine aber auch, dass dies theoretisch egal sein müsste, da ich die gefüllte Datei ja speichere und schließe.

Ich habe ja so leise den Verdacht, dass es was mit ScreenUpdating=False zu tun hat, denn wenn ich eine Datei einzeln erstelle, dauert es erstens sehr viel weniger, bis das Ergebnis steht und zweitens lässt sich diese Zeit reproduzieren, wenn ich die Erstellung noch einmal starte.

Der Unterschied zwischen beiden Vorgängen ist der Einsatz von ScreeUpdating=False (ist halt anders gemacht). Ich kann es mir aber auch nicht wirklich erklären, seit ich Office2010 habe, verstehe ich die Logik mit diesem Befehl nicht mehr (2003 war eindeutiger und planbarer für mich).

In diesem Zusammenhang: Excel zeigt ja ein kleines Fenster an, wenn ich speichere, in dem der Fortschritt des Speicherns angezeigt wird. Gibt es einen Befehl, der das Anzeigen dieses Fortschrittbalkens unterdrückt?

Grüße.

Hallo Andreas,

Hi kackei

Ich habe ja so leise den Verdacht, dass es was mit
ScreenUpdating=False zu tun hat, denn wenn ich eine Datei
einzeln erstelle, dauert es erstens sehr viel weniger, bis das
Ergebnis steht und zweitens lässt sich diese Zeit
reproduzieren, wenn ich die Erstellung noch einmal starte.

Also ScreenUpdating=False beschleunigt auf alle Fälle alles, bei dem sich auf dem Monitor normalerweise viel tun würde.

aber auch nicht wirklich erklären, seit ich Office2010 habe,
verstehe ich die Logik mit diesem Befehl nicht mehr (2003 war
eindeutiger und planbarer für mich).

Wieso, was ist an ScreenUpdating 2010 anders als bei 2003?

In diesem Zusammenhang: Excel zeigt ja ein kleines Fenster an,
wenn ich speichere, in dem der Fortschritt des Speicherns
angezeigt wird. Gibt es einen Befehl, der das Anzeigen dieses
Fortschrittbalkens unterdrückt?

Wüsste nicht, wie man den wegbekommt. Eventuell in dem man mit Windows API-Aufrufen in den tiefsten Tiefen rumfummelt. Da kenne ich mich aber noch zu wenig aus.

Grüße.

Ich muss gestehen, dass ich die Erklärungen in deinem UP nicht so recht verstanden hatte. Deswegen aich der Schuss in Blaue. Wenn du noch mal ausführlicher erklären kannst, wie deine Dateien aufgebaut sind, und was deine Makros genau machen (evtl. Mappe hochladen), kommen wir vielleicht weiter.

Gruß, Andreas

Hallo Andreas,

ganz kurz, weiteres später:

aber auch nicht wirklich erklären, seit ich Office2010 habe,
verstehe ich die Logik mit diesem Befehl nicht mehr (2003 war
eindeutiger und planbarer für mich).

Wieso, was ist an ScreenUpdating 2010 anders als bei 2003?

Meine Beobachtung ist, dass Excel ScreenUpdating nicht konsequent durchzieht. Wenn ich eine Datei neu öffne, dann werden plötzlich Bewegungen am Bildschirm angezeigt. Ich würde fast behaupten durch das Öffnen einer neuen Datei werden alle Dinge in der neuen Datei angezeigt - ich müsste also ScreenUpdate neu auf False setzen. Andererseits kann ich bei Anhalten des Makros zwischen den Dateien nicht mehr rumspringen, sondern muss den Code anhalten und zumindest mal f8 drücken (dann ist ja ScreenUpdate aufgehoben. Insgesamt war das bei 2003 alles irgendwie einfacher zu händeln (oder ich hab es damals falsch gemacht und es erschien mir einfacher :wink: )

Datei hochladen ist schwierig, ich versuche mal eine Zusammenfassung (sind leider teilweise vertrauliche Daten.

Bis später.

Grüße.

Hallo Andreas,

Ich muss gestehen, dass ich die Erklärungen in deinem UP nicht
so recht verstanden hatte. Deswegen aich der Schuss in Blaue.
Wenn du noch mal ausführlicher erklären kannst, wie deine
Dateien aufgebaut sind, und was deine Makros genau machen
(evtl. Mappe hochladen), kommen wir vielleicht weiter.

Ich versuche es mal (sinngemäß):

sub hautpmakro()

for i=1 to 10
workbook.open filename:=„Vorlage.xlsx“
call machmal1
call machmal2
call machmal3
call machmal4
call machmal5
workbook.close
next i

end sub

sub machmal1()
'Daten werden über Direktlink aus nicht geöffneter Datei eingelesen
end sub

sub machmal2()
'Daten werden in Vorlage kurz ausgewertet (Pivot-Tabellen aktualisiert, Werte sortiert)
end sub

sub machmal3()
'Grafiken in Vorlage werden inhaltlich und formativ aktualisiert (da ich zeitabhängige Werte habe, müssen die Bezüge aktualisiert werden)
end sub

sub machmal4()
'Speicherung der Datei in spezifische Datei auf dem Netzwerk
end sub

sub machmal5()
'Export Datei in pdf
end sub

(Bei machmal4 und machmal5 öffnen sich dann die Anzeigen zum Status)


Ich ersetze sämtliche Formeln direkt als Werte mittels (beispielhaft) range(„a1“).value=range(„a1“).value

grundsätzlich gehe ich wie folgt vor:
.range(„a1“).formulaR1C1="= …"
with sheets(„Tab1“)
.range(„a1“).formulaR1C1="…"
end with

auch grafiken werden auf diese Art angesteuert. Einzig wenn ich textfeldern inhalt zuweise, muss ich select benutzen (hab ich bisher nicht rausgefunden, wie das anders geht). Wenn ich das noch beseitigen könnte, dann könnte ich theoretisch auf auf ScreenUpdate vezichten.

Grundproblem: für i=1 (im „hauptmakro()“) dauert die Erstellung von Öffnung der Vorlage bis Speichern Zeit X. für i=2 dauert das ganze dann X + b. Für i=3 dauert der Vorgang insgesamt dann schon X + b +b und so weiter. der zusätzliche Zeitaufwand b ist dabei relativ konstant (ein einzulesender Wert ist etwas variabel, so dass es da mal ein paar Sekunden mehr dauern kann). Führe ich machmal1 bis machmal5 nur für einen Fall aus, so ist der Zeitaufwand ungefahr nur 1/4 so groß wie für den Durchlauf mit i=1.

Hochladen von Dateien geht wegen der Inhalte nicht. Eventuell kann ich dir mal eine txt-Datei mit den Codes schicken (PN) - nachprüfen geht dann nur eben nicht.

Noch eine Hinweis vielleicht. Ich habe das Ganze praktisch ohne feste Bezüge programmiert. Es gibt nur eine einzige Übersichtsdatei, in der alle Pfade der Quelldateien stehen. Ich hoffe nicht, dass sich hierdurch Datenmenge anhäufen und zum oben beschriebenen Zeiteffekt fürhen.

Grüße.

Hallo Andreas,

auch hallo.

sub hautpmakro()

for i=1 to 10
workbook.open filename:=„Vorlage.xlsx“
call machmal1
call machmal2
call machmal3
call machmal4
call machmal5
workbook.close
next i

end sub

Verstehe ich das richtig: Du machst 10x die selbe Mappe auf und führst damit 10x genau die selben Dinge durch? Warum das? Oder machst du bei jedem Druchlauf eine andere Mappe auf?

sub machmal1()
'Daten werden über Direktlink aus nicht geöffneter Datei
eingelesen
end sub

sub machmal2()
'Daten werden in Vorlage kurz ausgewertet (Pivot-Tabellen
aktualisiert, Werte sortiert)
end sub

sub machmal3()
'Grafiken in Vorlage werden inhaltlich und formativ
aktualisiert (da ich zeitabhängige Werte habe, müssen die
Bezüge aktualisiert werden)
end sub

sub machmal4()
'Speicherung der Datei in spezifische Datei auf dem Netzwerk
end sub

sub machmal5()
'Export Datei in pdf
end sub

Hmm, warum das mit jedem Durchlauf langsamer werden sollte, erschließt sich mit hier nicht. Vielleicht wenn ich ja wüsste, was in deinen „machmals“ genau steht.

(Bei machmal4 und machmal5 öffnen sich dann die Anzeigen zum
Status)


Ich ersetze sämtliche Formeln direkt als Werte mittels
(beispielhaft) range(„a1“).value=range(„a1“).value

grundsätzlich gehe ich wie folgt vor:
.range(„a1“).formulaR1C1="= …"
with sheets(„Tab1“)
.range(„a1“).formulaR1C1="…"
end with

auch grafiken werden auf diese Art angesteuert. Einzig wenn
ich textfeldern inhalt zuweise, muss ich select benutzen (hab
ich bisher nicht rausgefunden, wie das anders geht). Wenn ich
das noch beseitigen könnte, dann könnte ich theoretisch auf
auf ScreenUpdate vezichten.

Geht so:

ActiveSheet.Shapes("Textfeld 1").TextFrame.Characters.Text = "hallo"

Grundproblem: für i=1 (im „hauptmakro()“) dauert die
Erstellung von Öffnung der Vorlage bis Speichern Zeit X. für
i=2 dauert das ganze dann X + b. Für i=3 dauert der Vorgang
insgesamt dann schon X + b +b und so weiter. der zusätzliche
Zeitaufwand b ist dabei relativ konstant (ein einzulesender
Wert ist etwas variabel, so dass es da mal ein paar Sekunden
mehr dauern kann). Führe ich machmal1 bis machmal5 nur für
einen Fall aus, so ist der Zeitaufwand ungefahr nur 1/4 so
groß wie für den Durchlauf mit i=1.

D.h. es macht einen Zeitunterschied, ob du eine Schleife For i = 1 To 1 hast oder ob du die Schleife ganz weglässt?

Hochladen von Dateien geht wegen der Inhalte nicht. Eventuell
kann ich dir mal eine txt-Datei mit den Codes schicken (PN) -
nachprüfen geht dann nur eben nicht.

Schick mal. Vielleicht seh ich ja was.

Noch eine Hinweis vielleicht. Ich habe das Ganze praktisch
ohne feste Bezüge programmiert. Es gibt nur eine einzige
Übersichtsdatei, in der alle Pfade der Quelldateien stehen.
Ich hoffe nicht, dass sich hierdurch Datenmenge anhäufen und
zum oben beschriebenen Zeiteffekt fürhen.

hab ich nicht verstanden.

Grüße.

Dto.

Hallo nochmal.

Hallo Andreas,

auch hallo.

sub hautpmakro()

for i=1 to 10
workbook.open filename:=„Vorlage.xlsx“
call machmal1
call machmal2
call machmal3
call machmal4
call machmal5
workbook.close
next i

end sub

Verstehe ich das richtig: Du machst 10x die selbe Mappe auf
und führst damit 10x genau die selben Dinge durch? Warum das?
Oder machst du bei jedem Druchlauf eine andere Mappe auf?

Nicht ganz, ich trage 10x andere Daten in die Vorlage ein, so das das Ergebnis sich unterscheidet. Ansonsten wäre es wahrlich blödsinnig :wink:

Hmm, warum das mit jedem Durchlauf langsamer werden sollte,
erschließt sich mit hier nicht. Vielleicht wenn ich ja wüsste,
was in deinen „machmals“ genau steht.

siehe unten (PN)

(Bei machmal4 und machmal5 öffnen sich dann die Anzeigen zum
Status)


Ich ersetze sämtliche Formeln direkt als Werte mittels
(beispielhaft) range(„a1“).value=range(„a1“).value

grundsätzlich gehe ich wie folgt vor:
.range(„a1“).formulaR1C1="= …"
with sheets(„Tab1“)
.range(„a1“).formulaR1C1="…"
end with

auch grafiken werden auf diese Art angesteuert. Einzig wenn
ich textfeldern inhalt zuweise, muss ich select benutzen (hab
ich bisher nicht rausgefunden, wie das anders geht). Wenn ich
das noch beseitigen könnte, dann könnte ich theoretisch auf
auf ScreenUpdate vezichten.

Geht so:

ActiveSheet.Shapes(„Textfeld 1“).TextFrame.Characters.Text =
„hallo“

Leider nicht, da die textfelder einen dynamischen Link darstellen (geht ja bei 2010). Ich müsste also die Möglichkeit haben, einem Textfeld eine Formel zuzuweisen und das geht scheinbar nur mittels Selection.

Grundproblem: für i=1 (im „hauptmakro()“) dauert die
Erstellung von Öffnung der Vorlage bis Speichern Zeit X. für
i=2 dauert das ganze dann X + b. Für i=3 dauert der Vorgang
insgesamt dann schon X + b +b und so weiter. der zusätzliche
Zeitaufwand b ist dabei relativ konstant (ein einzulesender
Wert ist etwas variabel, so dass es da mal ein paar Sekunden
mehr dauern kann). Führe ich machmal1 bis machmal5 nur für
einen Fall aus, so ist der Zeitaufwand ungefahr nur 1/4 so
groß wie für den Durchlauf mit i=1.

D.h. es macht einen Zeitunterschied, ob du eine Schleife For i
= 1 To 1 hast oder ob du die Schleife ganz weglässt?

Hochladen von Dateien geht wegen der Inhalte nicht. Eventuell
kann ich dir mal eine txt-Datei mit den Codes schicken (PN) -
nachprüfen geht dann nur eben nicht.

Schick mal. Vielleicht seh ich ja was.

siehe PN

Noch eine Hinweis vielleicht. Ich habe das Ganze praktisch
ohne feste Bezüge programmiert. Es gibt nur eine einzige
Übersichtsdatei, in der alle Pfade der Quelldateien stehen.
Ich hoffe nicht, dass sich hierdurch Datenmenge anhäufen und
zum oben beschriebenen Zeiteffekt fürhen.

hab ich nicht verstanden.

Öh - siehe PN :wink:

Grüße.

OK,

deine Codes schaue ich mir heute Abend mal an.

Zu der Textbox: Du könntest ihr einen festen Link zuweisen auf eine lokale Zelle. Das geht, indem du die TextBox anklickst und dann in der Adresszeile (nicht direkt in die Textbox!) z.B. eingibst =$A$1
Die Formel für den Fernlink schreibst du dann in A1 anstatt in die TextBox.

Gruß, Andreas

Hi,

ich habe mir die Codes jetzt mal angeschaut, die du mir zugeschickt hast. Ich habe da leider nichts verdächtiges finden können.
Das einzige, was mir jetzt noch einfällt. Ich glaube, du hast gesagt, dass die Links, die du in die Zellen schreibst, auf Dateien zugreifen, die auf irgendwelchen Netzlaufwerken liegen. Ist das so? Evtl. gibt’s da ja irgendwie Zeitprobleme. Du könntest mal veruschen, die Dateien auf deinen eigenen Rechner zu kopieren und die Links mal dorthin zu sezten.
Irgendwas Gescheites fällt mir aber weiter dazu nicht ein.
Sorry erst mal und viel Erfolg weiterhin bei der „Suche nach der verloreren Zeit“.

Gruß, Andreas