2016-04-08 6 views
0

毎日異なる設定で複数回、自動的に実行されるレポートを作成する必要があります。このレポートは、2つの日付間のレコードを選択します。今、クライアントは、各レポートを実行する日付をテキストファイルまたはExcelファイルに自由に定義したいと考えています。たとえば、毎日その日、前日の同じ日、前日の同じ日、前週の前月、前年の翌月のレポートを実行したいとします。その後、毎月の初めに、先月全体で、私はあなたが要点を得ると思います。今日からバッチレポートの日付オフセットを定義する

私の質問です:これを行うための確立された方法はありますか?いくつかのテキストは、日付のオフセットをエンコードしますか?私は見て、何も表示されません。しかし、それは風変わりな命題とは思われません。私は状況が以前に起こったと思います。私は車輪を再発明したくありません。しかし、何も存在しない場合、任意のアイデアは

答えて

0

OK歓迎:-)だろうので、私は私が選んだフォーマット:-)今回のような文字列である私自身、何の自由な昼食にそれをやったん:

+ 1W、fW、-1D(その翌週、その週の初日、その1日前)

セパレータはカンマで、キーはD日、Wは週、Mは月、Yは年、最初はF、最後はLです(すべてのキーは大文字または小文字にすることができます)。書式は空白を無視しますが、最後の空白以外の文字はキーでなければなりません。整数オフ​​セットのみが許されます。

テキストオフセットを解釈するVBA関数を初めて実装しました。テストはほとんど行われていませんが、動作するようです。

これはすべて、後世のためです。


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 
関連する問題