Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1184to1188
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

Brauche Hilfe bei Datumsermittlung

Brauche Hilfe bei Datumsermittlung
Holger
Hallo,
ich habe unten stehendes Makro.
In einer Zelle steht das Datum, die Zelle wird als Parameter an eine FKT übergeben.
In Abhängigkeit von dem Datum, werden die Variablen gesetzt.
Ich möchte das einfacher haben und einfach nach dem aktuellen Datum, die Variablen setzen.
Seht selbst es wäre wichtig. Mit Datum kenne ich mich null aus leider ....
SO UNGEFÄHR SOLL ES AUSSEHEN:
Sub getcurPeriod() As String
Dim i As Integer
Dim datToday As Date
datToday = Now()
'SO SOLL ES DANN SEIN
Select Case datToday
End Select
End Sub
SO WAR ES BISHER
Sub GetCurrentPeriod()
Dim wks As Worksheet
Dim strwks As String
Set wks = Worksheets(strWorkSheet1)
wks.Range("I2").Value = Now()
wks.Range("I2").NumberFormat = "DD.MM.YYYY"
wks.Cells(2, 10).FormulaLocal = "=getcurPeriod(I2)"
wks.Range("J2").Copy
wks.Range("J2").PasteSpecial xlPasteValues
wks.Range("J2").Font.Color = vbBlue
Application.CutCopyMode = False
wks.Range("E3").Value = strDeadline
wks.Range("E3").Font.Color = vbWhite
wks.Range("B1").Value = strSQLPeriod
End Sub

Function getcurPeriod(rng As Range) As String
Dim i As Integer
i = Year(rng)
Select Case DateSerial(i, Month(rng), Day(rng))
Case CDate("18.02." & i - 1) To CDate("17.03." & i)
getcurPeriod = "2010-01"
strDeadline = "28." & "02." & i
strSQLPeriod = "('Jan10')"
Case CDate("18.03." & i) To CDate("17.04." & i)
getcurPeriod = "2010-02"
strDeadline = "28." & "03." & i
strSQLPeriod = "('Feb10')"
Case CDate("18.04." & i) To CDate("17.05." & i)
getcurPeriod = "2010-03"
strDeadline = "28." & "04." & i
strSQLPeriod = "('Mar10')"
Case CDate("18.05." & i) To CDate("17.06." & i)
getcurPeriod = "2010-04"
strDeadline = "28." & "05." & i
strSQLPeriod = "('Apr')"
Case CDate("18.06." & i) To CDate("17.07." & i)
getcurPeriod = "2010-05"
strDeadline = "28." & "06." & i
strSQLPeriod = "('May10')"
Case CDate("18.07." & i) To CDate("17.08." & i)
getcurPeriod = "2010-06"
strDeadline = "28." & "07." & i
strSQLPeriod = "('Jun10')"
Case CDate("18.08." & i) To CDate("17.09." & i)
getcurPeriod = "2010-07"
strDeadline = "28." & "08." & i
strSQLPeriod = "('Jul10')"
Case CDate("18.09." & i) To CDate("17.10." & i)
getcurPeriod = "2010-08"
strDeadline = "28." & "09." & i
strSQLPeriod = "('Aug10')"
Case CDate("18.10." & i) To CDate("17.11." & i)
getcurPeriod = "2010-09"
strDeadline = "28." & "10." & i
strSQLPeriod = "('Sep10')"
Case CDate("18.11." & i) To CDate("17.12." & i)
getcurPeriod = "2010-10"
strDeadline = "28." & "11." & i
strSQLPeriod = "('Oct10')"
Case CDate("18.12." & i) To CDate("17.01." & i)
getcurPeriod = "2010-11"
strDeadline = "28." & "12." & i
strSQLPeriod = "('Nov10')"
Case CDate("18.01." & i) To CDate("17.02." & i)
getcurPeriod = "2010-12"
strDeadline = "28." & "01." & i
strSQLPeriod = "('Dec10')"
End Select
End Function

Das ist ja grauenhaft...
19.11.2010 10:04:38
Renee
Holger,
Warum um Himmelswillen machst du so komplizierte (auf 2010 beschränkte) VBA-Codes, wo doch deine Anforderungen mit einfachen Formeln (Jahr unabhängig) erreicht werden können ?
Auf dein Beispiel bezogen:
I2: Datum ...z.B. =HEUTE() oder einem manuell eingegebenen Datum
E3: =DATUM(JAHR(I2-17);MONAT(I2-17);28)    ...entspricht strDeadline
J2: =TEXT(E3-28;"JJJJ-MM")  ...entspricht getcurPeriod
B1: =TEXT(E3-28;"('MMMjj')")    ...entpricht strSQLPeriod
GreetZ Renée
Keine Formeln!
19.11.2010 10:11:17
Holger
Hi Rene,
Ich weiß, mit Formeln wäre es einfacher, aber die Vorgabe ist nun mal:
Keine einzige Formel!
Von daher muss ich es in VBA machen.
Hast du da eine Idee?
Anzeige
Dann schreib die Formeln, temporär..
19.11.2010 10:25:39
Renee
per VBA in die entsprechenden Zellen, Holger
Nach dem schreiben/calculate gleich wieder mit dem Wert überschreiben:
Sub QuickAndShort()
Range("I2") = Now
Range("J2").Formula = "=TEXT(DATE(YEAR(I2-17),MONTH(I2-17),0),""JJJJ-MM"")"
Range("J2").Value = Range("J2").Value
Range("E3").Formula = "=DATE(YEAR(I2-17),MONTH(I2-17),28)"
Range("E3").Value = Range("E3").Value
Range("B1").Formula = "=TEXT(DATE(YEAR(I2-17),MONTH(I2-17),0),""('MMMJJ')"")"
Range("B1").Value = Range("B1").Value
End Sub

Greetz Renée
...die nicht versteht, wie jemand eine Anforderung: EXCEL aber KEINE Formeln! stellen kann.
Anzeige
...oder direkter
19.11.2010 10:33:35
Renee
...ohne Formeln-Umweg!
Sub QuickerAndShorter()
Range("I2") = Now
Range("J2") = Format(DateSerial(Year(Now - 17), Month(Now - 17), 0), "YYYY-MM")
Range("E3") = DateSerial(Year(Now - 17), Month(Now - 17), 28)
Range("B1") = Format(DateSerial(Year(Now - 17), Month(Now - 17), 0), "('MMMYY')")
End Sub
GreetZ Renée
Rene, kann ich ...
19.11.2010 10:43:19
Holger
.... anstatt der Range das ganze auch in eine Variable packen:
Also strVAR = Format(DateSerial(Year(Now - 17), Month(Now - 17), 0), "YYYY-MM")
Selbsteverständlich! (owT)
19.11.2010 10:44:57
Renee

DANKE DIR, ich teste dann mal ;) k.t.
19.11.2010 10:48:46
Holger
Rene, eine Frage bitte, datum: englisch vs deutsch
19.11.2010 10:57:06
Holger
Hi Rene,
ich bin begeistert, weil die ersten zwei funktionieren perfekt!
Nur beim dritten bräuchte ich z.B anstatt ('Okt') ('Oct'),
also immer die englische Schreibweise.
Geht das überhaupt?
Anzeige
noch quicker and dirtier...
19.11.2010 11:04:59
Renee
Holger,
    Range("B1") = Replace(Replace(Replace(Replace( _
Format(DateSerial(Year(Now - 17), Month(Now - 17), 0), "('MMMYY')"), _
"rz", "ar"), "i", "y"), "k", "c"), "z", "c")

GreetZ Renée
Brauche Erklärung ! Klappt genial aber WARUM?
19.11.2010 11:21:26
Holger
Hi Rene,
Danek Dir, es funktioniert.
Aber ich verstehe nicht warum. Das mit dem Replace, kein Problem, verstehe ich.
Nur wie werden die anderen berechnet? Warum wird bei Year und month - 17 gerechnet?
Ich habe die Dateserial Function mir durchgelesen in der VB Hilfe und dennoch verstehe ich es nicht.
Eigentlich müßte doch dann das jahr minus 17 gerechnet werden?
Anzeige
Kurze Erklärung...
19.11.2010 11:28:06
Renee
Hallo Holger,
Es wird weder vom Jahr, noch vom Monat 17 abgezogen, sondern
vom (heutigen) Datum werden 17 Tage abgezogen!
Jetzt wird noch der Tag auf 0 gesetzt und damit vom Datum-17 Tage der Vormonat gewählt.
Die 17, weil deine Grenze beim 18. jeden Monats bis zum 17. des Folgemonats läuft beginnt!
GreetZ Renée
Guter hinweis
19.11.2010 11:59:47
Holger
Hi rene,
Nochmal tausend dank, du hastmir sehr
Geholfen. Danke dir und ein schönes
Wochenende.
Holger
Rene, eine Frage bitte, datum: englisch vs deutsch
19.11.2010 11:00:41
Holger
Hi Rene,
ich bin begeistert, weil die ersten zwei funktionieren perfekt!
Nur beim dritten bräuchte ich z.B anstatt ('Okt') ('Oct'),
also immer die englische Schreibweise.
Geht das überhaupt?
Anzeige
AW: Brauche Hilfe bei Datumsermittlung
19.11.2010 10:04:43
Harald
Schau mal das an:
Option Explicit
Public strdeadline As String
Public strSQLPeriod As String
Sub GetCurrentPeriod()
Dim wks As Worksheet
Set wks = Worksheets("Tabelle1")
wks.Cells(2, 10).FormulaLocal = "=getcurPeriod(I2)"
End Sub

Function getcurPeriod(rng As Range) As String
getcurPeriod = "2010-" & Format(Month(DateSerial(Year(rng), Month(rng), Day(rng) - 17)) - 1,  _
"00")
strdeadline = "28." & Format(Month(DateSerial(Year(rng), Month(rng), Day(rng) - 17)), "00") & _
"." & Year(rng)
strSQLPeriod = Format(Month(DateSerial(Year(rng), Month(rng), Day(rng) - 17)) - 1, "MMM") &  _
Format(Year(rng) - 2000, "00")
Debug.Print strdeadline
Debug.Print strSQLPeriod
End Function
Ich habe um die

Function ein kurzes Testgerüst gebaut, den Wert in I2 gebe ich manuell ein.
So richtig zukunftssicher ist aber weder Dein Code, noch meiner, denn was passiert 2011?
Gruß Harald

Anzeige
Zukunftssicher wäre ideal!
19.11.2010 10:12:35
Holger
Hi,
genau, ich will das ganze vom Jahr unabhängig machen, das ist ganz wichtig!
Hat jemand noch eine Idee?
AW: Zukunftssicher wäre ideal!
19.11.2010 10:16:31
Harald
Na ja,
im ersten Ansatz würde ich überall, wo 2010 fest codiert ist, statt dessen Year(rng) einsetzen. Aber ob das das gewünschte Resultat liefert, testest Du besser selbst.
Harald

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige