0

order typeorder date、およびの 3 つの列を持つスプレッドシートがありtarget ship dateます。USAUSAPriorityCanada、 の4 つの注文タイプがありますMed

各注文タイプは、特定の日付にのみ発送されます。

  • 米国の注文タイプは、注文日から 2 日後に発送できます。
  • 米国プライオリティは、注文日の翌日に発送されます。
  • カナダの注文は、水曜日の午前 11 時 59 分までに受け取った場合、毎週木曜日に発送されます。
  • 火曜日の午前 11 時 59 分までに受け取った場合、Med の注文は毎週水曜日に発送されます。

注文タイプと注文日に基づいて出荷予定日を生成するコードを作成したいと考えています。

4

3 に答える 3

2

次のすべてを単一の列にネストすることもできますが、各ステップで新しい列を想定して、これを段階的に行います。order typecolumn Aorder datecolumn B、 は であるとtarget ship date仮定しますcolumn C

最初に行うことは、有効な注文日を作成することです。これにより、注文日から時間が取り除かれ、出荷時間より遅い場合は 1 日追加されます。これを に入れますcolumn D。それはこのようになります=IF(TIME(HOUR(B2),MINUTE(B2),SECOND(B2))>TIME(11,59,0),DATE(YEAR(B2),MONTH(B2),DAY(B2))+1,DATE(YEAR(B2),MONTH(B2),DAY(B2)))

次に、この式でターゲットを実行できます=IF(A2="USA",B2+2,IF(A2="Med",IF(WEEKDAY(D2)>4,D2+7-WEEKDAY(D2)+4,D2+4-WEEKDAY(D2)),IF(A2="Canada",IF(WEEKDAY(D2)>5,D2+7-WEEKDAY(D2)+5,D2+5-WEEKDAY(D2)),"Invalid")))

編集: 列 D の仕組みの詳細:

この関数は、、およびTIMEの 3 つの引数を取ります。私たちが行っているのは、使用の日付と時刻の値から時間を取得し、それが 11:59am よりも大きい (遅い) かどうかを確認することです。B2 が 11:59 より遅い場合は、date+time の休暇を取得し、1 日を追加して返します。時刻が 11:59 より前の場合は、現在の日付を返します。HourMinuteSecondB2TIME(HOUR(B2),MINUTE(B2),SECOND(B2))TIME(11,59,0)DATE(YEAR(B2),MONTH(B2),DAY(B2))+1

ステートメントのTIME(11,59,0)一部を任意の時間に変更することで、カットオフ時間を変更できます。IF注文タイプが異なる値ごとにカットオフが異なる場合はTIME(11,59,0)IFステートメントでラップします (3 つの可能性があるため、実際には 2 ~ 3 の if ステートメントになります。別の方法として、注文タイプが多数ある場合や、締め切り日は将来変更される可能性があり、ルックアップ テーブルを作成VLOOKUPしてから、式自体に時刻をハード コードする代わりにステートメントを使用できます。

于 2013-06-13T17:32:18.440 に答える
0

VBA ソリューション

このコードをモジュールに挿入し、関数 targetShipDate(orderType, orderDate) を使用して目標出荷日を取得します。

Function targetShipDate(orderType As String, orderDate As Date)
    Select Case orderType
    Case "USA"
        targetShipDate = nextUsaShipDate(orderDate)
    Case "Canada"
        targetShipDate = nextCanadaShipDate(orderDate)
    Case "Med"
        targetShipDate = nextMedShipDate(orderDate)
    Case Else
        targetShipDate = Null
    End Select
End Function

Function nextCanadaShipDate(d As Date)
    nextCanadaShipDate = d - Weekday(d) + 5 + IIf(Weekday(d) >= 5, 7, 0)
    If Weekday(d) = 5 And Hour(d) <= 11 Then
        nextCanadaShipDate = nextCanadaShipDate - 7
    End If
End Function

Function nextMedShipDate(d As Date)
    nextMedShipDate = d - Weekday(d) + 4 + IIf(Weekday(d) >= 4, 7, 0)
    If Weekday(d) = 4 And Hour(d) <= 11 Then
        nextMedShipDate = nextMedShipDate - 7
    End If
End Function

Function nextUsaShipDate(d As Date)
    nextUsaShipDate = d + 2
End Function
于 2013-06-13T18:05:33.713 に答える