Registriert seit: 04.08.2017
	
 Version(en): MS Office 2016
	 
 
	
	
		Hallo liebe Community, ich möchte die Berechnungszeit für mein Makro verkürzen. Dazu ersuche ich eure Hilfe, an welcher Stelle ich meinen Code noch verbessern kann. Die Time-Elemente und MsgBox dienen nur zur Anzeige der Zeit. Das kommt am Ende wieder raus, wenn der Code MAXIMAL optimiert wurde   Danke vielmals! Hier der Code: Code: Option Explicit Private Declare Function GetTickCount Lib "kernel32.dll" () As Long Private Sub Worksheet_Change(ByVal target As Range) Dim ZA As Long, lTime As Long lTime = GetTickCount     If Not Intersect(target, Range("D24:D117")) Is Nothing Then     ZA = Len(target.Value)     If target(1).Value = "" Then Exit Sub Else     If ZA < 120 Then Range(target.Address).Font.Size = 11 Else         If ZA > 119 And ZA < 151 Then Range(target.Address).Font.Size = 10 Else             If ZA > 150 And ZA < 201 Then Range(target.Address).Font.Size = 9 Else                 If ZA > 200 And ZA < 241 Then Range(target.Address).Font.Size = 8 Else                     If ZA > 240 And ZA < 351 Then Range(target.Address).Font.Size = 7 Else                         If ZA > 350 And ZA < 401 Then Range(target.Address).Font.Size = 6 Else                             If ZA > 400 Then MsgBox "Zeichenlimit von 400 erreicht. Bitte Inhalt in Mangel kürzen oder in dem darunterliegenden Feld weiterschreiben."                             End If lTime = GetTickCount - lTime MsgBox "Makrolaufzeit " & CStr(lTime) & " ms", vbOKOnly End Sub
 Grüße und schönen 1. Mai Martin
	  
	
	
	
	
 
 
	
	
	
		
	Registriert seit: 02.05.2018
	
 Version(en): Excel 365 & 2016
	 
 
	
	
		Ob sich die Laufzeit nun wirklich in einer Weise verändert, die für dich spürbar ist, wage ich mal zu bezweifeln. Ich habe mit deinem Code eine Laufzeit von um die 30 ms erreicht. Aber ich habe deinen Code etwas "verelegantet", für sowas bietet sich ja Select Case ideal an: Code: Private Sub Worksheet_Change(ByVal target As Range) Dim ZA As Long, lTime As Long
  If Not Intersect(target, Range("D24:D117")) Is Nothing Then     lTime = GetTickCount     ZA = Len(target.Value)     If target(1).Value = "" Then Exit Sub
      Select Case ZA         Case Is < 120             Range(target.Address).Font.Size = 11         Case 120 To 150             Range(target.Address).Font.Size = 10         Case 151 To 200             Range(target.Address).Font.Size = 9         Case 201 To 240             Range(target.Address).Font.Size = 8         Case 241 To 350             Range(target.Address).Font.Size = 7         Case 351 To 400             Range(target.Address).Font.Size = 6         Case Is > 400             MsgBox "Zeichenlimit von 400 erreicht. Bitte Inhalt in Mangel kürzen oder in dem darunterliegenden Feld weiterschreiben."     End Select
      lTime = GetTickCount - lTime     MsgBox "Makrolaufzeit " & CStr(lTime) & " ms", vbOKOnly End If
  End Sub
 Du könntest jetzt natürlich noch versuchen, in der Textlänge eine Logik zu finden, mit Modulo und Rest, welchen du dann von einer fix vorgegebenen Schriftgröße abziehst. Aber darüber nachzudenken fehlt mir am Tag der Arbeit echt die Muße.
	  
	
	
Schöne Grüße Berni
 
	
	
 
 
	
	
	
		
	Registriert seit: 10.04.2014
	
 Version(en): 97-2019 (32) + 365 (64)
	 
 
	
	
		Hallöchen,
  mal zwei Anmerkungen.
  ZA = Len(target.Value)
  läuft auf einen Fehler hinaus, wenn Du  einschl. einer Zelle im geprüften Bereich mehr als eine änderst.
  Range(target.Address)
  sollte stattdessen auch mit Target funktionieren
	 
	
	
.      \\\|///      Hoffe, geholfen zu haben.        ( ô ô )      Grüße, André aus G in T     ooO-(_)-Ooo    (Excel 97-2019+365)
 
	
	
 
	  
	Folgende(r) 1 Nutzer sagt Danke an schauan für diesen Beitrag:1 Nutzer sagt Danke an schauan für diesen Beitrag 28
	  • kliffi01
 
 
 
	
	
	
		
	Registriert seit: 29.01.2018
	
 Version(en): 2024
	 
 
	
	
		Hallo,
  Mein Vorschlag: Option Explicit Private Declare Function GetTickCount Lib "kernel32.dll" () As Long Private Sub Worksheet_Change(ByVal target As Range) Dim ZA As Long, lTime As Long lTime = GetTickCount     If Not Intersect(target, Range("D24:D117")) Is Nothing Then         If target(1).Value = "" Then Exit Sub Else         ZA = Len(target.Value)         If ZA > 400 Then             MsgBox "Zeichenlimit von 400 erreicht. Bitte Inhalt in Mangel kürzen oder in dem darunterliegenden Feld weiterschreiben."         Else             Range(target.Address).Font.Size = Application.WorksheetFunction.Lookup(ZA, Array(0, 120, 151, 201, 241, 351), Array(11, 10, 9, 8, 7, 6))         End If     End If lTime = GetTickCount - lTime Debug.Print "Makrolaufzeit " & CStr(lTime) & " ms", vbOKOnly 'Mit STRG + G Immediate Window anzeigen lassen. End Sub
  Zur Laufzeit kann ich nichts sagen. Auf meinem i9 16 core sagt er immer nur 0 ms. Ansonsten würde ich normalerweise von der Nutzung von Worksheet_Change Events abraten.
  Viele Grüße, Bernd P
	 
	
	
	
	
 
 
	
	
	
		
	Registriert seit: 29.09.2015
	
 Version(en): 2030,5
	 
 
	
	
		Alternative: Code: target.Font.Size = Switch(ZA < 120, 11, ZA < 151, 10, ZA < 201, 9, ZA < 241, 8, ZA < 351, 7)
 Code: target.Font.Size = Array(11, 10, 9, 8, 7, 6)(Application.Match(ZA, Array(0, 120, 151, 201, 241, 351), 1))
  
	 
	
	
	
	
 
 
	
	
	
		
	Registriert seit: 11.03.2015
	
 Version(en): mittlerweile meistens 2019
	 
 
	
	
		Hallo,
  wäre das Zellformat "An Zellgröße anpassen" nicht eine alternative Möglichkeit?
	 
	
	
Gruß Michael
 
	
	
 
 
	
	
	
		
	Registriert seit: 04.08.2017
	
 Version(en): MS Office 2016
	 
 
	
	
		Hallo,
  ich habe all eure Vorschläge getestet, vielen lieben Dank dafür. Das Ergebnis ist leider nicht was ich mir erhofft habe. Bei allen Varianten ist die kürzeste Berechnungszeit 172 ms. Egal wie oft ich es teste, kürzer als 172 ms ist nicht drin. Ich finde das abartig lang. Manche Zeiten gingen hoch bis 500-600 ms. Habe mich nun mit unserem internen IT-Service in Verbindung gesetzt und der möchte kommende Woche mein Office/Excel auf die neuste Version bringen. Also scheint etwas mit meiner Software faul zu sein.
  Danke nochmal.
 
  Grüße
  Martin
	 
	
	
	
	
 
 
	
	
	
		
	Registriert seit: 10.04.2014
	
 Version(en): 97-2019 (32) + 365 (64)
	 
 
	
	
		Hallöchen,
  mir ist aufgefallen, dass der erste Durchlauf recht lange dauert. Nach dem Programmieren waren es ca. 480 ms, dann nur noch 0. Nach erneutem Öffnen der Datei hatte ich beim ersten Durchlauf ca.180 MS, ab dem Zweiten dann auch 0 ms. Das ist dann reproduzierbar.
	 
	
	
.      \\\|///      Hoffe, geholfen zu haben.        ( ô ô )      Grüße, André aus G in T     ooO-(_)-Ooo    (Excel 97-2019+365)
 
	
	
 
 
	
	
	
		
	Registriert seit: 29.09.2015
	
 Version(en): 2030,5
	 
 
	
	
		Verwende screenupdating=false kombiniert mit: Code: target.Font.Size = Switch(ZA < 120, 11, ZA < 151, 10, ZA < 201, 9, ZA < 241, 8, ZA < 351, 7)
 Excel 2000 war viel schneller als Excel 2013. Aber letztendlicht ist es unsinncode: fontsize abhängig von textlength in der Zelle.
	  
	
	
	
	
 
 
	
	
	
		
	Registriert seit: 27.12.2018
	
 Version(en): 2003,2010
	 
 
	
	
		Hallo Schauan,
  >> mir ist aufgefallen, dass der erste Durchlauf recht lange dauert. Nach dem Programmieren waren es ca. 480 ms, dann nur noch 0. Nach erneutem Öffnen der Datei >> hatte ich beim ersten Durchlauf ca.180 MS, ab dem Zweiten dann auch 0 ms. Das ist dann reproduzierbar.
  das ist recht logisch, wenn man sich vergegenwärtigt, dass der Code intern erstmal in ein etwas verdaulicheres Format überführt wird (Preprozessing, Tokenizing). Das kann man auch manuell auslösen, einfach den Knopf "Compillieren" drückt. Beim Neuöffnen der Datei muß das Makro halt erstmal in den Speicher geholt werden.
  vg, MM
	 
	
	
	
	
 
 
	 
 |