AW: Abschnitt!
16.12.2015 13:43:15
Michael
Hi Mike,
erst Mal vielen Dank für Deine immer freundlichen Worte... Es kostet mich durchaus Zeit, aber es macht auch immer wieder Spaß, an unterschiedlichsten Problemstellungen zu knabbern.
Ehrlich gesagt, leuchtet mir Dein zweiter, kürzerer Post nicht ganz ein. Ich habe jetzt Mal die genannte Regel eingebaut und im Code ein bißchen was erläutert:
Sub abschnitte121612()
Dim zeile&, bis&, oberster&, lfdNr&, zeileImBereich&, unterster&, i&
Dim Anlage As Variant
Dim regeln(1 To 15) As Byte
Dim kw1&, kw2&
Const von = 2
bis = Range("A" & Rows.Count).End(xlUp).Row
zeile = von
oberster = zeile
lfdNr = 0
Anlage = Range("A" & zeile).Value
While zeile Range("A" & zeile).Value Then
unterster = zeile - 1
lfdNr = lfdNr + 1
For zeileImBereich = oberster + 1 To unterster ' ab der zweiten Zeile im Bereich
' erst mal die KW in Variablen schreiben, die brauchst Du wohl öfters
kw1 = Range("J" & zeileImBereich)
kw2 = Range("J" & zeileImBereich - 1)
' und alles auf 0 setzen
For i = 1 To 15: regeln(i) = 0: Next
' 1. Regel:
' Wenn die "nullte Arbeit" eine Inspektion ist und die "erste Arbeit"
' eine Standardwartung und die Zeitdifferenz zwischen den beiden Arbeiten
' größer als 1 Woche ist, setze mir das valid-Feld der "ersten Arbeit" auf 1.
' Achtung: das bedeutet nicht automatisch, von der Formulierung her, daß
' valid auf 0 gesetzt wird - es ist aber mit 0 vorbelegt.
' Das kann bei kollidierenden Regeln dazu führen, daß der valid-Wert einer
' Zeile durch die Abarbeitung aller Regeln einmal auf 0, einmal auf 1 gesetzt
' wird - genau das wird durch das Array vermieden, das je einen Wert pro Regel
' enthält.
' In der Konsequenz können dann Werte zwischen 0 und 15 entstehen, je nach dem,
' wie viele Regeln gerade zutreffen.
If Range("B" & zeileImBereich) = "Standardwartung" And _
Range("B" & zeileImBereich - 1) = "Inspektion" Then
If Abs(kw1 - kw2) > 1 Then regeln(1) = 1
End If
Range("E" & zeileImBereich) = WorksheetFunction.Sum(regeln)
Next
' für die KW-Differenz
Range("F" & unterster) = Range("J" & unterster) - Range("J" & oberster)
oberster = zeile
Anlage = Range("A" & zeile)
End If
Wend
End Sub
Eine Select-Case-Konstruktion halte ich hier für nicht angebracht; Du willst ja doch immer alle Regeln abarbeiten, oder?
Was ich mir eher vorstellen könnte, wäre eine geschickte Verschachtelung der If-Zweige, meinetwegen grob in Worten:
wenn erste Arbeit = Std-Wartg dann
wenn dies,
wenn das,
wenn irgendwas
else
wenn erste Arbeit = bla usw.
wenn, wenn, wenn
endif
endif
Das KANN man schon als CASE schreiben, aber gut verschachtelte IFs sind schneller.
Anbei neue Datei (mit für "alle" Tabellenblätter): https://www.herber.de/bbs/user/102300.xlsm
Schöne Grüße,
Michael