VBA - Beschleunigungsmakro
#1
Hi Leute, 

ich habe vor, mir ein Modul zu basteln, welches ich in jedes meiner Laienprojekte integrieren kann. Das Modul soll zwei Subs enthalten, die immer am Anfang eines Makros bzw am Ende aufgerufen werden und das Makro beschleunigen sollen. Ihr wisst, was ich meine. 
Mir geht es dabei um eine Allzweckwaffe, sodass der maximale Zeitgewinn nicht im Vordergrund steht sondern vielmehr die Kompatibilität. 

Bisher nutze ich immer nur 

application.calculation 
application.screenupdating und 
application.enableevents 

die ich so vor jedes Makro bzw danach schreibe. Habe ich noch Zeitersparniszeilen vergessen? 
Wie sieht es aus: Habt ihr Situationen gehabt, in denen irgendeine dieser Zeilen zu Probleme geführt haben? Worauf muss man eventuell achten? 

Grds habe ich dazu mal gelesen, dass man aufpassen sollte, dass man ja in das Programm des Nutzers und dessen Grundeinstellungen eingreift. Sprich, vll hat er grds ja die calculation auf manuell. Wie kann ich das Problem lösen, dass ich das z.B. nicht ungewollt auf automatisch stelle? 

Danke für eure Hilfe und Gedanken :)

Gruß
Antworten Top
#2
Hallo,

schau mal hier https://www.online-excel.de/excel/singsel_vba.php?f=79 vorbei.
Gruß Stefan
Win 10 / Office 2016
[-] Folgende(r) 1 Nutzer sagt Danke an Steffl für diesen Beitrag:
  • EasY
Antworten Top
#3
Hallo,

du kannst z.B. beim Start deines "Beschleunigungsmakros" die Einstellung der Calculation in eine Public-Variable einlesen und dann beim Zurücksetzen der Application der Calculation diese Variable zuweisen. So hast du immer die entsprechenden Einstellungen, die der User vorher eingestellt hatte.

Bei Application.Enableevents musst du zwingend eine entsprechende Fehlerbehandlung in dein "Hauptmakro" einbauen. Tritt da nämlich ein Fehler auf, dann steigt das Haptmakro dort aus und das Makro zum Zurücksetzen der Application wird nicht mehr aufgerufen. Application.Enableevents und Application.Calculation können/werden somit nicht mehr zurückgesetzt.

Ginge in etwa so:
Code:
Option Explicit
Public loCalc As Long

Public Sub Speed_on()
loCalc = Application.Calculation
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
Application.ScreenUpdating = False
End Sub

Public Sub Speed_off()
Application.Calculation = loCalc
Application.EnableEvents = False
End Sub

Public Sub Hauptmakro()
Dim loWert As Long

Call Speed_on
On Error GoTo Notaus
MsgBox "Hallo du da."
loWert = "Fehler"

Notaus:
On Error GoTo -1
Call Speed_off
End Sub

Ruf mal das Makro "Hauptmakro" auf. Kannst ja vorher mal Calculation auf Automatisch außer bei Datentabellen setzen. Prüf dann nach dem Makrolauf die Einstellungen.

Beim zweiten Versuch kommentier mal vorher die Zeile On Error GoTo Notaus aus. Lass das Makro laufen und prüf wieder die Einstellungen.

Und bevor Rückfragen kommen: Nein, ich habe nicht vergessen Application.ScreenUpdating wieder auf True zu stellen. Das braucht man nicht, macht Excel von alleine.

Gruß Werner
[-] Folgende(r) 1 Nutzer sagt Danke an Werner.M für diesen Beitrag:
  • EasY
Antworten Top
#4
Die beste mir bekannte Lösung entwickelte mein Freund Jon T.:
https://berndplumhoff.gitbook.io/sulprob...ystemstate
[-] Folgende(r) 1 Nutzer sagt Danke an Sulprobil für diesen Beitrag:
  • EasY
Antworten Top
#5
(16.08.2021, 18:39)EasY schrieb: die ich so vor jedes Makro bzw danach schreibe.

Hallo, 19 

das würde ich dir nicht emfehlen. Bei kleineren Aktionen ist das meiner Meinung nach eher kontraproduktiv. 21

Das Auslesen und Setzen der entsprechenden Ereignisse kostet auch Zeit.

Und noch wichtiger...

PrintCommunication...

Da funktioniert in neueren Excelversionen auf einmal das Makro nicht mehr (früher hat man das immer empfohlen).

Es gibt also Stolpersteine, die ein generelles Ausschalten aller Aktionen nicht sinnvoll machen.
[-] Folgende(r) 1 Nutzer sagt Danke an Gast für diesen Beitrag:
  • EasY
Antworten Top
#6
Hey ihr, 

schonmal Danke für eure Hinweise - ganz klasse!!! 

Also die Printcommunication sollte ich nicht anfassen, richtig? 
Mit den drei Zeilen von mir habe ich aber sonst schon so die besten Beschleuniger, oder? 
Ja bei kleinen Makros werde ich das nicht nutzen, danke.

Ach noch eine Frage: Zuhause, wo ich meist den Code schreibe, teste etc. habe ich Microsoft365. Auf der Arbeit, wo ich ihn dann in die Dateien reinkopiere, haben wir nur Excel 2016. Könnte es da bei irgendwas zu Problemen kommen?
Antworten Top
#7
.EnableEvents betrifft Ereignisse, sind also in normalen Subs unzutreffend, es sei denn, dass ein Ereignis durch das Sub tatsächlich ausgelöst würde.
WIN/MSO schicken angeblich alle 5 Sekunden Deinen Screen heim zu Papa (recall-Klausel). 
Antworten Top
#8
Ich habe da eine Bazooka.
Die hole ich immer dann heraus, wenn mich irgend etwas stört.
Letztens sagte doch glatt ein Bekannter, dass ich für die Fliege an der Wand doch eher die Klatsche nehmen könnte.
Da ich ihn nicht verstand, habe ich ihn kurz mit der Bazooka weggeblasen.

Und jetzt schrubbe ich die Blutflecken von der Wand …
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Antworten Top
#9
Hi Rpp63,

du findest es übertrieben, dass ich sowas bauen möchte, oder wie soll ich deinen Post verstehen? 

Wenn du Erfahrungen mit mir teilen möchtest, gerne. Verklausulierte Andeutungen helfen mir allerdings wenig. 

Gruß
Antworten Top
#10
So schlecht fand ich die Parabel nicht!
Manche nennen es "Kanonen auf Spatzen".
Wenn Du eruiert hast, dass es Stellschrauben gibt, ein spezielles Makro zu beschleunigen, dann wende sie an!
Falls du allerdings der Meinung bist, dass es die eierlegende Wollmilchsau gibt, muss ich Dich enttäuschen.

Gruß Ralf

P.S.:
Ich habe mehrfach darauf hingewiesen, dass .Value = .Value signifikant langsamer ist als .Copy .PasteSpecial
Mir wurde der virtuelle Vogel gezeigt.
Und Du weist womit?
Mit Recht!
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste