2017-06-19 7 views
2

です。したがって、日付のリストがあります。私は、各年の指定された「開始日」と「終了日」と同じ範囲(曜日と月)に該当する日付を見つける必要があります。同じ月に該当する日付を識別します。年に一度の期間は

開始日:2004年2月12日、終了日:2005年3月31日、2000年2月12日から2001年3月31日まで、2002年2月12日から31/1/2002、 2001および31/1/2002などは "有効"とフラグが立てられます。

現在、私は上下限を使用して、範囲内の日付をテストします。

エクセル式:

アッパー:= DATE(YEAR(日)、MONTH(テスト)、DAY(テスト)+ルック・バック期間)

下:= DATE(YEAR(日)、MONTH (テスト)、DAY(テスト)-look戻る期間)

有効

:= IF(AND(日< =アッパー、日付> =低)、1,0)

Test     1/1/2005 
Look Back Period (Days) 30 
Start Date    2/12/2004 (=Test + Look Back Period) 
End Date    31/1/2005 (=Test - Look Back Period) 


    Date  Upper  Lower  Valid 
    04/01/2000 31/1/2000 2/12/1999 1 
    05/01/2000 31/1/2000 2/12/1999 1 
    06/01/2000 31/1/2000 2/12/1999 1 
    07/01/2000 31/1/2000 2/12/1999 1 
    10/01/2000 31/1/2000 2/12/1999 1 
    11/01/2000 31/1/2000 2/12/1999 1 
    12/01/2000 31/1/2000 2/12/1999 1 
    13/01/2000 31/1/2000 2/12/1999 1 
    14/01/2000 31/1/2000 2/12/1999 1 
    17/01/2000 31/1/2000 2/12/1999 1 
    18/01/2000 31/1/2000 2/12/1999 1 
    19/01/2000 31/1/2000 2/12/1999 1 
    20/01/2000 31/1/2000 2/12/1999 1 
    21/01/2000 31/1/2000 2/12/1999 1 
    24/01/2000 31/1/2000 2/12/1999 1 
    25/01/2000 31/1/2000 2/12/1999 1 
    26/01/2000 31/1/2000 2/12/1999 1 
    27/01/2000 31/1/2000 2/12/1999 1 
    28/01/2000 31/1/2000 2/12/1999 1 
    31/01/2000 31/1/2000 2/12/1999 1 
    01/02/2000 31/1/2000 2/12/1999 0 
    02/02/2000 31/1/2000 2/12/1999 0 
    03/02/2000 31/1/2000 2/12/1999 0 
    04/02/2000 31/1/2000 2/12/1999 0 
    07/02/2000 31/1/2000 2/12/1999 0 
    . 
    . 
    . 
    30/11/2000 31/1/2000 2/12/1999 0 
    01/12/2000 31/1/2000 2/12/1999 0 
    04/12/2000 31/1/2000 2/12/1999 0 <-- :(
    05/12/2000 31/1/2000 2/12/1999 0 <-- :(
    06/12/2000 31/1/2000 2/12/1999 0 <-- :(
    07/12/2000 31/1/2000 2/12/1999 0 <-- :(
    08/12/2000 31/1/2000 2/12/1999 0 <-- :(
    11/12/2000 31/1/2000 2/12/1999 0 <-- :(
    12/12/2000 31/1/2000 2/12/1999 0 <-- :(
    13/12/2000 31/1/2000 2/12/1999 0 <-- :(
    14/12/2000 31/1/2000 2/12/1999 0 <-- :(
    15/12/2000 31/1/2000 2/12/1999 0 <-- :(
    18/12/2000 31/1/2000 2/12/1999 0 <-- :(
    19/12/2000 31/1/2000 2/12/1999 0 <-- :(
    20/12/2000 31/1/2000 2/12/1999 0 <-- :(
    21/12/2000 31/1/2000 2/12/1999 0 <-- :(
    22/12/2000 31/1/2000 2/12/1999 0 <-- :(
    25/12/2000 31/1/2000 2/12/1999 0 <-- :(
    26/12/2000 31/1/2000 2/12/1999 0 <-- :(
    27/12/2000 31/1/2000 2/12/1999 0 <-- :(
    28/12/2000 31/1/2000 2/12/1999 0 <-- :(
    29/12/2000 31/1/2000 2/12/1999 0 <-- :(
    01/01/2001 31/1/2001 2/12/2000 1 
    02/01/2001 31/1/2001 2/12/2000 1 
    03/01/2001 31/1/2001 2/12/2000 1 
    04/01/2001 31/1/2001 2/12/2000 1 
    05/01/2001 31/1/2001 2/12/2000 1 
    08/01/2001 31/1/2001 2/12/2000 1 
    09/01/2001 31/1/2001 2/12/2000 1 
    10/01/2001 31/1/2001 2/12/2000 1 
    11/01/2001 31/1/2001 2/12/2000 1 

式が正常に動作します期間が何年にもわたっていない限り。ただし、上限と下限が2年の間に交差する場合、有効な計算式では前年の値が除外されます。

解決方法はありますか?式でこれを行うには

+1

これは、セグメントツリーの良い例のようです。 https://en.wikipedia.org/wiki/Segment_treeアルゴリズムとVBAに精通していますか? – Vityata

+0

私はvbaでソリューションをコーディングすることができます。しかし、このシートの遺産(誰かに伝えられない可能性が高い)のために、私はこれに優れた公式の解法を好むだろう。 – adam

+0

plzが動作しない例を教えてもらえますか? –

答えて

3

は、我々がやっているすべては、境界の二組を設定された2つの以上のヘルパー列

lower1: =DATE(YEAR(Date)-1,MONTH(StartDate),DAY(StartDate)) 
upper1: =C8+2*LookBack 
Lower2: =DATE(YEAR(Date),MONTH(StartDate),DAY(StartDate)) 
Upper2: =Lower2+2*LookBack 

valid: =IF(OR(AND(Date>=lower1,Date<=upper1),AND(Date>=Lower2,Date<=Upper2)),1,0) 

を設定します。 Dateと比較して、1つは前年から始まります。もう1つは今年から始まります。次に、Dateをチェックして、いずれかのセットに含まれるかどうかを確認します。

外観では、境界列が表示される必要はなく、Datevalidの列と連続している必要もありません。

enter image description here

+1

私は追加のヘルパー列を使用しない式で作業していましたが(私はしばしばそれを挑戦の対象とします:P)、このソリューションの+1は非常にきちんとしており、読みやすく理解できるという事実が大好きです:) –

+2

@ASHありがとうございました。私は彼が両方ともExcelソリューションを望んでおり、これを他の人に伝えることは可読性とコンパクト性を優先していると思っていました。 –

+1

ヘルパー列の使用には恥ずべきことはありません。実際、ほとんどのプロジェクトでは、後でトラブルシューティング、説明、監査、およびデバッグを非常に簡単に行うため、人々がヘルパー列を使用することを好むでしょう。スーパーフォーミュラは、それらのすべてのカウントにひどいです。 – SandPiper

関連する問題