Excel VBA質問箱 IV

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

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


591 / 13645 ツリー ←次へ | 前へ→

【79542】基準日の変更 T-K 17/12/24(日) 0:46 質問[未読]
【79543】Re:基準日の変更 γ 17/12/24(日) 1:16 発言[未読]
【79544】Re:基準日の変更 T–K 17/12/24(日) 7:28 質問[未読]
【79545】Re:基準日の変更 γ 17/12/24(日) 10:42 回答[未読]
【79546】Re:基準日の変更 T-K 17/12/24(日) 15:31 お礼[未読]
【79547】Re:基準日の変更 γ 17/12/24(日) 21:00 発言[未読]
【79548】Re:基準日の変更 T-K 17/12/24(日) 22:44 発言[未読]
【79549】Re:基準日の変更 γ 17/12/24(日) 23:32 発言[未読]
【79554】Re:基準日の変更 T–K 17/12/25(月) 20:52 お礼[未読]
【79555】Re:基準日の変更 γ 17/12/25(月) 21:57 発言[未読]

【79542】基準日の変更
質問  T-K  - 17/12/24(日) 0:46 -

引用なし
パスワード
   いつも利用させていただいています。


稼働日 稼働日 稼働日 休み 休み 休み
 100      ←100    ←100(基準日)

基準日が休みに数量が入力されていると仮定して直前の稼働日に基準日
を変更しさらにきめられた日数を前にした日にちを求めたい
のですが求めたところが稼働日だったり休みの時があるため、
日にちが安定して出力されません
どういう処理をしたら処理できるか教えてください。
ユーザー定義関数をつかったサンプルがあったので少しだけ変更して
見ましたが、最後シリアル値を利用して差引しているだけなので
休みは省きたいのですができません。
できればこれを少し変えた方法で処理ができればいいのですが・・・・
ご教授のほどよろしくお願いします。

Function myDay(stDay As Range, myVal As Long, myAry As Range) 'stDay=納期 ,myVal=リードタイム,MyAry=定休日データ
Dim i As Long, j As Long, K As Long '変数 iをLong型 jをLong型に宣言
i = 1 '変数 iに1を代入
K = 0


Do Until j = myVal 'リードタイムが0まで繰り返し処理


 If WorksheetFunction.CountIf(myAry, stDay) = 1 And WorksheetFunction.CountIf(myAry, stDay - i) = 0 Then
 
 myDay = stDay - i - (j + K + 1)


j = j - 1
K = K + 1


Else

If WorksheetFunction.CountIf(myAry, stDay - i) = 0 Then 'Countif関数で、
myDay = stDay - i


j = j - 1


End If
End If


  i = i + 1

Loop
End Function

【79543】Re:基準日の変更
発言  γ  - 17/12/24(日) 1:16 -

引用なし
パスワード
   何をされたいのかさっぱり分かりません。
具体的な例で説明してください。

【79544】Re:基準日の変更
質問  T–K  - 17/12/24(日) 7:28 -

引用なし
パスワード
   休みの日に注文が入る場合休みに納品ができないため、直前の稼働日に納品します。それを納品するための加工するリードタイムを踏まえた日を求めたいですが現状求めた値が稼働日ならいいのですが休みの日になってしまいます説明がわかりにくく申し訳ありません。

【79545】Re:基準日の変更
回答  γ  - 17/12/24(日) 10:42 -

引用なし
パスワード
   具体的な例を示すと言うことは例えばこんなことです。

休日テーブルは下記のとおりとする
  A列
1 2017/12/2
2 2017/12/3
3 2017/12/9
4 2017/12/10
5 2017/12/16
6 2017/12/17
7 2017/12/23
8 2017/12/24
9 2017/12/28
10 2017/12/29

希望納期 2017/12/28 は休日であった。
実際の納期は、それの直前の稼働日である 27 になる。
リードタイムを3日とすると、
さらに3日遡った稼働日である、22日となる。

21
22    ←求める日
23 休日
24 休日
25
26
27    ← 納期
28 休日  ← 希望納期

------------------
仮に以上のようなことだとすると、以下のコードでどうか。
微修正はそちらで願いたい。
(B1セルに 2017/12/28 が入力されているとします)

Sub test()
  Dim myAry As Range
  
  Set myAry = Range("A1:A10")
  Debug.Print myDay(Range("B1"), 3, myAry) '→ 2017/12/22 が出力される
End Sub
Function myDay(stDay As Range, myVal As Long, myAry As Range) As Date
  'stDay = 納期希望日
  'myVal = リードタイム
  'MyAry = 定休日データ
  
  Dim k As Long, j As Long
  Dim 納期 As Date
  Dim d As Date
  
  d = stDay.Value
  
  '(1)直前の稼働日を納期とする
  k = 0
  Do
    If WorksheetFunction.CountIf(myAry, d - k) = 0 Then
      納期 = d - k
      Exit Do
    End If
    k = k + 1
  Loop
  
  '(2) リードタイムの考慮
  k = 1
  Do
    If WorksheetFunction.CountIf(myAry, 納期 - k) = 0 Then
      j = j + 1
      If j = myVal Then
        myDay = 納期 - k
        Exit Function
      End If
    End If
    k = k + 1
  Loop
End Function

【79546】Re:基準日の変更
お礼  T-K  - 17/12/24(日) 15:31 -

引用なし
パスワード
   回答ありがとうございました

一部参考にさせていただきそのまま動く所はそのままにして
動かした結果希望の処理ができました。

*説明が悪く申し訳ありません
今度利用するときは、具体的に説明できるようにいたします。

お手数をおかけしました。

【79547】Re:基準日の変更
発言  γ  - 17/12/24(日) 21:00 -

引用なし
パスワード
   参考までに最終形をアップしていただきたい。

【79548】Re:基準日の変更
発言  T-K  - 17/12/24(日) 22:44 -

引用なし
パスワード
   Function myDay(stDay As Range, myVal As Long, myAry As Range)
Dim i As Long, j As Long, K As Long '変数 iをLong型 jをLong型に宣言
Dim 納期 As Date
Dim d As Date
d = stDay.Value


 'stDay=納期希望日
 'myVal=リードタイム
 'MyAry=定休日データ


Do
If WorksheetFunction.CountIf(myAry, d - K) = 0 Then
納期 = d - K


Exit Do
End If
K = K + 1
Loop


i = 1
Do Until j = myVal

If WorksheetFunction.CountIf(myAry, 納期 - i) = 0 Then 'Countif関数で、
myDay = 納期 - i


j = j - 1


End If


  i = i + 1

Loop

そのままでも使えるのは拝見していてわかりましたが、
アプローチがちがうだけで求めている処理は同じところは少し修正して
そのまま使用しました。
求めたい処理はわかってもそれを流れで考えてコードにするのは
むずかしいです
ほんとにありがとうございました。

【79549】Re:基準日の変更
発言  γ  - 17/12/24(日) 23:32 -

引用なし
パスワード
   ご苦労さまです。

そのコードで本当に結果が得られていますか?
j はドンドン減っているから、いつまで経っても終了条件を満たさないと
思いますが。

それと、きちんとインデントをつけるべきです。
一丁目一番地、初歩の初歩ですよ。
頑張ってください。

# 回答から学んでいないんだなあ。残念!

【79554】Re:基準日の変更
お礼  T–K  - 17/12/25(月) 20:52 -

引用なし
パスワード
   何回か動作確認
していますので問題
ありません
また教えてください

【79555】Re:基準日の変更
発言  γ  - 17/12/25(月) 21:57 -

引用なし
パスワード
   投稿する場合は、コードをまるまるこちらにコピーペイストしてください。
こちらに手打ちで入力していませんか? (j = j + 1 じゃないのか。)
そして、インデントをきちんとつけてください。
この2点、厳守してください。
返事はいらないです。

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