|
▼ma さん:
こんばんは。
>どうもありがとうございました。
>さらにお聞きしたいのですが、算出した日数から休日(たとえば土日、祝日、長期休暇)を除いて実際にかかった日数を出すにはどうしたらいいのでしょうか。
そっか、稼働日ってそういう意味なんですね?(最初に気づくべきでした)
私の案は、後述するとして・・・、
>(ここで稼働日カレンダーが出てきます。)
>下記のように書いてみたんですが「0」が入るだけなのです・・・
↑沢山、間違いがありそうですよ!!
>
> i = 2
> Do Until Worksheets("data").Cells(i, 1).Value = ""
> A = Worksheets("data").Cells(i, 2).Value '受注日
> B = Worksheets("data").Cells(i, 3).Value '到着日
> C = Worksheets("data").Cells(i, 4).Value '納品日
>
>
> TTL = 0
> SW = "ON"
> n = 2
' ↑で初期化してしまうと下でn=n+1している意味がなくなってしまいませんか?
Do Until SW = "OFF" Or WD = ""
' ↑この前でWDに値を設定しないとループ内に制御が移りませんよ
> WD = Worksheets("稼働日").Cells(n, 1).Value
> WDF = Worksheets("稼働日").Cells(n, 2).Value
>
> If WD = A Then
> Do Until SW = "OFF"
> If WD = L Then
' ↑このLって、何でしょう?
' もし、WD=Aの条件に合致して、入ってきてしまったら
' このループから抜けられるんでしょうか?
> SW = "OFF"
> Else
> If WDF <> "" Then
> TTL = TTL + 1
> n = n + 1
> Else
> n = n + 1
> End If
> End If
> Loop
> Else
> n = n + 1
> End If
> Loop
> Worksheets("LT").Cells(i, 2).Value = TTL
> i = i + 1
> Loop
他にもあるかもしれません(いえ、あると思います)。
こういうコードも解法もひとつですから
もう一度考えてみて下さい。
ワークシート関数にNETWORKDAYSという関数があるのですが、
使えると思いますが・・・。
この関数は、
「開始日から終了日までの期間に含まれる稼動日の日数を返します。稼動日とは、土曜、日曜、および指定された祭日を除く日のことです。」
Helpより。
NETWORKDAYS関数の例として、
前述したように、
>受注NO、受注日、到着日、納品日がそれぞれA列〜D列の1行目(1行目が項目、
2行目以降がデータ)にあったとして、
仮にG列の1行目から非稼働日を入力しておきます。
9月の例だと
G1に 2004/9/20 ---- 敬老の日
G2に 2004/9/23 ---- 秋分の日
というように土日を除いた祝日や休暇の年月日を指定します。
(実際には、1/1からの非稼働日を列挙します)
これで、セルE2には(到着日〜納品日の稼働日として)、
「=NETWORKDAYS(C2,D2,$G$1:$G$2)」
という数式を指定すると、
稼働日数が得られます。
この方法が利用できませんか?
と、ここまで記述して気になったのは、
「土日でも稼働日の場合がある」
という場合ですね。
この場合は、先のG列に土日の日付けも入れて
非稼働日リストを作成します。
9月の例でG列に以下のようにG1〜G10に指定します。
2004/9/4
2004/9/5
2004/9/11
2004/9/12
2004/9/18
2004/9/19
2004/9/20
2004/9/23
2004/9/25
2004/9/26
で、E2の数式は、
「=D2-C2+1-SUMPRODUCT(($G$1:$G$10>=C2)*($G$1:$G$10<=D2))」
で稼働日数を表示します。
カレンダー方式とは違いますが、検討してみて下さい。
|
|