Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Laufzeit Makro ist zu lange

Forumthread: Laufzeit Makro ist zu lange

Laufzeit Makro ist zu lange
25.09.2024 14:01:07
Thomas
Hallo Forum,
ich habe mir über viele Jahre hinweg eine Excelliste gebastelt und über verschiedenen Quellen ein Makro gebastelt.
Dieses Makro füllt Eingabewerte aus einer User Form in eine Zeile, dort werden dann über verschiedene Formeln weitere Werte ergänzt und dann kopiert das Makro diese Zeile an das Ende einer Tabelle. Soweit so gut und hat auch immer fumktioniert.
Jetzt möchte ich aber diese Arbeitsmappe auch anderne Personen zugänglich machen und habe das Makro um einen Blattschutz erweitert in dem der Autofilter aber immer noch funktionieren soll.
Das Ergebnis ist: Das Makro macht was es soll allerdings ist die Laufzeit >5sec.
Daher meine Frage: "Wo kann hier noch etwas Geschwindigkeit gutmacht werden, ohne das Makro grundlegend zu ändern?"


Private Sub CommandButton2_Click() 'Lieferschein erfassen'

Dim Blatt As Worksheet
For Each Blatt In ActiveWorkbook.Sheets
Blatt.Unprotect ("123")
Next

Dim lngIndex As Long
For lngIndex = 1 To 6
If Controls("TextBox" & CStr(lngIndex)).TextLength = 0 Then
MsgBox "Es sind ein oder mehrere Felder nicht ausgefüllt!", vbOKOnly Or vbCritical, "Eingabefehler"
Exit Sub
End If
Next

Dim inta As Integer
Set frm = UserForm1
Sheets("Admin").Activate
With frm

Cells(3, 10).Value = .TextBox1.Value
Cells(3, 1).Value = DateValue(TextBox2)
Cells(3, 2).Value = CDbl(TextBox3.Value)
Cells(3, 4).Value = CDbl(TextBox4.Value)
Cells(3, 12).Value = .TextBox5.Value
Cells(3, 13).Value = .TextBox6.Value
End With

Worksheets("Admin").Range("A3:W3").Copy
Zeile = Worksheets("Erfassung").Range("A65535").End(xlUp).Row
If Application.IsText(Worksheets("Erfassung").Cells(Zeile, 1)) Then Zeile = Zeile + 1 Else _
Zeile = Zeile + 1

Worksheets("Erfassung").Cells(Zeile, 1).PasteSpecial Paste:=xlPasteValues

Dim tb As Object
For Each tb In UserForm1.Controls
TextBox4.Text = ""
TextBox5.Text = ""
TextBox6.Text = ""
TextBox3.SetFocus
Next tb

inta = MsgBox("Der Lieferschein wurde übernommen!", vbOKOnly + vbInformation, "Erfolgreiche Eingabe")

ActiveSheet.Unprotect
Range("O3:W3").Select
Selection.ClearContents

Sheets("Admin").Visible = xlVeryHidden

For Each Blatt In ActiveWorkbook.Sheets
Blatt.Protect Password:="123", DrawingObjects:=True, Contents:=True, Scenarios:=True, AllowFiltering:=True
Next

UserForm1.Hide

Sheets("Erfassung").Activate

UserForm1.Show

End Sub


Vielen Dank schon mal und wie gesagt das Makro macht was es soll ich weiß hatl nur nicht so recht wieso :-)
Gruss Thomas
Anzeige

14
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Laufzeit Makro ist zu lange
25.09.2024 14:52:15
Onur
Then Zeile = Zeile + 1 Else Zeile = Zeile + 1 

Ist Blödsinn, es wird auf jeden Fall addiert.
Warum werden bei ALLEN Blättern der Blattschutz rausgenommen (und wieder gesetzt), obwohl nur 2 Blätter bearbeitet werden ?
ActiveSheet.Unprotect

Wozu ? Es wurden bereits ALLE "unprotected".
Cells(3, 2).Value = CDbl(TextBox3.Value)

Cells(3, 4).Value = CDbl(TextBox4.Value)

Hier fehlen die Punkte vor "Textbox". Oder sind die etwa NICHT auf frm ?


Anzeige
AW: Laufzeit Makro ist zu lange
25.09.2024 15:39:03
Thomas
Hallo und schon mal Danke,
hat ca. 1sec gebracht. Kann man da evtl noch mehr optimieren?
Makro sieht jetzt so aus:


Private Sub CommandButton2_Click() 'Lieferschein erfassen'

Worksheets("Erfassung").Unprotect ("123")

Dim lngIndex As Long
For lngIndex = 1 To 6
If Controls("TextBox" & CStr(lngIndex)).TextLength = 0 Then
MsgBox "Es sind ein oder mehrere Felder nicht ausgefüllt!", vbOKOnly Or vbCritical, "Eingabefehler"
Exit Sub
End If
Next

Dim inta As Integer
Set frm = UserForm1
Sheets("Admin").Activate
With frm

Cells(3, 10).Value = .TextBox1.Value
Cells(3, 1).Value = DateValue(.TextBox2)
Cells(3, 2).Value = CDbl(.TextBox3.Value)
Cells(3, 4).Value = CDbl(.TextBox4.Value)
Cells(3, 12).Value = .TextBox5.Value
Cells(3, 13).Value = .TextBox6.Value
End With

Worksheets("Admin").Range("A3:W3").Copy
Zeile = Worksheets("Erfassung").Range("A65535").End(xlUp).Row
If Application.IsText(Worksheets("Erfassung").Cells(Zeile, 1)) Then Zeile = Zeile + 1

Worksheets("Erfassung").Cells(Zeile, 1).PasteSpecial Paste:=xlPasteValues

Dim tb As Object
For Each tb In UserForm1.Controls
TextBox4.Text = ""
TextBox5.Text = ""
TextBox6.Text = ""
TextBox3.SetFocus
Next tb

inta = MsgBox("Der Lieferschein wurde übernommen!", vbOKOnly + vbInformation, "Erfolgreiche Eingabe")

Range("O3:W3").Select
Selection.ClearContents

Sheets("Admin").Visible = xlVeryHidden

Worksheets("Erfassung").Protect Password:="123", DrawingObjects:=True, Contents:=True, Scenarios:=True, AllowFiltering:=True

UserForm1.Hide

Sheets("Erfassung").Activate

UserForm1.Show

End Sub
Anzeige
AW: Laufzeit Makro ist zu lange
25.09.2024 15:43:32
Onur
Mach aus
Dim tb As Object

For Each tb In UserForm1.Controls
TextBox4.Text = ""
TextBox5.Text = ""
TextBox6.Text = ""
TextBox3.SetFocus
Next tb

DAS
TextBox4.Text = ""

TextBox5.Text = ""
TextBox6.Text = ""
TextBox3.SetFocus

Und aus
Dim lngIndex As Long

For lngIndex = 1 To 6
If Controls("TextBox" & CStr(lngIndex)).TextLength = 0 Then
MsgBox "Es sind ein oder mehrere Felder nicht ausgefüllt!", vbOKOnly Or vbCritical, "Eingabefehler"
Exit Sub
End If
Next

DAS
Dim lngIndex As Long
For lngIndex = 1 To 6

If Controls("TextBox" & lngIndex)="" Then
MsgBox "Es sind ein oder mehrere Felder nicht ausgefüllt!", vbOKOnly Or vbCritical, "Eingabefehler"
Exit Sub
End If
Next
Anzeige
AW: Laufzeit Makro ist zu lange
25.09.2024 15:54:01
Eifeljoi 5
Hallo
Teste dies mal , von mir ungetestet
Private Sub CommandButton2_Click() 'Lieferschein erfassen'

Dim tb As Object
Dim data As Variant
Dim Zeile As Long
Dim inta As Integer
Dim lngIndex As Long
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
Worksheets("Erfassung").Unprotect ("123")
For lngIndex = 1 To 6
If Controls("TextBox" & CStr(lngIndex)).TextLength = 0 Then
MsgBox "Es sind ein oder mehrere Felder nicht ausgefüllt!", vbOKOnly Or vbCritical, "Eingabefehler"
Exit Sub
End If
Next
Set frm = UserForm1
With Worksheets("Admin")
.Cells(3, 10).Value2 = frm.TextBox1.Value
.Cells(3, 1).Value2 = DateValue(frm.TextBox2)
.Cells(3, 2).Value2 = CDbl(frm.TextBox3.Value)
.Cells(3, 4).Value2 = CDbl(frm.TextBox4.Value)
.Cells(3, 12).Value2 = frm.TextBox5.Value
.Cells(3, 13).Value2 = frm.TextBox6.Value
End With
Zeile = Worksheets("Erfassung").Cells(Worksheets("Erfassung").Rows.Count, 1).End(xlUp).Row + 1
data = Worksheets("Admin").Cells(3, 1).Resize(1, 23).Value2
Worksheets("Erfassung").Cells(Zeile, 1).Resize(1, 23).Value2 = data
For Each tb In UserForm1.Controls
If TypeName(tb) = "TextBox" Then tb.Text = ""
Next tb
inta = MsgBox("Der Lieferschein wurde übernommen!", vbOKOnly + vbInformation, "Erfolgreiche Eingabe")
Worksheets("Admin").Range("O3:W3").ClearContents
Worksheets("Admin").Visible = xlVeryHidden
Worksheets("Erfassung").Protect Password:="123", DrawingObjects:=True, Contents:=True, Scenarios:=True, AllowFiltering:=True
UserForm1.Hide
Worksheets("Erfassung").Activate
UserForm1.Show
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
End Sub
Anzeige
AW: Laufzeit Makro ist zu lange
25.09.2024 16:13:01
Thomas
Hallo,
das funktiopniert schon mal sehr schnell.
Muss mir nur wieder die Einschränkungen zu den TextBoxen holen es sollen nämlich nicht alle gelöscht werden.
Was mir auch noch aufgefallen ist.
Die erfassten Lieferscheine werden erst nach schließen der User Form in der Tablle sichtbar.
Kann man das noch umgehen?

Gruss und Danke
Anzeige
AW: Laufzeit Makro ist zu lange
25.09.2024 16:15:16
Onur
Application.ScreenUpdating = True

gehört VOR
UserForm1.Show
AW: Laufzeit Makro ist zu lange
25.09.2024 16:20:25
Thomas
Hallo,
jetzt verstehe ich zwar nicht mehr so ganz genau was das Makro macht aber es funktioniert.
Vielen Dank für Eure Hilfe.
AW: Laufzeit Makro ist zu lange
25.09.2024 16:27:22
Eifeljoi 5
Hallo

hmmm .....
Warum vor?
Ich habe es mir angewöhnt dies am Anfang und Ende Zu setzen.
Wenn ich dich jetzt richtig verstehe mache ich einen Fehle, aber warum?r
Anzeige
AW: Laufzeit Makro ist zu lange
25.09.2024 16:29:03
Onur
Die Userform wird geöffnet und der Code pausiert VOR
Application.ScreenUpdating = True

AW: Laufzeit Makro ist zu lange
25.09.2024 16:31:28
Eifeljoi 5
Danke für die Aufklärung
AW: Laufzeit Makro ist zu lange
25.09.2024 16:23:45
Onur
Wenn du eine Userform öffnest, wir der Code, der die Userform geööfnet hat, dort UNTERBROCHEN, bis die Userform wieder zu ist, es sein denn, du öffnest sie Modeless:
UserformXY.Show VbModeless
Anzeige
AW: Laufzeit Makro ist zu lange
25.09.2024 15:13:11
daniel
Hi
mach mal hier die schleife weg:
und lass nur das Leeren der Textboxen stehen.
es reicht, wenn man sie einmal leert, die mehrfache Wiederholung dieses Vorgangs bringt nichts.
For Each tb In UserForm1.Controls
TextBox4.Text = ""
TextBox5.Text = ""
TextBox6.Text = ""
TextBox3.SetFocus
Next tb

du wolltest vermutlich alle Textboxen in einer Schleife leeren und so was in dieser Art programmieren, aber das lohnt bei drei zu leerenden Textboxen noch nicht
For Each tb In UserForm1.Controls
tb.text = ""
Next tb

Gruß Daniel
Anzeige
AW: Laufzeit Makro ist zu lange
25.09.2024 15:16:50
Onur
Es gibt vielleicht noch meht Controls als nur Textboxen auf der Userform.
AW: Laufzeit Makro ist zu lange
25.09.2024 15:47:34
Thomas
Hallo,
in der User Form gibt es neben 6 Textboxen auch noch 4 Comboboxen.
gelöscht werden sollen nur 3 Textboxen. die übrigen sollen die Eingabe behalten.

Gruss Thomas
;

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige