Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


11065 / 13644 ツリー ←次へ | 前へ→

【18191】日数を数えたいのですが・・・ ma 04/9/17(金) 18:09 質問[未読]
【18194】Re:日数を数えたいのですが・・・ ichinose 04/9/17(金) 19:12 発言[未読]
【18304】Re:日数を数えたいのですが・・・ ma 04/9/21(火) 9:36 回答[未読]
【18313】Re:日数を数えたいのですが・・・ UW 04/9/21(火) 11:24 回答[未読]
【18316】Re:日数を数えたいのですが・・・ ichinose 04/9/21(火) 12:17 回答[未読]
【18327】Re:日数を数えたいのですが・・・ ma 04/9/21(火) 15:37 質問[未読]
【18352】Re:日数を数えたいのですが・・・ ichinose 04/9/21(火) 20:40 回答[未読]
【18362】Re:日数を数えたいのですが・・・ ma 04/9/22(水) 9:01 お礼[未読]

【18191】日数を数えたいのですが・・・
質問  ma  - 04/9/17(金) 18:09 -

引用なし
パスワード
   こんにちは。
早速ですが教えてください。
ワークシートが3つ(data,kadou,nissuu)あります。
dataには注番、受注日、到着日、納品日のデータが入っています。
kadouには稼働日カレンダーが入っています。
(稼働日カレンダー:A列に1年間の日付、B列に稼働日は1を、休日は空白を入力してあります。)
注番ごとに受注日〜到着日、到着日〜納品日の日数を出して、nissuuシートに入るようにします。
単純に日数を計算することはできたのですが、稼働日だけで日数を出すことがどうしてもできません。
どのようにしたらよいか教えていただけますでしょうか。

【18194】Re:日数を数えたいのですが・・・
発言  ichinose  - 04/9/17(金) 19:12 -

引用なし
パスワード
   ▼ma さん:
こんばんは。


>早速ですが教えてください。
>ワークシートが3つ(data,kadou,nissuu)あります。
>dataには注番、受注日、到着日、納品日のデータが入っています。
>kadouには稼働日カレンダーが入っています。
>(稼働日カレンダー:A列に1年間の日付、B列に稼働日は1を、休日は空白を入力してあります。)
>注番ごとに受注日〜到着日、到着日〜納品日の日数を出して、nissuuシートに入るようにします。
>単純に日数を計算することはできたのですが、稼働日だけで日数を出すことがどうしてもできません。
>どのようにしたらよいか教えていただけますでしょうか。
具体例があると、はっきりするのですが・・・。
kadouシートの「B列に稼働日は1」となっているのですよね?
この「1」の数を数えると言う事ですか?

そうではなかったならば、シートの具体例(数値や日付けなど)をあげて頂き、
結果がこういう結果がほしいという主旨を記述して下さい。

【18304】Re:日数を数えたいのですが・・・
回答  ma  - 04/9/21(火) 9:36 -

引用なし
パスワード
   >具体例があると、はっきりするのですが・・・。
>kadouシートの「B列に稼働日は1」となっているのですよね?
>この「1」の数を数えると言う事ですか?
>
>そうではなかったならば、シートの具体例(数値や日付けなど)をあげて頂き、
>結果がこういう結果がほしいという主旨を記述して下さい。

おはようございます。
言葉が足りなかったようですみません。

日付データは下記のように入っています。
受注日と到着日が前後することもあります。
受注NOごとに受注日〜到着日、到着日〜納品日の日数を出したいのです。
稼働日に「1」をいれてその数を数えるという方法しか浮かばなかったので、そのようにやってみましたが
他に「こうやった方がいい」という方法がありましたら合わせて教えていただけますでしょうか。
あまりスキルがないもので、とんちんかんなことを書いてしまうかもしれませんが
よろしくお願いいたします。

受注NO 受注日      到着日    納品日
H007  2004/8/16 2004/8/21    2004/8/22
H009  2004/7/28 2004/8/23    2004/8/20
H010      2004/8/23 2004/8/20    2004/8/30   
H011      2004/7/20 2004/8/23    2004/8/24
H012      2004/7/30 2004/8/23    2004/8/24
H013      2004/8/20 2004/8/23    2004/8/24   
H014      2004/8/2  2004/8/20    2004/8/21
H015      2004/7/30 2004/8/23    2004/8/23
H016      2004/8/23 2004/8/23    2004/8/25   
H018      2004/8/23 2004/8/20    2004/8/21

【18313】Re:日数を数えたいのですが・・・
回答  UW  - 04/9/21(火) 11:24 -

引用なし
パスワード
   DateDiff 関数は調べられました?

【18316】Re:日数を数えたいのですが・・・
回答  ichinose  - 04/9/21(火) 12:17 -

引用なし
パスワード
   UW さん、maさん、こんにちは。

受注NO、受注日、到着日、納品日がそれぞれA列〜D列の1行目(1行目が項目、
2行目以降がデータ)にあったとして、

例えばE2には 「=D2-C2」もしくは、「=D2-C2+1」
とすれば、到着日〜納品日の日数になります。
(但し、セルE2の書式は、数値に設定しておいてから確認してください)

【18327】Re:日数を数えたいのですが・・・
質問  ma  - 04/9/21(火) 15:37 -

引用なし
パスワード
   どうもありがとうございました。
さらにお聞きしたいのですが、算出した日数から休日(たとえば土日、祝日、長期休暇)を除いて実際にかかった日数を出すにはどうしたらいいのでしょうか。
(ここで稼働日カレンダーが出てきます。)
下記のように書いてみたんですが「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
    Do Until SW = "OFF" Or 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
            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

【18352】Re:日数を数えたいのですが・・・
回答  ichinose  - 04/9/21(火) 20:40 -

引用なし
パスワード
   ▼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))」

で稼働日数を表示します。


カレンダー方式とは違いますが、検討してみて下さい。

【18362】Re:日数を数えたいのですが・・・
お礼  ma  - 04/9/22(水) 9:01 -

引用なし
パスワード
   どうもありがとうございました。
チャレンジしてみます!
またよろしくお願いします。
(ずうずうしくてすみません・・・)

11065 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free