Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Bedingte Formatierung für Kalenderwoche überschritten

Begonnen von Petrocelli, Dezember 19, 2018, 15:03:31

⏪ vorheriges - nächstes ⏩

Petrocelli

Hallo,

ich möchte in meinem Bericht das Feld Lieferwoche bei Überschreiten der Lieferwoche rot hinterlegen.

Die Lieferwoche wird aus dem Feld Liefertermin ausgelesen (mit diesem Code: https://codekabinett.com/rdumps.php?Lang=1&targetDoc=vba-kalenderwoche-jahr-datum-ermitteln) und dann mit dem Jahr zusammen so angezeigt:
2018-52, 2019-1, etc.

Wie muß ich die Regel angeben, damit das klappt?

Gruß,
Petro

Lachtaube

#1
Die Ausgabe ist mehr fürs Auge gedacht. Zum Vergleichen wäre es besser, ISO-Jahr und ISO-Woche in separaten Zahlenfeldern zu hinterlegen oder ein Zahlenfeld zu bilden, in dem das Jahr mit 100 multipliziert wird und die Wochennummer hinzu addiert wird. Denn beim String-Vergleich wäre z.B. die KW 2019-2 größer als die KW 2019-15.

Im Prinzip muss entweder nur noch eine Funktion für ISOYear() geschrieben werden, die sich leicht aus ISOWeekAndYear() ableiten lässt oder man schreibt ISOWeekAndYear() so um, dass ein Long als Ergebnis heraus kommt. Letzteres könnte so gestaltet werden.
Function IsoYYYYWW(ByVal weekDate As Date) As Long
   Dim week     As Long
   Dim weekYear As Long

   week = IsoWeek(weekDate)
   weekYear = Year(weekDate)

   If week >= 52 And Month(weekDate) = 1 Then
      weekYear = weekYear - 1
   ElseIf week = 1 And Month(weekDate) = 12 Then
      weekYear = weekYear + 1
   End If

   IsoYYYYWW = weekYear * 100 + week
End Function


Wenn Du nur weekYear zurückgibst, hättest Du eine ISOYear()-Funktion.

PS: weil der Bug nur auf Montage beschränkt ist, könnte man auch immer den Donnerstag der gleichen Woche untersuchen und hat damit sowohl das ISO-Jahr als auch die KW richtig ermittelt.

Damit könnte man die Funktionen kürzer so schreiben.Function GetISOWeek(ByVal ADate As Date, _
                    Optional ByRef outISOYear As Integer) As Integer
   Dim ThursdayOfWeek As Date
   
   ThursdayOfWeek = ADate - Weekday(ADate, vbMonday) + 4
   GetISOWeek = DatePart("ww", ThursdayOfWeek, vbMonday)
   outISOYear = Year(ThursdayOfWeek)
End Function

Function GetISOYear(ByVal ADate As Date) As Integer
   Dim ThursdayOfWeek As Date
   
   ThursdayOfWeek = ADate - Weekday(ADate, vbMonday) + 4
   GetISOYear = Year(ThursdayOfWeek)
End Function

Function GetISOYYYYWW(ByVal ADate As Date) As Long
   Dim ThursdayOfWeek As Date
   
   ThursdayOfWeek = ADate - Weekday(ADate, vbMonday) + 4
   GetISOYYYYWW = Year(ThursdayOfWeek) * 100 _
                + DatePart("ww", ThursdayOfWeek, vbMonday)
End Function
Grüße von der (⌒▽⌒)

Petrocelli

Hallo Lachtaube,

danke für den Tipp. Ich habe das mal so ausprobiert und es funktioniert auch. Nur das Format stimmt noch nicht, wenn ich
? GetISOYYYYWW(cdate("20.12.2018")) im Direktfenster eingebe, bekomme ich für heute 201851. Wie muß ich das ändern, damit ich 2018_51 angezeigt bekomme?

Dann wollte ich ja noch die bedingte Formatierung einbringen. Da weiß ich leider auch noch nicht, wie ich das eingeben muß, damit das klappt.

Hast du da noch Tipps?

Gruß,
Petro

MzKlMu

Hallo,
ZitatWie muß ich das ändern, damit ich 2018_51 angezeigt bekomme?
das geht nicht, die Funktion liefert eine Zahl (Long), da kann man keinen Unterstrich einfügen.
Da die bedingte Formatierung mit einem Zahlenwert vergleicht, darf das auch nicht geändert werden.

Was hast Du schon versucht mit der bed. Formatierung ?

Gruß Klaus

Petrocelli

#4
Hallo,

ich habe es jetzt hinbekommen, das es in Formularen und Berichten so formatiert angezeigt wird.

Bei der bedingten Formatierung habe ich versucht, das nicht über das Feld Lieferwoche, sondern über das Datum zu lösen (Wenn "Liefertermin" < "Datum ()" dann "Lieferwoche" = rot.
Klappt aber leider nicht.

Gruß,
Petro

Lachtaube

Hi Petro,

Wie liegen denn die relevanten Daten vor (vielleicht zwei oder drei Musterdatensätze zeigen) und welche Regel soll unter welchem Umstand für jeden dieser Datensätze gelten?

PS: Textfeldsteuerelemente besitzen eine Format-Eigenschaft, mittels derer die Darstellung eines Werts beeinflußt werden kann. 0000-00 würde Dir z.B. zu schönerer Optik verhelfen, ohne den Wert selbst zu verändern.
Grüße von der (⌒▽⌒)

Petrocelli

Zitat von: Lachtaube am Dezember 21, 2018, 08:54:28
PS: Textfeldsteuerelemente besitzen eine Format-Eigenschaft, mittels derer die Darstellung eines Werts beeinflußt werden kann. 0000-00 würde Dir z.B. zu schönerer Optik verhelfen, ohne den Wert selbst zu verändern.

Das hatte ich jetzt in Berichten und Formularen so gemacht.

Die Daten liegen so vor (abgespeckte Tabellenfelder):
Kunde  AuftragsNr  Auftragsbezeichnung  AngebotsNr  Angebotswert Projekt-Nr  Auftragsstatus  Lieferwoche Liefertermin (Datum,kurz)

Ich trage dann bei der Auftragsanlage den Liefertermin ein. Aus dem wird dann mit obiger Funktion die Lieferwoche ermittelt. In den nachfolgenden Formularen und Berichten steht dann nur die Lieferwoche.Und wenn die überschritten ist, hätte ich gern, daß das Feld Lieferwoche rot dargestellt wird.

Gruß, Petro

Lachtaube

Hi Petro,

versuche es mit:

Ausdruck ist: IsoYYYYWW([Liefertermin]) < IsoYYYYWW(Datum())

Dabei kann der Liefertermin trotzdem überschritten sein, wenn eine Lieferung z.B. am Montag erfolgen sollte und heute schon Freitag derselben Woche ist, wird nichts markiert.
Grüße von der (⌒▽⌒)