Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1908to1912
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 / Schleifen vereinfachen

Code / Schleifen vereinfachen
28.11.2022 12:13:56
Richi
Guten Tag
Hab Code geschrieben welcher einwandfrei funktioniert, nur läuft das gute Programm viel zulange.
Der Grund dafür sind die Schleifen. Mein bescheidenes VBA Wissen hindert mich daran einen Code zu schreiben der effizienter (schneller) läuft.
Was will ich mit dem Code erreichen:
Ich habe Zeilen mit Zellen Start und Enddatum und nachfolgende Spalten mit denen ich einen Zeitstrahl abbilde. Der Zeitstrahl-Header ist aufgeteilt in 3 Zeithorizonte.
1. Arbeitstage, in meinem Code mit "AT" referenziert
2. Kalenderwochen, beginnend immer an einem Montag, in meinem Code mit "W" referenziert
3. Monate, Datum ist der letzte Tag des Monates, in meinem Code mit "M" referenziert
Mit dem Start/Enddatum jeder Zeile zeichne ich Balken. Ich suche mittels der Schleifen die Spaltennummer des jeweiligen Start und End Datum auf dem Zeitstrahl und übergebe diesen Bereich dem Selection.Interior..... Es müsste doch möglich sein, mit weniger Schleifen den Bereich zu definieren.
Ich hoffe jemand kann mir dabei helfen die Bereichsuche über Schleifen effizienter zu definieren.
Liebe Gruess
Richi
------------------------------------------------------------------------

Sub Zeichnen()
Dim wb As Workbook
Dim wsO As Worksheet
Dim wsS As Worksheet
Dim lzO As Integer
Dim lsO As Integer
Dim i As Integer
Dim s As Integer
Dim e As Integer
Dim StartS As Integer
Dim EndS As Integer
Dim StartSH As Integer
Dim StartZ As Integer
Dim SMonat As Date
Dim Emonat As Date
'--------------------------Startblock zur Geschwindigkeitserhöhung bei Schleifen------------------------
With Application
.ScreenUpdating = False
.EnableEvents = False
.Calculation = xlCalculationManual
End With
Set wb = ThisWorkbook
Set wsO = wb.Worksheets("Overview")
Set wsS = wb.Worksheets("Steuertabelle")
StartSH = 39
StartZ = 13
lsO = wsO.Cells(6, wsO.Columns.Count).End(xlToLeft).Column                         'letzte Spalte Ziel ermitteln
lzO = wsO.Cells(wsO.Rows.Count, "A").End(xlUp).Row                                 'letzte Zeile  Ziel ermitteln
wsO.Select
wsO.Cells(StartZ + 2, 1).Select
wsO.Range(Cells(StartZ + 2, StartSH), Cells(lzO, lsO)).ClearContents
wsO.Cells(StartZ + 2, 1).Select
'-----Bereich definieren-----
'----Schleife Start- und Enddatum vertikal----
For i = StartZ + 2 To lzO
If wsO.Cells(i, 31) > wsO.Cells(StartZ - 3, lsO) And wsO.Cells(i, 32) > wsO.Cells(StartZ - 3, lsO) Then GoTo NextIteration
If wsO.Cells(i, 31)  wsO.Cells(StartZ - 3, lsO) Then
EndS = lsO
End If '----Schleife Start Datum horizontal----
For s = StartSH To lsO
'Start Datum Arbeitstage
If wsO.Cells(StartZ - 7, s) = "AT" Then
If wsO.Cells(i, 31) = wsO.Cells(StartZ - 3, s) Then
StartS = s
End If
'----Schleife End Datum horizontal----
For e = s To lsO
'End Datum Montag-Freitag in Woche
If wsO.Cells(StartZ - 7, e) = "AT" Then
If wsO.Cells(i, 32) = wsO.Cells(StartZ - 3, e) Then
EndS = e
End If
Else    'End Datum Montag-Freitag in Woche
If wsO.Cells(StartZ - 7, e) = "W" Then
If wsO.Cells(i, 32) >= wsO.Cells(StartZ - 3, e) And wsO.Cells(i, 32) = SMonat And wsO.Cells(i, 32) = wsO.Cells(StartZ - 3, s) And wsO.Cells(i, 31) = wsO.Cells(StartZ - 3, e) And wsO.Cells(i, 32) = SMonat And wsO.Cells(i, 32) = SMonat And wsO.Cells(i, 31) = SMonat And wsO.Cells(i, 32) 

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Code / Schleifen vereinfachen
28.11.2022 12:37:12
Jowe
statt
wsO.Range(wsO.Cells(i, StartS), wsO.Cells(i, EndS)).Select
würde ich zunächst einmal überall dieses ständige select ausmerzen!!
Und z.B, mit 'Dim slctRng as Range' arbeiten:
slctRng = wsO.Range(wsO.Cells(i, StartS), wsO.Cells(i, EndS))
und dann statt 'selection.' jeweils 'lctRng.' verwenden
AW: Code / Schleifen vereinfachen
28.11.2022 12:40:15
ralf_b
das ist mir zu unkommentiert.
Aber ... du verwendest sehr oft sowas StartZ - 3. eine Rechenoperation zu viel und das mal x Durchläufe. Ersetze solche Ausdrücke durch eine Variable.
Verwende keine Selection. Den Bezug, den du selektierst, kannst du auch gleich weiterverwenden. z.b. mit einer with Klammer
du holst dir die RGB werte aus Zellen. Jeder Zellzugriff kostet Zeit. Auch hier RGB(wsS.Cells(6, 5).Value, wsS.Cells(6, 6).Value, wsS.Cells(6, 7).Value) verwende Variablen, die du zu Beginn einmal einliest.
Grundsätzlich würde ich sagen nutze Arrays. Die werden einmal in den Speicher gelesen und dann nur noch durchgearbeitet ohne Tabellenzugriff.
Aber das du mittendrin doch noch die Zellen färbst usw. müßte man sich das etwas genauer betrachten.
Anzeige
AW: Code / Schleifen vereinfachen
28.11.2022 19:59:18
Yal
Hallo Richi,
wenn ich annehmen darf, dass pro Zeile immer nur ein Zeit-Typ (AT/W/M) gibt, dann musst Du nur pro Zeile (Schleife 1)
_ die Startspalte ermitteln, Schleife 2 innerhalb von Schleife 1. Wenn gefunden, sofort aus Schleife 2 rauspringen ("Exit For")
_ von diese Spalte +1 die Endspalte ermitteln, neue Schleife 2. Wenn gefunden, sofort rauspringen
_ Zeile-Bereich formatieren
_ nächste Zeile
Wenn pro Zeile mehrere Zeittypen, dann brauche ich ein Musterdatei.
Der untere Bereich lässt sich wie folgt "komprimieren" (ist nicht schneller oder besser, nur kompakter):

Dim aRGB
With wsO.Range(wsO.Cells(Ze, StartS), wsO.Cells(Ze, EndS)).Interior
.Pattern = xlPatternLinearGradient
.Gradient.Degree = 90
.Gradient.ColorStops.Clear
With .Gradient.ColorStops.Add(0)                         'Start Zellenhöhe
.ThemeColor = 1
.TintAndShade = 0
End With
With .Gradient.ColorStops.Add(0.35)                       'untere Linie schärfen
.ThemeColor = 1
.TintAndShade = 0
End With
Select Case wsO.Cells(Ze, 20)
Case "A-Z":  aRGB = wsS.Range("E5:G5") 'Overview
Case "A0100": aRGB = wsS.Range("E6:G6") 'Kundenanfrage
Case "B0210": aRGB = wsS.Range("E7:G7") 'Offer
Case "B0220": aRGB = wsS.Range("E8:G8") 'Kick Off
Case "C0010": aRGB = wsS.Range("E9:G9") 'Workpaper
With .Gradient.ColorStops.Add(0.36)                       'untere Linie Start Farbe
.Color = RGB(aRGB(1, 1), aRGB(1, 2), aRGB(1, 3))
.TintAndShade = 0
End With
With .Gradient.ColorStops.Add(0.64)                       'obere Linie Ende Farbe
.Color = RGB(aRGB(1, 1), aRGB(1, 2), aRGB(1, 3))
.TintAndShade = 0
End With
With .Gradient.ColorStops.Add(0.65)                       'obere Linie schärfen
.ThemeColor = 1
.TintAndShade = 0
End With
With .Gradient.ColorStops.Add(1)                          'Ende Zellenhöhe
.ThemeColor = 1
.TintAndShade = 0
End With
End With
NextIteration:
VG
Yal
Anzeige
AW: Code / Schleifen vereinfachen
29.11.2022 08:00:32
Richi
Besten Dank Yal
Den BalkenFormatierungscode über nehme ich sehr gerne. Einiges übersichtlicher "kürzer" als meiner :-)
Ich wäre natürlich sehr happy, wenn du mir helfen kannst den Code effizienter zu gestalten, was das Berechen des Bereiches für die Darstellung der Balken betrifft.
In der maximalen Ausprägung sind es ca. 4000 Zeilen und 1000 Spalten. Gehe davon aus, dass im Normalfall "nur" etwa 250-300 Spalten benötigt werden. Eine Menge an Daten die da gewälzt werden.
Die Beispieldatei habe ich angefügt: https://www.herber.de/bbs/user/156444.xlsx
Der Zeitstrahl lässt sich im Programm beliebig ändern, die maximale des Zeitstrahls habe ich auf 5 Jahren eingeschränkt.
Innerhalb des Zeitstrahls kann die Anzahl Arbeitstage, Monate, Jahre frei definiert werden.
Hinterlegtes Datum der Kalenderwoche auf Zeitstrahl ist immer Montag
Hinterlegtes Datum des Monates auf Zeitstrahl ist immer der letzte Tag des Monates
Es ist auch möglich den einen oder andern Parameter nicht darzustellen
Mögliche Varianten sind
- Arbeitstage, Monate, Jahre
- Arbeitstage, Monate
- Arbeitstage, Jahre
- Arbeitstage
- Monate, Jahre
- Monate
- Jahre
Liebe Gruess
Richi
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige