Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1920to1924
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Makro Laufzeit aufeinmal sehr langsam

Makro Laufzeit aufeinmal sehr langsam
15.02.2023 14:31:07
Volkanovski
Hallo,
mein Makro iteriert bis ein bestimmter Wert erreicht wurde. Dies ging sehr schnell bis vor kurzem. Jedoch habe ich nun eine Userform eingefügt und es läuft erheblich langsamer. Liegt das an der Userform oder einfach an Excel? Auch wenn der Iterationsschritt nur 0.01 ist, gestern lief das noch sehr schnell...
Sub Tabelle1()
Dim UntereVolumenstromGrenze1 As Double 'Min V
Dim ObereVolumenstromGrenze1 As Double 'Max V
Dim x As String
Dim y As String
Dim z As String
Dim K1_xF As String
x = "K1-1F"
y = "K1-2F"
z = "K1-3F"
Application.StatusBar = True
Application.StatusBar = "Please wait..."
UntereVolumenstromGrenze1 = Range("N5").Value 'Obere Volumenstromgrenze der Pumpe
ObereVolumenstromGrenze1 = Range("N6").Value 'Untere Volumenstromgrenze der Pumpe
If Range("C2").Value = x And Range("N6").Value = 11 Then 
    Range("F22").Value = Range("F21").Value
    
    Do Until Range("N22").Value = 0.1 And Range("N22").Value >= 0
        
      Range("F22").Value = Range("F22").Value + 0.01
   
    Loop
    
ElseIf Range("C2").Value = y And Range("N6").Value = 11 Then
        Range("F22").Value = Range("F21").Value
      Do Until Range("N22").Value = 0.1 And Range("N22").Value >= 0
           Range("F22").Value = Range("F22").Value + 0.01
      Loop
ElseIf Range("C2").Value = z And Range("N6").Value = 11 Then
      Range("F22").Value = Range("F21").Value
      Do Until Range("N22").Value = 0.1 And Range("N22").Value >= 0
         Range("F22").Value = Range("F22").Value + 0.01
      Loop
Else
Range("F22").Value = Range("F21").Value
Do Until Range("N22").Value = 0.1 And Range("N22").Value >= 0   
  Range("F22").Value = Range("F22").Value + 0.1 
Loop
If Range("F22").Value > Range("N6").Value Then
Range("F22").Value = Range("N6").Value
End If
 End If
 
MsgBox "Completed!"
 
Application.StatusBar = False
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address(0, 0) = "B5" Then
    If Target.Value = "Manuelle Eingabe" Then
        UserForm1.Show
    End If
End If
End Sub

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Makro Laufzeit aufeinmal sehr langsam
15.02.2023 14:39:54
Rudi
Hallo,
was sollen die Unterscheidungen? So weit ich sehe, machen alle das Selbe.
Do Until Range("N22").Value = 0.1 And Range("N22").Value >= 0
Wie soll das eintreten? &lt=0.1 UND &gt=0 ?
Gruß
Rudi
AW: Makro Laufzeit aufeinmal sehr langsam
15.02.2023 14:57:39
Volkanovski
Hallo,
haha da weiß ich ehrlich gesagt selber nicht warum ich das gemacht habe. Macht auf jeden Fall keinen Sinn :D. Habe es jetzt auf =0.1 umgeschrieben.
Mfg
AW: Makro Laufzeit aufeinmal sehr langsam
15.02.2023 15:04:54
Rudi
Hallo,
eingedampft würde der Code so aussehen:
Sub Tabelle1()
  
  Dim UntereVolumenstromGrenze1 As Double 'Min V
  Dim ObereVolumenstromGrenze1 As Double 'Max V
  
  Dim K1_xF As String
  
  Const x = "K1-1F"
  Const y = "K1-2F"
  Const z = "K1-3F"
  
  With Application
   .StatusBar = "Please wait..."
   .EnableEvents = False
   .ScreenUpdating = False
  End With
  
  UntereVolumenstromGrenze1 = Range("N5").Value 'Obere Volumenstromgrenze der Pumpe
  ObereVolumenstromGrenze1 = Range("N6").Value 'Untere Volumenstromgrenze der Pumpe
  
  If Range("N6").Value = 11 Then
  
    On Error GoTo ERREXIT
    
    Select Case Range("C2")
    
      Case x, y, z
        Range("F22").Value = Range("F21").Value
        Do Until Range("N22").Value = 0.1 And Range("N22").Value >= 0.1
          Range("F22").Value = Range("F22").Value + 0.01
        Loop
        
      Case Else
        Range("F22").Value = Range("F21").Value
        Do Until Range("N22").Value = 0.1 And Range("N22").Value >= 0
          Range("F22").Value = Range("F22").Value + 0.1
        Loop
        
        If Range("F22").Value > Range("N6").Value Then
          Range("F22").Value = Range("N6").Value
        End If
        
    End Select
    
  End If
  
  MsgBox "Completed!"
  
ERREXIT:
  With Application
    .StatusBar = False
    .EnableEvents = True
  End With
  
End Sub
wozu die Volumenströme, wenn du keinen Bezug drauf nimmst?
Gruß
Rudi
Anzeige
AW: Makro Laufzeit aufeinmal sehr langsam
15.02.2023 15:21:45
Volkanovski
Hallo Rudi,
danke dir fürs aufräumen! Bin noch ein ziemlicher Anfänger und denke immer ich muss alles mit irgendwelchen Bezeichnungen versehen haha, aber macht natürlich absolut keinen Sinn mit den Volumenströmen :D.
Was genau macht const x? Brauch ich dann dafür kein Dim x as string?
Mfg
AW: Makro Laufzeit aufeinmal sehr langsam
15.02.2023 15:28:11
Rudi
Const definiert eine Konstante, also einen Wert der sich nicht Ändert.
Brauch ich dann dafür kein Dim x as string?
darfst du nicht mal.
In deinem zuletzt geposteten Code sind noch immer Fehler. &lt=... AND &gt=...
Gruß
Rudi
AW: Makro Laufzeit aufeinmal sehr langsam
15.02.2023 14:58:38
onur
Zwischen 0 und 0,1 - also z.B. bei 0,05.
Aber das spielt ja keine Rolle, da nur F22 und nicht N22 verändert wird, bleibt der Code da hängen, wenn N22 NICHT zwischen 0 und 0,10 ist.
Ausser wenn in N22 eine Formel steht, die von F22 abhängig ist.
Anzeige
AW: Makro Laufzeit aufeinmal sehr langsam
15.02.2023 14:46:49
Daniel
das Problem ist nicht die Userform, sondern dein Change-Event-Makro
dieses wird jedes mal ausgeführt, wenn du ein Range(...).Value = ... durchführst und das kostet Zeit, zumal du das sehr oft machst.
Möglichkeit 1: du deaktivierst die automatische Ausführung der Eventmakros während der Laufzeit des Makros:
Sub Tabelle1()
... Variablendeklaration
Application.EnableEvents = False
...
... hier der Code
...
Application.EnableEvents = True
End Sub
Beachte, dass bei einem Fehlerabbruch die Events ausgeschaltet sind und auch bleiben.
Dh du musst diese durch Eingabe von Application.EnableEvents = True im Direktfenster diese wieder einschalten
andere Möglichkeit:
du verzichtest auf das Change-Event und startest die Userform im Makro Tabelle1, wenn der Anwender "manuelle Eingabe" ausgewählt hat.
Sub Tabelle1()
if Range("B5") = "Manuelle Eingabe" then Userform1.show
...
end Sub
allerdings funktioniert das nicht in allen möglichen Anwendungsfällen, du müsstest prüfen, ob das bei dir so geht.
Gruß Daniel
Anzeige
AW: Makro Laufzeit aufeinmal sehr langsam
15.02.2023 14:51:52
peterk
Hallo
Wenn dein Worksheet_Change die selbe Tabelle betrifft wie deine Iteration so musst du die Events ausschalten sonst wird es bei jeder Iteration ausgelöst (respektive wenn dein Makro etwas in die Zelle schreibt).
Daher:

Sub Tabelle()
...
   Application.EnableEvents=False
...
...
...
   Application.EnableEvents=True
End Sub 
Peter
AW: Makro Laufzeit aufeinmal sehr langsam
15.02.2023 15:09:14
Volkanovski
Hallo,
erstmal danke an alle für die Hilfe! Das mit Application.EnableEvents = True und False macht sehr Sinn für mich und habe dies auch implementiert. Ist jedoch genauso langsam. Die Möglichkeit von Daniel, dass ich die Userform direkt in Tabelle1 einfüge muss ich noch ausprobieren. Hier nochmals der Code:
Sub Tabelle1()
Dim UntereVolumenstromGrenze1 As Double 'Min V
Dim ObereVolumenstromGrenze1 As Double 'Max V
Dim x As String
Dim y As String
Dim z As String
Dim K1_xF As String
Application.EnableEvents = False
x = "K1-1F"
y = "K1-2F"
z = "K1-3F"
Application.StatusBar = True
Application.StatusBar = "Please wait..."
UntereVolumenstromGrenze1 = Range("N5").Value 'Obere Volumenstromgrenze der Pumpe
ObereVolumenstromGrenze1 = Range("N6").Value 'Untere Volumenstromgrenze der Pumpe
If Range("C2").Value = x And Range("N6").Value = 11 Then 
    
    
    Range("F22").Value = Range("F21").Value
    
    
    Do Until Range("N22").Value = 0.1 And Range("N22").Value >= 0
        
      Range("F22").Value = Range("F22").Value + 0.01 
   
    Loop
    
    
ElseIf Range("C2").Value = y And Range("N6").Value = 11 Then
Range("F22").Value = Range("F21").Value
Do Until Range("N22").Value = 0.1
Range("F22").Value = Range("F22").Value + 0.01
Loop
ElseIf Range("C2").Value = z And Range("N6").Value = 11 Then
Range("F22").Value = Range("F21").Value
Do Until Range("N22").Value = 0.1
Range("F22").Value = Range("F22").Value + 0.01
Loop
Else
Range("F22").Value = Range("F21").Value
Do Until Range("N22").Value = 0.1  
Range("F22").Value = Range("F22").Value + 0.1
Loop
If Range("F22").Value > Range("N6").Value Then
Range("F22").Value = Range("N6").Value
End If
 End If
 
MsgBox "Completed!"
 
Application.StatusBar = False
Application.EnableEvents = True
End Sub

Anzeige
AW: Makro Laufzeit aufeinmal sehr langsam
15.02.2023 20:17:11
Yal
Moin,
ich mache mit ...
_ verzichte auf Variablen, die nicht verwendet werden: untere..., obere...
_ "Range("N6").Value <= 11 Then" kommt dreimal vor: ausreichend, um daraus eine vorangestellte Weiche zu stellen
_ "Range("F22").Value = Range("F21").Value" kommt jedesmal vor. Einmal am Anfang voranstellen.
_ "Zwischen a und b": niedrigste Wert zuerst: x >= a And x <= b ist leichter zu verstehen als x <= b And x >= a
_ Leerzeilen können eine grosse Bedeutung haben,... wenn sie selten vorkommen. Sehr sparsam damit umgehen, aber dafür
_ auf einem sauberen Einrücken achten. Daran liegt die Lesbarkeit des Codes.
_ die Fälle y und z führen zu dieselbe Aktion. In einem Select Case ganz günstig zusammen zu packen.
_ feste Wert als Konstante (ist schon mal gesagt worden). In Kombi mit Select Case kann man deise sogar sparen
_ Statusbar ist scheinbar gut, aber nur scheinbar. Insbesondere, wenn das Ende mit einem MsgBox angekündigt wird.
Damit sieht dein scheinbar sehr langen Code so aus (es ist genau dieselbe Code!):
Sub Tabelle1()
    
    Application.EnableEvents = False
    
    Range("F22").Value = Range("F21").Value
    If Range("N6").Value = 11 Then
        Select Case Range("C2").Value
        Case "K1-1F"
            Do Until Range("N22").Value >= 0 And Range("N22").Value = 0.1
                Range("F22").Value = Range("F22").Value + 0.01
            Loop
        Case "K1-2F", "K1-3F"
            Do Until Range("N22").Value = 0.1
                Range("F22").Value = Range("F22").Value + 0.01
            Loop
        End Select
    Else
        Do Until Range("N22").Value = 0.1
            Range("F22").Value = Range("F22").Value + 0.1
        Loop
        If Range("F22").Value > Range("N6").Value Then
            Range("F22").Value = Range("N6").Value
        End If
    End If
    MsgBox "Completed!"
    Application.EnableEvents = True
End Sub
Wenn Du den rechnerische Zusammenhang zwischen N22 und F22 kennen würde, könntest Du die Rechnung in VBA implementieren und nur das Ergebnis in F22 schreiben. Der Code wäre ca. 80 mal schneller. Aber ich gehe davon aus, dass es nicht ganz trivial ist, sonst würdest es nicht so machen.
VG
Yal
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige