Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
328to332
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
328to332
328to332
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

automatische Monatsübernahme

automatische Monatsübernahme
28.10.2003 09:27:08
Diana
Moin,

ich habe folgendes Problem:

Eine Datei enthält in Spalte A Datums-/Zeitangaben mit der Struktur: 17 11:35
Das bedeutet, das am 17 eines Monats um 11:35 etwas gemessen wurde.

Nun möchte ich das Datum in Spalte B und die Zeit in Spalte C ausgeben. Dafür habe ich folgendes VBA Script geschrieben:

' Datum aus Datalogger-Zeitangabe extrahieren

Function DL_Datum(Jahr#, Monat#, DLZeit)
Dim JJJJ As Integer, mm As Integer, tt As Integer
JJJJ = Jahr
mm = Monat
tt = Left(DLZeit, 2)
DL_Datum = DateSerial(Year:=JJJJ, Month:=mm, Day:=tt)
End Function


' Uhrzeit aus Datalogger-Zeitangabe extrahieren

Function DL_UZeit(DLZeit)
Dim hh As Integer, min As Integer, sec As Integer
hh = Mid(DLZeit, 4, 2)
min = Mid(DLZeit, 7, 2)
sec = 0
DL_UZeit = TimeSerial(Hour:=hh, Minute:=min, Second:=sec)
End Function


' Datum und Zeit aus Datalogger-Zeitangabe extrahieren

Function DLZ(Jahr#, Monat#, DLZeit)
Dim JJ As Integer, mm As Integer, tt As Integer, hh As Integer, min As Integer, sec As Integer
Dim Date1 As Date, Time1 As Date, Date2 As Date
JJ = Jahr
mm = Monat
tt = Left(DLZeit, 2)
hh = Mid(DLZeit, 4, 2)
min = Mid(DLZeit, 7, 2)
sec = 0
Date1 = DateSerial(Year:=JJ, Month:=mm, Day:=tt)
Time1 = TimeSerial(Hour:=hh, Minute:=min, Second:=0)
Date2 = DateSerial(Year:=JJ, Month:=mm, Day:=tt) & Space(1) & TimeSerial(Hour:=hh, Minute:=min, Second:=0)
DLZ = CDate(Date2)
End Function


Das funktioniert auch alles bestens, nur muss ich für das Datum immer den Monat per Hand angeben (in der Funktion). Wenn dann der letzte Tag des Monats erreicht ist und ein neuer Monat beginnt, springt er nicht automatisch in den nächsten Monat, sondern macht immer so weiter mit dem angegebenen Monat.

Ich würde gern folgende Lösung umsetzen:
In einer beliebigen Zelle gebe ich den Startmonat und beim kopieren der Funktion nach unten, soll das Script automatisch prüfen, dass wenn der Tag der vorangegangenen Zelle größer ist, dann muss der Monat um einen Wert höher gesetzt werden. Sprich, wenn ich folgende Daten habe:

17 11:35
17 17:35
18 11:35
18 17:35
5 11:35
5 17:35
(Startmonat = April)

dann muss in den Spalten daneben stehen:

17.04.03 11:35
17.04.03 17:35
18.04.03 11:35
18.04.03 17:35
05.05.03 11:35
05.05.03 17:35

Das selbe Problem muss ich auch für das Jahr lösen. Im Moment werden es alles Daten aus 2003 sein, aber es kommt die Jahreswende und dann steht da Januar 2004 an.

Nun meine Frage: Wie muss ich meine VBA Funktionen anpassen, dass er sich Monat und Jahr bei gegebenen Startwerten automatisch holt?

Ich bin über jeden Lösungsvorschlag dankbar.

Liebe Grüße aus Hannover
Diana

2
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: tricky, um nicht zu sagen interessant ;-)
28.10.2003 13:24:24
Nike
Hi,

nicht ganz simpel, dafür um so interessanter ;-)

Public

Function DLZ(rngDat As Range, Optional intJahr As Integer, Optional intMon As Integer)
Dim strDat As String
Dim bolYAdd As Boolean
Application.Volatile
strDat = CStr(rngDat)
intDay = CInt(Left(strDat, 2))
If intMon = 0 Then
If rngDat.Row > 1 Then
intMon = Month(rngDat.Offset(-1, 1))
If intDay < Day(rngDat.Offset(-1, 1)) Then
If intMon = 12 Then
intMon = 1
bolYAdd = True
Else
intMon = intMon + 1
End If
Else
'intMon
End If
Else
intMon = 1
End If
Else
'intMon
End If
If intJahr = 0 Then
If rngDat.Row > 1 Then
intJahr = Year(CDate(rngDat.Offset(-1, 1)))
Else
intJahr = 2003
End If
End If
If bolYAdd = True Then
intJahr = intJahr + 1
End If
hh = Hour(CDate(Mid(strDat, InStr(1, strDat, " ") + 1, 5)))
min = Minute(CDate(Mid(strDat, InStr(1, strDat, " ") + 1, 5)))
sec = 0
DLZ = Format(CDate(DateSerial(intJahr, intMon, intDay) & Space(1) & TimeSerial(hh, min, sec)), "dd.mm.yy hh:mm")
End Function


Aufzurufen in der ersten Zeile mit Jahr und Monat,
danach einfach nur die Zellen runterziehen, ohne Jahr und Monat...

in B1 =dlz(A1;2003;4)
in B2 =dlz(A2)
und dann b2 runterziehen...

Bye

Nike
Anzeige
AW: tricky, um nicht zu sagen interessant ;-)
28.10.2003 15:54:33
Diana
Vielen Dank ... das ist genau die Lösung.

Diana

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige