Registriert seit: 28.05.2017
Version(en): 365
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ß
Registriert seit: 11.04.2014
Version(en): Office 2007
Gruß Stefan
Win 10 / Office 2016
Folgende(r) 1 Nutzer sagt Danke an Steffl für diesen Beitrag:1 Nutzer sagt Danke an Steffl für diesen Beitrag 28
• EasY
Registriert seit: 05.09.2017
Version(en): 2013
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:1 Nutzer sagt Danke an Werner.M für diesen Beitrag 28
• EasY
Registriert seit: 29.01.2018
Version(en): 2021
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:1 Nutzer sagt Danke an Sulprobil für diesen Beitrag 28
• EasY
00202
Nicht registrierter Gast
(16.08.2021, 18:39)EasY schrieb: die ich so vor jedes Makro bzw danach schreibe.
Hallo,
das würde ich dir
nicht emfehlen. Bei
kleineren Aktionen ist das
meiner Meinung nach eher
kontraproduktiv.
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:1 Nutzer sagt Danke an Gast für diesen Beitrag 28
• EasY
Registriert seit: 28.05.2017
Version(en): 365
17.08.2021, 18:31
(Dieser Beitrag wurde zuletzt bearbeitet: 17.08.2021, 18:35 von EasY.)
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?
Registriert seit: 21.12.2017
Version(en): MS 365 Family (6 User x 5 Geräte für jeden) Insider-Beta
.EnableEvents betrifft Ereignisse, sind also in normalen Subs unzutreffend, es sei denn, dass ein Ereignis durch das Sub tatsächlich ausgelöst würde.
Registriert seit: 12.10.2014
Version(en): 365 Insider (32 Bit)
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)
Registriert seit: 28.05.2017
Version(en): 365
17.08.2021, 20:07
(Dieser Beitrag wurde zuletzt bearbeitet: 17.08.2021, 20:07 von EasY.)
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ß
Registriert seit: 12.10.2014
Version(en): 365 Insider (32 Bit)
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)