Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Excel 2013)
遅延した数量の算出について
投稿日時: 25/03/04 20:15:33
投稿者: ひろまさ

遅延を管理する一覧を作成していますが、アドバイスをお願いしたい事が
ございます。
 
入荷計画に対して、入荷実績がない場合は入荷計画の数量が入荷するまでは
入荷遅延に表示させます。(番号:222222)
また、入荷遅延が発生して、途中に入荷計画の数量が入荷していない場合も、
その数量を加算して、入荷計画の数量が入荷するまで表示させます。
(番号:333333)
 
 
■例
A列   B列   C列  D列  E列  F列  G列・・・
 
番号  状態   3/1  3/2  3/3  3/4  3/5
111111 入荷遅延
111111 入荷計画 300
111111 入荷実績 300
222222 入荷遅延    600  600  300
222222 入荷計画 600
222222 入荷実績           300  300
333333 入荷遅延    100  200
333333 入荷計画 100  100
333333 入荷実績           200
 
ボタンを押下すると「入荷遅延」を表示させたいと考えております。
日付が1年間、番号が10000行を想定しています。
ネットで検索を行ないながら作成をしていますが、上記のような結果作成に
これ以上、先に進まないので、ご質問をさせて頂きました。
 
Dim sh As Worksheet
Er = sh.Cells(Rows.Count, 1).End(xlUp).Row '最終行
Col = sh.Cells(1, 2).End(xlToRight).Column '最終列
Set sh = ThisWorkbook.Sheets("main")
 
For k = 4 To Er Step 3
  For j = 3 To Col
     If sh.Cells(k, j) <> sh.Cells(k - 1, j) Then
        sh.Cells(k - 2, j + 1) = sh.Cells(k - 1, j) - (k, j)
     End If
     If sh.Cells(k, j) = sh.Cells(k - 1, j) Then
        sh.Cells(k - 2, j + 1) = ""
     End If
  Next j
Next k
 
お手数をお掛けしますが、よろしくお願いいたします。

回答
投稿日時: 25/03/04 22:29:32
投稿者: simple

こんばんは。
まず提示いただいたサンプルの内容について質問させていただきます。
(1)

最初の商品の3/1の欄は、当日入荷計画(300)‐当日入荷(300) で遅延が  0 になっています。
だとすると、
次の商品  の3/1は      当日入荷計画(600)‐当日入荷(0)   で遅延が600にならないのですか?
当日の入荷遅延残高の定義を明確にされたらいかがでしょうか。
(2)
また、月初の時点での入荷遅延残高を示す列は要らないのですか?
(3)
マクロでの計算は常に月初からの計算を行うのですか?
それとも、一定のタイミングで、当日の計算だけをすることになりますか?
 
(もし、サンプルについて計算式で対応するとしたどうなるのでしょうか。
まずはそれを作ってから、マクロの作成に入ったほうがよさそうな気がします。)
取り急ぎ、上記の点を明確にしていただけますか?
そのうえで皆さんからのコードに関するコメントを待ってはいかがでしょうか。

投稿日時: 25/03/04 23:29:48
投稿者: ひろまさ

simpleさんお返事ありがとうございます。
また、ご丁寧にご質問を頂きありがとうございます。
ご回答をさせて頂きます。
 
(1)
最初の商品の3/1の欄は、当日入荷計画(300)‐当日入荷(300) で遅延が 0 に
なっています。
だとすると、次の商品 の3/1は当日入荷計画(600)‐当日入荷(0)で遅延が600に
ならないのですか?
当日の入荷遅延残高の定義を明確にされたらいかがでしょうか。
 
 ⇒ 言葉足らずで大変申し訳ございません。
   番号:111111ですが、入荷計画に「300」に対して、入荷実積は「300」です。
   納期通りに入荷されているので、遅延がないので翌日の入荷遅延は空白に
   なります。
   番号:222222ですが、本日が3/2とします。
   前日の入荷計画が「600」に対して入荷実積が「0」という事で、3/2の時点で、
   入荷遅延が「600」と表示するように想定しています。
   もし、入荷実績が「50」の場合は、3/2の時点で入荷遅延は「550」となります。
                                       
(2)
また、月初の時点での入荷遅延残高を示す列は要らないのですか?
 
 ⇒ 年間を通して、この一覧で管理を考えておりますので、月初の時点での
   入荷遅延残高は想定していないです。
 
(3)
マクロでの計算は常に月初からの計算を行うのですか?
それとも、一定のタイミングで、当日の計算だけをすることになりますか?
 
 ⇒ もし、私がご質問の解釈を誤っていたらお詫び申し上げます。
   月初という考え方はしていないです。
   その都度、入荷計画に対して、入荷実積がなければ翌日にその差異を算出して
   入荷遅延に表示をさせたいのです。
   そして、翌日以降に入荷実積があり差異がなくなった時点で表示をなくしたい
   と考えております。
 
誠に恐縮ではございますがよろしくお願いいたします。

投稿日時: 25/03/05 01:20:55
投稿者: ひろまさ

1点申し訳ございません。
最初にご質問で記載させて頂きました一覧で番号:222222、333333ですが、
入荷遅延があり当日に入荷実積があった場合、入荷遅延は前日の数量から
マイナスして表示したいと考えております。(入荷遅延が無い時は空白)
番号:222222の場合、3/4 3/5
番号:333333の場合、3/4
 
よろしくお願いいたします。

回答
投稿日時: 25/03/05 08:27:50
投稿者: simple

質問(2)
年間を通じて1シートで計算し、年度またがりの遅延は無いということですね。
 
質問(3)
コードを拝見すると、C列以降をすべて計算されようとしています。
ということは、年始からその日までも常に洗い替え計算するということですか?
それとも当日の列だけを計算すればよいのですか?という質問でした。
 
その日だけ計算すればよいということですね。
ただし、過去の修正をした場合は、再計算することもありえます、と理解しておきます。
 
質問(1)ですが、
それ以前には入荷が遅延しているものはなく、
3/1に入荷予定が300あったとします。
 
3/1に 200入荷があったら、 3/1の入荷遅延は100ですか?
       10入荷があったら、 3/1の入荷遅延は290ですか?
       入荷がなかったら 3/1の入荷遅延はブランクで、3/2に持ち越されるのですか?
どうしてこのように不連続になるのか理解しかねます。
とすると、3/2は当日の入荷計画、入荷実績だけでなく、前日の状況も見に行かないといけなくなります。
 
その日の状況はその日の入荷遅延情報にすべて反映し、翌日は
「前日の入荷遅延残高(個数)+当日入荷計画 −入荷実績」を 当日の入荷遅延残高(個数)とすれば
よいだけの話だと思いました。
 
3/1の入荷予定300が、3/2に300が入荷されたとしたら、
入荷遅延は3/1も3/2も記入なしなんですね?
入荷全額の1日のズレは遅延とはみなさないということなんですか?
 
当日の入荷は当日の入荷遅延(のマイナス)に反映するのに、
当日入荷されなかったという情報だけが入荷予定日の入荷遅延に反映されない理由がわかりませんでした。
 
私には理解が難しい質問ですので、他の回答者さんの回答をお待ちください。
 
なお、コードについては少なくとも構文エラーが出ないものを提示したほうが印象はよいと思いますよ。

投稿日時: 25/03/05 10:14:47
投稿者: ひろまさ

simpleさんお返事ありがとうございます。
頂いたご質問に対してご回答をさせて頂きます。
  
質問(1)ですが、
それ以前には入荷が遅延しているものはなく、
3/1に入荷予定が300あったとします。
   
3/1に 200入荷があったら、 3/1の入荷遅延は100ですか?
       10入荷があったら、 3/1の入荷遅延は290ですか?
       入荷がなかったら 3/1の入荷遅延はブランクで、3/2に持ち越されるのですか?
どうしてこのように不連続になるのか理解しかねます。
とすると、3/2は当日の入荷計画、入荷実績だけでなく、前日の状況も見に行かないといけなくなります。
  
 ⇒ simpleがおっしゃる通りだと思います。
   しかし、当日に即反映させるのではなく、当日に前日までの入荷遅延を
   確認したいと考えております。
  
3/1の入荷予定300が、3/2に300が入荷されたとしたら、
入荷遅延は3/1も3/2も記入なしなんですね?
入荷全額の1日のズレは遅延とはみなさないということなんですか?
  
 ⇒ simpleがおっしやる通りです。
   翌日に入荷実績がなくても当日に入荷した場合は、入荷遅延の数量から
   マイナスを行ないたいと考えております。
  
イレギュラーな対応のご質問をさせて頂き大変申し訳ございません。
引き続きよろしくお願いいたします。

回答
投稿日時: 25/03/05 10:17:13
投稿者: simple

何を引き続きお願いされているのか不明です。
発言がよく理解できませんので、申し訳ないですが時間を費やす積りはありません。

回答
投稿日時: 25/03/05 10:30:38
投稿者: Suzu

いま掲載のコードを実行したとき
 

	A	B	C	D	E	F	G	H
1	番号	状態	3月1日	3月2日	3月3日	3月4日	3月5日	
2	1	入荷遅延						
3	1	入荷計画	300					
4	1	入荷実績	300					
5	2	入荷遅延		600			-300	-300
6	2	入荷計画	600					
7	2	入荷実績				300	300	
8	3	入荷遅延		100	100		-200	
9	3	入荷計画	100	100				
10	3	入荷実績				200		

上記の様になります。
 
希望の状態と比較したとき
E5,F5,G5,H5
D8,E8,F8
が異なっている状態です。
 
これは、VBA云々の話ではなく、
 入庫遅延業の値の算出方法の計算式に問題がある状態です。
 
VBAではなく、手動一般機能として、数式をセルに入れてみましょう。
それができてから、VBAでそれを自動化しましょう。

回答
投稿日時: 25/03/05 10:35:34
投稿者: Suzu

あ。。状態列の文字数分ずれた様にみえてしまう・・
コピペでExcel に張り付けてみるには、前回のレスの表を。
 

	A	B		C	D	E	F	G	H
1	番号	状態		3月1日	3月2日	3月3日	3月4日	3月5日	
2	1	入荷遅延
3	1	入荷計画	300					
4	1	入荷実績	300					
5	2	入荷遅延		600			-300	-300
6	2	入荷計画	600					
7	2	入荷実績				300	300	
8	3	入荷遅延		100	100		-200	
9	3	入荷計画	100	100				
10	3	入荷実績				200		

WEB上だけでみるにはこちらで

回答
投稿日時: 25/03/05 12:58:28
投稿者: 半平太

当初の希望図に合わせるなら・・
 

Sub test()
    Dim sh As Worksheet
    Dim Er, Col, k As Long, j As Long
    Dim sum計画, sum実績, sum遅延
    Dim rsltLine()
    
    Application.ScreenUpdating = False
    
    Set sh = ThisWorkbook.Sheets("main")
    
    Er = sh.Cells(Rows.Count, 1).End(xlUp).Row '最終行
    Col = sh.Cells(1, 2).End(xlToRight).Column '最終列
    ReDim resltLine(1 To 1, 3 To Col)
    
    For k = 4 To Er Step 3
        sum計画 = Empty
        sum実績 = Empty
        sum遅延 = Empty
        
        For j = 3 To Col
            sum計画 = sum計画 + sh.Cells(k + 1, j)
            sum実績 = sum実績 + sh.Cells(k + 2, j)

            sum遅延 = sum計画 - sum実績 - sh.Cells(k + 1, j) '当日計画値を引けるだけ引く
            resltLine(1, j) = IIf(sum遅延 <= 0, Empty, sum遅延)
        Next j

        sh.Cells(k, "C").Resize(1, Col - 2) = resltLine
    Next k
    
    Application.ScreenUpdating = True
End Sub

投稿日時: 25/03/05 16:21:11
投稿者: ひろまさ

半平太さんお返事ありがとうございます。
また、ご連絡が遅くなった事に対してお詫び申し上げます。
早速、確認をさせて頂きましたが、以下の結果となりました。
 
■実行前
A列   B列   C列  D列  E列  F列  G列・・・
 
番号  状態   3/1  3/2  3/3  3/4  3/5
111111 入荷遅延
111111 入荷計画 300
111111 入荷実績 300
222222 入荷遅延
222222 入荷計画 600
222222 入荷実績           300  300
333333 入荷遅延
333333 入荷計画 100  100
333333 入荷実績           200
 
■実行後
A列   B列   C列  D列  E列  F列  G列・・・
 
番号  状態   3/1  3/2  3/3  3/4  3/5
111111 入荷遅延
111111 入荷計画
111111 入荷実績 300
222222 入荷遅延
222222 入荷計画 600
222222 入荷実績
333333 入荷遅延
333333 入荷計画 100  100
333333 入荷実績
 
■作成したい結果
A列   B列   C列  D列  E列  F列  G列・・・
  
番号  状態   3/1  3/2  3/3  3/4  3/5
111111 入荷遅延
111111 入荷計画 300
111111 入荷実績 300
222222 入荷遅延    600  600  300
222222 入荷計画 600
222222 入荷実績           300  300
333333 入荷遅延    100  200
333333 入荷計画 100  100
333333 入荷実績           200
 
お手数ですが、再度、ご教示をお願いできないでしょうか。
よろしくお願いいたします。

回答
投稿日時: 25/03/05 16:54:34
投稿者: 半平太

レイアウトの行番号が不明なのでミスったかもです。
 
>For k = 4 To Er Step 3
     ↑
そちらのコードでは、「入荷遅延」は4行目からと思っているのですが違いますか?
 
あと、日付は何行目に書かれているんでしょうか?

投稿日時: 25/03/05 17:07:43
投稿者: ひろまさ

半平太さん早々にお返事ありがとうございます。
私が勘違いをしていました。
大変申し訳ございませんでした。
再度、確認をさせて頂いた結果、作成したかった結果が表示
されました。
ありがとうございました。
内容をきちんと理解して、ここからは自身で利用する一覧に
カスタマイズをさせて頂きます。
お忙しいところご教示をして頂きありがとうございました。
simpleさん、Suzuさんお返事を頂きありがとうございました。
ご説明がきちんとできず大変申し訳ございませんでした。