2016-04-08 2 views
0

Ich muss einen Bericht erstellen, der mehrmals täglich mit verschiedenen Einstellungen automatisch ausgeführt wird. Der Bericht wählt Datensätze zwischen zwei Daten aus. Jetzt möchte der Kunde frei sein, in einer Text- oder Excel-Datei die Daten zu definieren, die für jeden Bericht verwendet werden. Beispielsweise möchte ich jeden Tag den Bericht für diesen Tag und für denselben Tag das vorherige Jahr und für denselben Tag die vorherige Woche und für die vorherige Woche und für den nächsten Monat des vorherigen Jahres ausführen. Dann am ersten jeden Monats, dem ganzen vorherigen Monat usw. Ich denke, du bekommst das Wesentliche.Definieren Sie einen Datum-Offset von heute für einen Batch-Bericht

Meine Frage ist: Gibt es einen etablierten Weg, dies zu tun? Einige Textkodierungen für Offsets von Datumsangaben? Ich habe geschaut und nichts erscheint. Es scheint jedoch keine abwegige Aussage zu sein. Ich nehme an, die Situation ist schon einmal passiert. Ich möchte das Rad nicht neu erfinden. Wenn es jedoch nichts, würde jede Idee

Antwort

0

OK willkommen :-) sein, so habe ich es mir, kein freies Mittagessen diesmal :-) Das Format wählte ich eine Zeichenfolge wie:

+ 1W, fW, -1D (Das wäre die nächste Woche, der erste Tag der Woche, dann ein Tag davor)

Separator ist Komma, Schlüssel sind D für Tag, W für Woche, M für Monat, Y für Jahr, F für erstes, L für letztes (alle Schlüssel können niedriger oder groß sein). Das Format ignoriert Leerzeichen, aber das letzte Nicht-Leerzeichen muss ein Schlüssel sein. Nur ganzzahlige Offsets zulässig.

Ich gebe meine erste Implementierung einer VBA-Funktion, die einen Textoffset interpretiert. Es scheint zu funktionieren, obwohl noch wenige Tests durchgeführt wurden.

Nun, das ist alles für die Nachwelt.


Public Function GetDateFromOffset(fecIni As Date, sDif As String) As Date 
    Dim sArr() As String, ii As Integer, fRes As Date 
    fRes = fecIni 
    sArr = Split(sDif, ",") 

    For ii = LBound(sArr()) To UBound(sArr()) 
     fRes = ApplyOneOffset(fRes, sArr(ii)) 
    Next ii 

    GetDateFromOffset = fRes 
End Function 

Public Function ApplyOneOffset(fecIni As Date, sDif As String) As Date 
    Const C_DAY As String = "D", C_WEEK As String = "W", C_MONTH As String = "M", C_YEAR As String = "Y" 
    Const C_FIRST As String = "F", C_LAST As String = "L" 

    Dim iDesp As Integer, sDesp As String, fRes As Date 
    sDesp = UCase(Right(sDif, 1)) 
    sDif = Trim(UCase(Left(sDif, Len(sDif) - 1))) 
    Select Case sDesp 
     Case C_DAY 
      If (IsNumeric(sDif)) Then 
       fRes = DateAdd("d", CInt(sDif), fecIni) 
      End If 
     Case C_WEEK 
      If (sDif = C_FIRST) Then 
       fRes = dhFirstDayInWeek(fecIni) 
      ElseIf (sDif = C_LAST) Then 
       fRes = dhLastDayInWeek(fecIni) 
      ElseIf (IsNumeric(sDif)) Then 
       fRes = DateAdd("ww", CInt(sDif), fecIni) 
      End If 
     Case C_MONTH 
      If (sDif = C_FIRST) Then 
       fRes = dhFirstDayInMonth(fecIni) 
      ElseIf (sDif = C_LAST) Then 
       fRes = dhLastDayInMonth(fecIni) 
      ElseIf (IsNumeric(sDif)) Then 
       fRes = DateAdd("m", CInt(sDif), fecIni) 
      End If 
     Case C_YEAR 
      If (sDif = C_FIRST) Then 
       fRes = DateSerial(YEAR(fecIni), 1, 1) 
      ElseIf (sDif = C_LAST) Then 
       fRes = DateSerial(YEAR(fecIni), 31, 12) 
      ElseIf (IsNumeric(sDif)) Then 
       fRes = DateAdd("yyyy", CInt(sDif), fecIni) 
      End If 
     Case Else 
      fRes = fecIni 
    End Select 

    ApplyOneOffset = fRes 

End Function 
Verwandte Themen