Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1852to1856
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

Code "schneller machen" ?

Code "schneller machen" ?
21.10.2021 01:21:46
Andreas
Hallo alle zusammen,
ich weiß, ich bin in Sachen VBA kein Raketenforscher, weshalb ich um eine kleine Unterstützung dankbar wäre. Mit Sicherheit kann man das auch anders lösen, ich selbst aber kenne mich nur damit aus, wie ich es konstruiert habe.
Mit nachfolgendem Code speichere ich aus einem Userform viele Felder wieder zurück ins Blatt. Hierzu ermittelt er mir zunächst die Zeile, in der der 20.01.2021 (BSP) und die dazugheörige Schicht steht. Er speichert dann in die einzelnen Spalten und Reihen die Werte, welche zuvor auf dem Userform in den Comboxen und Textboxen eingetragen wurden. Es funktioniert zwar, nur leider dauert mir das zu lange, bis er fertig ist.
Kann man das vielleicht bisschen beschleunigen?
Vielen Dank für die Hilfe.

Private Sub CommandButton1_Click()
Dim Schicht As String
Dim MatchReihe As Long
Dim lzeile As Long
Dim i As Long
If TabStripSchicht.Value = 0 Then Schicht = "Frühdienst"
If TabStripSchicht.Value = 1 Then Schicht = "Spätdienst"
If TabStripSchicht.Value = 2 Then Schicht = "Nachtdienst"
If TabStripSchicht.Value = 3 Then Schicht = "Zusatzdienst 1"
If TabStripSchicht.Value = 4 Then Schicht = "Zusatzdienst 2"
With Worksheets("Tagesnachweise")
lzeile = .Cells(Rows.Count, 4).End(xlUp).Row
For i = 5 To lzeile 'Step 10
If .Cells(i, 4).Value = "20.01.2021" And .Cells(i, 5).Value = Schicht Then Exit For
Next i
MatchReihe = i - 1
For i = 1 To 10
.Cells(MatchReihe + i, 7) = Me.Controls("Textbox" & i).Value
.Cells(MatchReihe + i, 8) = Me.Controls("ComboboxAbwesend" & i).Value
.Cells(MatchReihe + i, 9) = Me.Controls("Combobox" & i)
.Cells(MatchReihe + i, 10) = Me.Controls("Combobox" & i + 10)
.Cells(MatchReihe + i, 11) = Me.Controls("Combobox" & i + 20)
.Cells(MatchReihe + i, 12) = Me.Controls("Combobox" & i + 30)
.Cells(MatchReihe + i, 13) = Me.Controls("Combobox" & i + 40)
.Cells(MatchReihe + i, 14) = Me.Controls("Combobox" & i + 50)
.Cells(MatchReihe + i, 15) = Me.Controls("Combobox" & i + 60)
.Cells(MatchReihe + i, 16) = Me.Controls("Combobox" & i + 70)
.Cells(MatchReihe + i, 17) = Me.Controls("Combobox" & i + 80)
.Cells(MatchReihe + i, 18) = Me.Controls("Combobox" & i + 90)
.Cells(MatchReihe + i, 19) = Me.Controls("Combobox" & i + 100)
.Cells(MatchReihe + i, 20) = Me.Controls("Combobox" & i + 110)
.Cells(MatchReihe + i, 21) = Me.Controls("Combobox" & i + 120)
.Cells(MatchReihe + i, 22) = Me.Controls("Combobox" & i + 130)
Next i
End With
End Sub

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Code "schneller machen" ?
21.10.2021 06:58:54
MCO
Moin!
Vielleicht kaum Effekt, aber weniger Zeilen abzuarbeiten:
Ersetze die If´s durch select case

Select Case TabStripSchicht.value
Case 0: Schicht = "Frühdienst"
Case 1: Schicht = "Spätdienst"
Case 2: Schicht = "Nachtdienst"
Case 3:  Schicht = "Zusatzdienst 1"
Case 4: Schicht = "Zusatzdienst 2"
End Select
Gruß. MCO
Anzeige
AW: Code "schneller machen" ?
21.10.2021 09:06:55
Der
Hallo,
speicher die Daten mal in ein Array bevor Du sie durchsuchst:

Private Sub CommandButton1_Click()
Dim Schicht As String
Dim MatchReihe As Long
Dim lzeile As Long
Dim i As Long
 Dim temp As Variant
If TabStripSchicht.Value = 0 Then Schicht = "Frühdienst"
If TabStripSchicht.Value = 1 Then Schicht = "Spätdienst"
If TabStripSchicht.Value = 2 Then Schicht = "Nachtdienst"
If TabStripSchicht.Value = 3 Then Schicht = "Zusatzdienst 1"
If TabStripSchicht.Value = 4 Then Schicht = "Zusatzdienst 2"
With Worksheets("Tagesnachweise")
lzeile = .Cells(Rows.Count, 4).End(xlUp).Row
      temp = .Cells(1, 5).Value
For i = 5 To UBound(temp) 'Step 10
If temp(i, 4).Value = "20.01.2021" And temp(i, 5).Value = Schicht Then Exit For
Next i
End Sub

Anzeige
AW: Code "schneller machen" ?
21.10.2021 09:07:41
Daniel
Hi
Befülle nicht jede Zelle einzeln
Schreibe die Werte zuerst in ei Array und dann das Array in die Zellen:

Dim arr(1 to 10, 7 to 22)
Matchreihe = i
For i = i to 10
arr(i, 7) = Me.Controls("Textbox" & i).Value
arr(i, 8) = Me.Controls("ComboboxAbwesend" & i).Value
arr(i, 22) = Me.Controls("Combobox" & i + 130)
Next i
.Cells(Matchreihe, 1).Resize(10, 16).value = arr
Gruß Daniel
AW: Code "schneller machen" ?
21.10.2021 09:21:02
volti
Hallo Andreas,
am schnellsten geht's mit Array.
Hier ein Beispiel (ungetestet)
Code:

[Cc][+][-]

Private Sub CommandButton1_Click() Dim Schicht As String, sArr(9, 15) Dim i As Long, j As Long i TabStripSchicht.Value: If i > 4 Then Exit Sub Schicht = "20.01.2021" _ & Split("Frühdienst,Spätdienst,Nachtdienst,Zusatzdienst 1,Zusatzdienst 2", ",")(i) With Worksheets("Tagesnachweise") For j = 5 To .Cells(.Rows.Count, 4).End(xlUp).Row 'Step 10 If .Cells(j, 4).Value = Schicht Then Exit For Next j For i = 0 To 9 sArr(i, 0) = Me.Controls("Textbox" & i + 1).Value sArr(i, 1) = Me.Controls("ComboboxAbwesend" & i + 1).Value sArr(i, 2) = Me.Controls("Combobox" & i + 1) sArr(i, 3) = Me.Controls("Combobox" & i + 11) sArr(i, 4) = Me.Controls("Combobox" & i + 21) sArr(i, 5) = Me.Controls("Combobox" & i + 31) sArr(i, 6) = Me.Controls("Combobox" & i + 41) sArr(i, 7) = Me.Controls("Combobox" & i + 51) sArr(i, 8) = Me.Controls("Combobox" & i + 61) sArr(i, 9) = Me.Controls("Combobox" & i + 71) sArr(i, 10) = Me.Controls("Combobox" & i + 81) sArr(i, 11) = Me.Controls("Combobox" & i + 91) sArr(i, 12) = Me.Controls("Combobox" & i + 101) sArr(i, 13) = Me.Controls("Combobox" & i + 111) sArr(i, 14) = Me.Controls("Combobox" & i + 121) sArr(i, 15) = Me.Controls("Combobox" & i + 131) Next i .Cells(j - 1, "G").Resize(11, 17).Value = sArr End With End Sub

_________________________
viele Grüße aus Freigericht 😊
Karl-Heinz

Anzeige
AW: Code "schneller machen" ?
21.10.2021 10:09:09
Andreas
Hallo Leute,
vielen Dank an alle für die Codes, die ihr mir zukommen habt lassen. Ich lese daraus, dass es in ein "Array" muss. Leider kenne ich mich mit Arrays nicht aus, weshalb es mir gerade schwierig ist, den Code nachzuvollziehen. Kann mir vielleicht kurz noch jemand hinter die EInzelnen Schritte zu seinem Code eine Art Erklärungstext dazuschreiben, damit ich weiß, was der jeweilige Schritt macht? LErnen am Beispiel ist für mich immer am besten gewesen, weshalb ich dann besser auf dem Code aufbauen kann.
Eine weitere Frage noch zu diesem Array. Muss ich das Array auch beim Befüllen der ZEllen verwenden? Derzeit mache ich das auf die selbe Art und Weise, nur umgekehrt mit folgendem Code:

Private Sub Schichtfelder_befuellen()
Dim Schicht As String
Dim MatchReihe As Long
Dim lzeile As Long
Dim i As Long
If TabStripSchicht.Value = 0 Then Schicht = "Frühdienst"
If TabStripSchicht.Value = 1 Then Schicht = "Spätdienst"
If TabStripSchicht.Value = 2 Then Schicht = "Nachtdienst"
If TabStripSchicht.Value = 3 Then Schicht = "Zusatzdienst 1"
If TabStripSchicht.Value = 4 Then Schicht = "Zusatzdienst 2"
With Worksheets("Tagesnachweise")
lzeile = .Cells(Rows.Count, 4).End(xlUp).Row
For i = 5 To lzeile 'Step 10
If .Cells(i, 4).Value = "20.01.2021" And .Cells(i, 5).Value = Schicht Then Exit For
Next i
MatchReihe = i - 1
MsgBox "Deine Reihe gefunden in " & i
For i = 1 To 10
Me.Controls("Textbox" & i) = .Cells(MatchReihe + i, 7).Text
Me.Controls("ComboboxAbwesend" & i) = .Cells(MatchReihe + i, 8).Text
Me.Controls("Combobox" & i) = .Cells(MatchReihe + i, 9).Text
Me.Controls("Combobox" & i + 10) = .Cells(MatchReihe + i, 10).Text
Me.Controls("Combobox" & i + 20) = .Cells(MatchReihe + i, 11).Text
Me.Controls("Combobox" & i + 30) = .Cells(MatchReihe + i, 12).Text
Me.Controls("Combobox" & i + 40) = .Cells(MatchReihe + i, 13).Text
Me.Controls("Combobox" & i + 50) = .Cells(MatchReihe + i, 14).Text
Me.Controls("Combobox" & i + 60) = .Cells(MatchReihe + i, 15).Text
Me.Controls("Combobox" & i + 70) = .Cells(MatchReihe + i, 16).Text
Me.Controls("Combobox" & i + 80) = .Cells(MatchReihe + i, 17).Text
Me.Controls("Combobox" & i + 90) = .Cells(MatchReihe + i, 18).Text
Me.Controls("Combobox" & i + 100) = .Cells(MatchReihe + i, 19).Text
Me.Controls("Combobox" & i + 110) = .Cells(MatchReihe + i, 20).Text
Me.Controls("Combobox" & i + 120) = .Cells(MatchReihe + i, 21).Text
Me.Controls("Combobox" & i + 130) = .Cells(MatchReihe + i, 22).Text
Next i
End With
End Sub

Anzeige
AW: Code "schneller machen" ?
21.10.2021 11:03:55
volti
Hallo Andreas,
auch hier kann man den gewünschten Quellzellbereich erst mal in ein Array überführen und aus diesem die Textboxen befüllen.
M.E. ist der Zeitgewinn aber nicht so gravierend, da ja nichts in die Zellen geschrieben wird sondern nur Daten aus diesen geholt werden.
Sub Beispiel()
  Dim vArr As Variant
  
  Set vArr = Range("A1:B2")
  Debug.Print vArr(1, 1)
  
End Sub
Gruß
Karl-Heinz
Anzeige
AW: Code "schneller machen" ?
21.10.2021 10:34:13
Andreas
Karlheinz,
deinen Code habe ich denke ich einigermaßen verstanden.
die sarr(i...) speichern erstmal alles in das Array.
Am Ende schreibt
.Cells(j - 1, "G").Resize(11, 17).Value = sArr
alles ins Tabellenblatt.
Kann mir jemand kurz erklären, was hier was bewirkt in dieser Zeile?
.Cells(j - 1, "G") verstehe ich noch --- erste Zeile ab dem G
Aber was macht dieses Resize(11,17).Value=sarr
AW: Code "schneller machen" ?
21.10.2021 10:55:33
volti
Hallo Andreas,
nachdem alle Daten in ein zweidimensionales Array übertragen wurden, wobei keine Aktionen auf dem Blatt erfolgen und somit auch keine den Prozess verlangsamenden internen Abläufe stattfinden, werden die Daten hiermit in einem Rutsch auf das Blatt ausgegeben.
Hierbei kann dann auch auf Screenupdating = false verzichtet werden.
.Cells(j - 1, "G").Resize(10, 16).Value = sArr
.Cells(j-1,"G") oder .Cells((j-1, 7) ist die Startzelle, an der die Daten ausgegeben werden
.Resize(10, 16) erweitert den Ausgabebereich auf 10 Zeilen und 16 Spalten passend zur Array-Dimensionierung, die bei mir jedoch bei 0 beginnt, daher immer eins mehr als die Arraydimensionierung.
PS: 11 und 17 waren noch falsch,, setze 10 und 16 ein...
Gruß
Karl-Heinz
Anzeige
AW: Code "schneller machen" ?
21.10.2021 11:13:59
volti
Hallo Andreas,
hier ein Update:
Code:

[Cc][+][-]

Private Sub CommandButton1_Click() Dim Schicht As String, sArr(9, 15) Dim i As Long, j As Long i TabStripSchicht.Value: If i > 4 Then Exit Sub Schicht = "20.01.2021" _ & Split("Frühdienst,Spätdienst,Nachtdienst,Zusatzdienst 1,Zusatzdienst 2", ",")(i) With Worksheets("Tagesnachweise") For j = 5 To .Cells(.Rows.Count, 4).End(xlUp).Row 'Step 10 If .Cells(j, 4).Value & .Cells(j, 5).Value = Schicht Then Exit For Next j For i = 0 To 9 sArr(i, 0) = Me.Controls("Textbox" & i + 1).Value sArr(i, 1) = Me.Controls("ComboboxAbwesend" & i + 1).Value sArr(i, 2) = Me.Controls("Combobox" & i + 1) sArr(i, 3) = Me.Controls("Combobox" & i + 11) sArr(i, 4) = Me.Controls("Combobox" & i + 21) sArr(i, 5) = Me.Controls("Combobox" & i + 31) sArr(i, 6) = Me.Controls("Combobox" & i + 41) sArr(i, 7) = Me.Controls("Combobox" & i + 51) sArr(i, 8) = Me.Controls("Combobox" & i + 61) sArr(i, 9) = Me.Controls("Combobox" & i + 71) sArr(i, 10) = Me.Controls("Combobox" & i + 81) sArr(i, 11) = Me.Controls("Combobox" & i + 91) sArr(i, 12) = Me.Controls("Combobox" & i + 101) sArr(i, 13) = Me.Controls("Combobox" & i + 111) sArr(i, 14) = Me.Controls("Combobox" & i + 121) sArr(i, 15) = Me.Controls("Combobox" & i + 131) Next i .Cells(j - 1, "G").Resize(10, 16).Value = sArr End With End Sub

_________________________
viele Grüße aus Freigericht 😊
Karl-Heinz

Anzeige
AW: Code "schneller machen" ?
21.10.2021 12:13:35
Andreas
Super.... das funktioniert nach bisschen umscrheiben echt bestens.. Und verstanden hab ich das jetzt glaube auch für das Array... Melde mich wieder, wenn ich weitergekommen bin.
Erstmal vieeeeelen Dank!

16 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige