PDA

Vollständige Version anzeigen : Problem mit Datum die über dem Jahr 2000 liegen


Elko
21.09.2001, 21:58
Habe diese VBA in meine DB kopiert eigentlich soll sie die Tage die es nicht gibt in einem Formular ausblenden.
Das funktioniert auch bis zum Jahr 2000
danach bleiben alle Tage eingeblendet
Warum?

Vieleicht kann mir jemand Helfen

schon mal DANKE

'*** Wochenenden hervorheben und nicht vorhandene ***
' Tage des betreffenden Monats ausblenden
Dim bez As String, txt As String
Dim i As Integer, wd As Integer
Dim act_date As Variant
Static last_date As Variant

'Nur ausführen, wenn kein neuer Datensatz oder
'Satz mit identischem Monat wie der letzte Monat
act_date = Me("Monat/Jahr")
If IsNull(act_date) = False And act_date <> last_date Then
last_date = act_date 'Monat merken

'Erste 28 Tage: nur Wochenenden behandeln
For i = 1 To 28
bez = "b" + Mid(Str(i), 2)
wd = WeekDay(Str(i) + "/" + act_date)
If wd = 7 Or wd = 1 Then
Me(bez).ForeColor = 255
Else
Me(bez).ForeColor = 0
End If
Next i

'Restliche Tage: gegebenenfalls ein-/ausblenden
For i = 29 To 31
bez = "b" + Mid(Str(i), 2)
txt = "t" + Mid(Str(i), 2)
If IsDate(Str(i) + "/" + act_date) = True Then
wd = WeekDay(Str(i) + "/" + act_date)
If wd = 7 Or wd = 1 Then
Me(bez).ForeColor = 255
Else
Me(bez).ForeColor = 0
End If
Me(bez).Visible = True
Me(txt).Visible = True
Else
Me(bez).Visible = False
Me(txt).Visible = False
End If
Next i
End If
End Sub

Ikke
22.09.2001, 13:37
Hallo Elko,
hast Du mal die Jahreszahl kontrolliert? Vielleicht interpretiert Dein BS 2001 als eine ältere Jahreszahl (z.B. als 1981)? Das würde dann wohl Dein Problem erklären.

Elko
22.09.2001, 21:37
Hallo ikke

Ob es nun der Februar im Jahr 2001 oder im Jahr 1998 ist,müßte egal sein denn kein Februar hat 31 Tage.
Die soll die Prozedur ja nicht einblenden.
Wie gesagt es funktioniert noch mit dem Jahr 2000 dann werde (egal welcher Monat)immer 31 Tage eingeblendet

Danke

Ikke
22.09.2001, 23:48
Sorry, da habe ich mich doch glatt in Deinem Beitrag verlesen! :rolleyes:
Ich schlaf mal drüber, vielleicht fällt mir dazu noch was halbwegs gescheites ein!

Ikke
23.09.2001, 11:41
Hi Elko,
ich hab's! Wenn Du beigehst und die Variable Datum als Date definierst und die folgende Zeile in Deinen Code einbaust, dann kannst Du verfolgen, warum dieser Effekt auftritt:
For i = 29 To 31
bez = "b" + Mid(Str(i), 2)
txt = "t" + Mid(Str(i), 2)
'------- Neue Zeile:
Datum = Str(i) + "/" + act_date ' 01.02.2029
If IsDate(Str(i) + "/" + act_date) = True Then
wd = WeekDay(Str(i) + "/" + act_date)
If wd = 7 Or wd = 1 Then
Die Variable Datum nimmt für den 29.02.01 nämlich den Wert 01.02.2029 an! Die Funktion IsDate prüft nämlich lediglich, ob sich der Ausdruck als Datum umformatieren lässt und nicht, ob es sich dabei um ein Datum handelt!
Da ich im Hilfetext keine Funktion gefunden habe, die überprüft, ob ein String ein korrektes Datum enthält würde ich Deine Problematik wie folgt lösen:
Datum = Str(i) + "/" + act_date ' 01.02.2029
strDatum = (i) & (".") & (Left(act_date, 2)) & (".") ' & (Right(act_date, InStr(1, act_date, "/") - 1))
If Left(Datum, 6) = strDatum Then
Ich habe aus der Variablen strDatum bewußt die Jahreszahl herausgenommen, da sie hier nur zwei Stellig erscheinen würde und dann gäbe es auch keinen 29.03. Vielleicht fällt Dir ja eine Lösung ein, die Jahreszahl wieder hinein zunehmen.
Was habe ich gemacht? Ich habe Deinen String in ein Datum umgewandelt und dann einen String gebildet, der das Datum, daß überprüft werden soll enthält. Wenn diese beiden identisch sind, dann gibt es das Datum offensichtlich.
So ich hoffe, daß ich nun die korrekte Lösung gefunden habe! ;)

Elko
23.09.2001, 21:51
Hallo ikke

Erst mal danke das du dir soviele Gedanken über mein Problem machst.
Habe diese Prozedur aus einem Buch kopiert
(Da ich selber blutiger Anfänger in sachen VBA bin)und sowiso nicht so recht verstehe, wie dises Ding abläuft.
Jetzt habe ich probiert deine neuen Anweisungen ein zubauen,komme aber nicht zurecht(Wo sollen die neuen Zeilen hin?)

Gruß

Ikke
23.09.2001, 22:03
Hallo Elko,
Na wir haben ja alle mal angefangen und das Du Dich am Anfang gleich auf sowas stürzt... :D Respekt!
Ich kopier hier jetzt Deinen kompletten Code hinein und markiere meine Zeilen:

'*** Wochenenden hervorheben und nicht vorhandene ***
' Tage des betreffenden Monats ausblenden
Dim bez As String, txt As String
Dim i As Integer, wd As Integer
Dim act_date As Variant
Static last_date As Variant
'----> Neue Zeile
Dim Datum as Date, strDatum as String
'<---- Neue Zeile

'Nur ausführen, wenn kein neuer Datensatz oder
'Satz mit identischem Monat wie der letzte Monat
act_date = Me("Monat/Jahr")
If IsNull(act_date) = False And act_date <> last_date Then
last_date = act_date 'Monat merken

'Erste 28 Tage: nur Wochenenden behandeln
For i = 1 To 28
bez = "b" + Mid(Str(i), 2)
wd = WeekDay(Str(i) + "/" + act_date)
If wd = 7 Or wd = 1 Then
Me(bez).ForeColor = 255
Else
Me(bez).ForeColor = 0
End If
Next i

'Restliche Tage: gegebenenfalls ein-/ausblenden
For i = 29 To 31
bez = "b" + Mid(Str(i), 2)
txt = "t" + Mid(Str(i), 2)
'----> Neue Zeilen
Datum = Str(i) + "/" + act_date
strDatum = (i) & (".") & (Left(act_date, 2)) & (".") ' & (Right(act_date, InStr(1, act_date, "/") - 1))
If Left(Datum, 6) = strDatum Then
'<---- Neue Zeilen
'If IsDate(Str(i) + "/" + act_date) = True Then
wd = WeekDay(Str(i) + "/" + act_date)
If wd = 7 Or wd = 1 Then
Me(bez).ForeColor = 255
Else
Me(bez).ForeColor = 0
End If
Me(bez).Visible = True
Me(txt).Visible = True
Else
Me(bez).Visible = False
Me(txt).Visible = False
End If
Next i
End If
End Sub

Du kannst Dir auf die erste Zeile mal eine Stopmarke setzen. Dann kannst Du ja immer kontrollieren, welchen Wert Deine Variablen annehmen. Wenn Du hierzu noch Fragen hast, oder ich bei der Kopiererei einen Fehler gemacht haben sollte, dann poste das hier einfach noch einmal. Am besten schick mir aber auch eben eine Mail, da ich die im Zweifelsfall eher lese als hier das Forum! ;)
Ich werde mir das dann hier im Forum angucken!