[[20220202171657]] 『入荷日の早い材料から出荷引き当てしたい』(モンスリール) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『入荷日の早い材料から出荷引き当てしたい』(モンスリール)

エクセルで材料管理をするための箱を作っています。
過去ログを見てみましたが該当する質問が見つかりませんでした。

【Sheet1】入荷明細

        A            B        C       D            E                F            G
1  材料番号     成分     色    大きさ     入荷日         仕入数   仕入価格
2     100        A00     赤       大     2021/11/5       100       100円
3     101        A00     赤       大     2021/11/15      50        120円
4     102        A00     赤       大     2021/12/10     200       80円

【Sheet2】出荷明細

        A            B        C        D            E                F            G
1  材料番号     成分      色    大きさ     出荷日         出荷数   出荷価格
2     ___        A00      赤       大     2021/12/5        30       200円
3     ___        A00      赤       大     2021/12/15      80       180円
4     ___        A00      赤       大     2021/12/25      50       250円

Sheet2のB列〜F列を入力すると、引き当てされる材料番号が自動的にSheet1から参照されるようにしたいです。先入れ先出しの考え方で、「古い材料→新しい材料の順番に引き合て」の単純な動きです。(例外なし)

Sheet1, Sheet2ともにB列〜D列の情報を&結合したものをH列に入れています。材料番号の参照自体はH列をもとにXLOOKUPで出来ますが、入荷日の早い順にする数式の組み方が分かりません。やりたいことは次の2つです。

?@仕入数から出荷数を差し引いたあまりが>0なら次に古い材料番号へ飛ぶ
?A2つ以上の材料番号が該当する場合は引き当て量が多い方の材料番号が使われる

数式・マクロどちらでも大丈夫です。(マクロは初心者ですが勉強中です)
どうか皆様のお知恵をお貸しください。よろしくお願いします。

< 使用 Excel:Office365、使用 OS:Windows10 >


【Sheet2】出荷明細の材料番号はどうなればいいのですか。
成分、色、大きさ 全て同じなのにどうして材料番号が違うのですか。
(?) 2022/02/02(水) 19:23

返信ありがとうございます。

材料番号を変えている理由は、仕入価格が違う材料は成分、色、大きさが同じでも別個の材料としたいからです。これは管理表の目的の1つとして、各材料から作られた商品の目標販売価格がいくらになるかを示す必要があるためです。(例えば材料1から作られた商品Aと材料2から作られた商品A'は同じ商品ですが、材料1と材料2の仕入価格が違うため目標販売価格は違う)

本来は"材料番号"とするのは却って分かりづらいかもしれませんが、材料1つ1つを区別するために敢えて材料番号としてつけています。他に区別する良い方法があれば材料番号は削除しても構いません。

Sheet2の出荷明細の材料番号は、例えば以下のようになることが希望です。

【Sheet1】入荷明細

        A            B        C       D            E                F            G
1  材料番号     成分     色    大きさ     入荷日         仕入数   仕入価格
2     100        A00     赤       大     2021/11/5       100       100円
3     101        A00     赤       大     2021/11/15      50        120円
4     102        A00     赤       大     2021/12/10     200       80円

【Sheet2】出荷明細

        A            B        C        D            E                F            G
1  材料番号     成分      色    大きさ     出荷日         出荷数   出荷価格
2     100        A00      赤       大     2021/12/5        30       200円 ※11/5の仕入数100個の内30個引当
3     100        A00      赤       大     2021/12/15      80       180円 ※↑の残りの70個引当(10個は11/15の仕入が引当されるが数が少ないので材料番号は100でOK)
4     101        A00      赤       大     2021/12/25      50       250円 ※11/15仕入分の残り40個引当(10個は12/10の仕入が引当される)
(モンスリール) 2022/02/02(水) 22:32

 【Sheet1】入荷明細についてお聞きします。							
 下記のように、材料番号が違う記載があるのですよね?							

    |[A]     |[B] |[C]|[D]   |[E]       |[F]   |[G]     							
 [1]|材料番号|成分|色 |大きさ|入荷日    |仕入数|仕入価格							
 [2]|     100|A00 |赤 |大    |2021/11/5 |   100|100円   							
 [3]|     100|A00 |赤 |大    |2021/11/15|    50|120円   							
 [4]|     100|A00 |赤 |大    |2021/12/10|   200|80円    							
 [5]|     105|A05 |青 |中    |2021/11/5 |   100|100円   							
 [6]|     105|A05 |青 |中    |2021/11/10|    50|90円    							

 もし、上記のようなテーブルを							
 【Sheet2】出荷明細へ、下記のように表示させるのはどうなのでしょうか?							

    |[A]     |[B] |[C]|[D]   |[E]       |[F]   |[G]     |[H]       |[I]   |[J]     |[K]       							
 [1]|材料番号|成分|色 |大きさ|入荷日    |仕入数|仕入価格|出荷日    |出荷数|出荷価格|有効在庫数							
 [2]|     100|A00 |赤 |大    |2021/11/5 |   100|100円   |2021/12/5 |    80|200円   |        20							
 [3]|     105|A05 |青 |中    |2021/11/5 |   100|100円   |2021/12/5 |    50|200円   |        50							
 [4]|     105|A05 |青 |中    |2021/11/10|    50|90円    |2021/12/15|    30|180円   |        20							
 [5]|     100|A00 |赤 |大    |2021/11/15|    50|120円   |2021/12/16|    20|240円   |        30							
 [6]|     100|A00 |赤 |大    |2021/12/10|   200|80円    |2021/12/25|   150|160円   |        50							

 >入荷日の早い順にする数式の組み方が分かりません。

 入荷日の早い日付けの順番にはできます。							

 >Sheet2のB列〜F列を入力すると、引き当てされる材料番号が自動的にSheet1から参照されるようにしたいです。							

 B列〜F列を入力すると言う考えをやめて、A列をプルダウンで選択するだけで...【Sheet1】入荷明細の							
 B列〜G列(対象の材料行)の内容を、【Sheet2】出荷明細へ反映させる事とするのはどうなんでしょうか?							

 出荷数の入力は、勿論することになりますが…在庫数が一目瞭然となり良いかな?と思うのですが…							

 >他に区別する良い方法があれば材料番号は削除しても構いません。							

 材料番号は、認識を明確にする為には…あった方が良いと思います。							

 >?@仕入数から出荷数を差し引いたあまりが>0なら次に古い材料番号へ飛ぶ							
 >?A2つ以上の材料番号が該当する場合は引き当て量が多い方の材料番号が使われる							

 ここの言ってる内容が理解し難いですが…【Sheet2】出荷明細からさらに抽出をかけて							
 フィルターですればできますが…解除をするのが手間なので関数でしますが							

 【Sheet3】へ有効在庫数シートとして…各材料の成分を検索値にして							
 材料番号の閲覧を簡単に切り替えて抽出し…有効在庫数の多い材料がすぐに解るように							
 はできるかなと思います。							

 抽出例							

    |[A]     |[B] |[C]|[D]   |[E]       |[F]   |[G]     |[H]       |[I]   |[J]     |[K]       |[L]|[M]     |[N]     							
 [1]|材料番号|成分|色 |大きさ|入荷日    |仕入数|仕入価格|出荷日    |出荷数|出荷価格|有効在庫数|   |材料抽出|過剰在庫							
 [2]|     100|A00 |赤 |大    |2021/11/5 |   100|100円   |2021/12/5 |    80|200円   |        20|   |A00     |      50							
 [3]|     100|A00 |赤 |大    |2021/11/15|    50|120円   |2021/12/16|    20|240円   |        30|   |        |        							
 [4]|     100|A00 |赤 |大    |2021/12/10|   200|80円    |2021/12/25|   150|160円   |        50|   |        |        							

 ※M2=入力を切替して全ての材料番号を【Sheet2】出荷明細から抽出します。							

 最後に上記の内容は、関数でほぼします。							

 メリット							
 B列〜D列を入力する手間がない							

 デメリット							
 【Sheet1】入荷明細のA列の、材料番号に重みを付けるので							
 少し探すのに手間だが、B列〜D列を入力するよりは楽かなと思います。							
 ※【Sheet1】入荷明細のA列の表示形式を切り替えするのに...少しだけVBAを利用します。							

 テーブルのレイアウトを変更できないのなら、他の回答者の提案をお待ちください。							

(あみな) 2022/02/03(木) 10:34


あみな様
返信ありがとうございます。

ご提案いただいた仕組みは、材料番号を起点に仕入〜出荷までを管理するということですね。有効在庫数、過剰在庫数まで管理表で見えるようになれば大変助かります。

一つ懸念しているのは、たとえば商品Aを生産するにあたり、現状はどの材料番号の材料が使われたか現場が把握していない(色、成分、大きさは分かるが入荷日・仕入価格までは追跡できない)ということです。ご指摘のとおり、本来はB列〜D列の入力が一番面倒で省略すべきと思うのですが、実際はE列〜G列が一番厄介という妙な現象が起きています。このため、A列を手動でプルダウン選択するのは難しいかもしれません。

テーブルのレイアウトに制約はありませんので変更は可能です。
(モンスリール) 2022/02/03(木) 13:39


 質問を十分理解していなくて間違っているかもしれませんが、

 Sheet2で、作業列を使っていいなら、

 	[A]		[B]	[C]	[D]	[E]		[F]	[G]		[H]
 [1]	材料番号	成分	色	大きさ	出荷日		出荷数	出荷価格	作業列
 [2]	100		A00	赤	大	2021/12/5	30	200円		  0
 [3]	100		A00	赤	大	2021/12/15	80	180円		100
 [4]	101		A00	赤	大	2021/12/25	50	250円		150
 [5]	102		A00	赤	大	2021/12/26	70	190円		350

 H2に、=SUM(Sheet1!$F$1:F1) 
 A2に、=INDEX(Sheet1!A:A,MATCH(SUM($F$1:F1),H:H,1))

 と入力してそれぞれ下にコピーでこんな感じですが、やりたいことができてますでしょうか。
 作業列は、Sheet1のデータ行数以上の行分をコピーしてください。。
   
(自信なし) 2022/02/03(木) 14:23

 質問は1種類の在庫についての話ですけど、実際にそんな単純な話なのですか?
 もし複数種の話なら、最低でも2種類のサンプルがあった方がいいです。

 出荷明細がすらすらと出来上がったという想定のようですが、
 出荷日に出荷数以上の在庫があるのかちゃんとチェックされているんですか?
 それはどうやっているんですか?
 少なくともそれを見極められるだけの情報がどこかになかったら
 そんなに易々と出荷明細なんて作れない気がするんですがねぇ。

 一旦、出荷明細が出来上がってやれやれとなった後で、
 緊急出荷依頼が割り込んできたらどう対処しているんですか?
 そんな依頼は受け付けないって方針なんですか?

 >A2つ以上の材料番号が該当する場合は引き当て量が多い方の材料番号が使われる
 これって本当なんですか?
 材料番号ってそんなテキトーなものなんですか?
 常識的には、何番が何個、何番が何個と言う明細を把握してないと、
 その日の出荷作業だってやりにくいし、
 更に次の出荷明細を作る上においても支障があるような気がするんですがねぇ。。
 そもそも次の出荷明細って、今までできていたのとは別に作るんですか?
 それとも、今までのに追記していく方式なんですか?

 まぁ、実際にこれまでの方法で仕事ができているので、
 何らかの対処法は編み出されているんでしょうが、
 当初の質問が解決したら万事めでたしになる状況とはとても思えないです。

(半平太) 2022/02/03(木) 19:42


回答しようにも謎の部分が多数に感じたので控えめにしていました。
半平太さんに一票します。
(?) 2022/02/03(木) 20:45

自信なし様
返信ありがとうございます。

教えていただいた関数を入れてみましたが、1種類目の材料については正しい材料番号が表示されますが2種類目以降は成分、色、大きさが対応しない材料番号が表示されてしまいます。実際の管理表では材料の種類が多岐にわたるため、数量のみに着目すると材料種類が変わったタイミングで行がずれてきてしまうためと思われます。

こちらの説明不足で大変申し訳ございません。
(モンスリール) 2022/02/04(金) 10:03


半平太様
返信ありがとうございます。

ご指摘いただいた内容はまさにその通りだと思います。できるだけシンプルに状況説明しようとしたせいで言葉足らずとなり、却って皆様の混乱を招いてしまいました。大変申し訳ございません。

冒頭でこの管理表は「材料管理をするための箱」と書きましたが、正しくは「材料を正しく引き当てた場合の実績管理のための箱」なのです。このため、この管理表の材料在庫数は実際の材料在庫数と紐づいていません。仮に現場で材料の先入れ先出しが徹底された場合、当初予定した材料購入計画は適正か、価格は妥当かを見るためのツールとして使います。

>質問は1種類の在庫についての話ですけど、実際にそんな単純な話なのですか?
材料を構成する要素は成分、色、大きさの3種類です。成分と大きさは各20種類、色は5種類あり、この組み合わせによって生産できる商品が変わります。実際の明細は↓のようなイメージになります。

【Sheet1】入荷明細

        A            B        C       D            E                F            G
1  材料番号     成分     色    大きさ     入荷日         仕入数   仕入価格
2     100        A00     赤       大     2021/11/5       200       100円
3     101        A00     赤       中     2021/11/7       100       120円
4     102        A03     青       大     2021/11/10     120         90円
5     103        A04     青       小     2021/11/15     100       200円
6     104        A02     緑       中     2021/11/16     150       180円

【Sheet2】出荷明細

        A            B        C        D            E                F            G
1  材料番号     成分      色    大きさ     出荷日         出荷数   出荷価格
2     ___        A00      赤       大     2021/12/5        30       200円
3     ___        A03      青       大     2021/12/6        50       180円
4     ___        A00      赤       中     2021/12/15      80       250円
5     ___        A00      赤       大     2021/12/17      80       220円
6     ___        A02      緑       中     2021/12/18      50       230円
7     ___        A04      青       小     2021/12/20      80       300円

>出荷日に出荷数以上の在庫があるのかちゃんとチェックされているんですか?それはどうやっているんですか?
商品の有効在庫数、材料在庫数は生産現場でシステム管理されています。材料は入荷時に数量、仕様などの情報が入荷明細に登録されますが、管理番号はつきません。サンプルで示している「材料番号」は箱を作るために創作したものです。なお、商品は品番毎に管理されています。

>材料番号ってそんなテキトーなものなんですか?
実際は材料番号という概念がありません。入荷された後は成分、色、大きさ毎に管理されます。

>次の出荷明細って、今までできていたのとは別に作るんですか?
今までのものは継続で使いつつ、↑の箱も併用していきます。

色々と説明不足で申し訳ありませんでした。
(モンスリール) 2022/02/04(金) 12:15


 >材料番号の参照自体はH列をもとにXLOOKUPで出来ますが、入荷日の早い順にする数式の組み方が分かりません。やりたいことは次の2つです。

 上記に記載がある、入荷日の早い順にする数式の組み方が分かりません。
 は、いったいなんだったんですかね?

 入荷日を現場が管理していなかったら、先入れ先出しによって、仕入れ材料の長期滞留による品質低下を防げませんよね。

 に加えて、【Sheet2】出荷明細に、出荷日と使用した個数を現場が管理してるだけなら
 仕入れ単価による...出荷価格の設定は、無理ですよね。
 
 元々、仕入れた時点で、売値は決定されてますしね。

(あみな) 2022/02/04(金) 13:19


あみな様
説明が分かりづらくて申し訳ございません。

>入荷日を現場が管理していなかったら、先入れ先出しによって、仕入れ材料の長期滞留による品質低下を防げませんよね。
入荷日は大雑把(作業員が倉庫を見てなんとなく時期が分かる程度)にしか分かりません。材料に使用期限が無く、滞留期間は長くても半年程度なので品質低下のリスクはありません。

>出荷日と使用した個数を現場が管理してるだけなら仕入れ単価による...出荷価格の設定は、無理ですよね。
現場ではできるだけ古い材料から使うようにしてはいますが、徹底されていませんし担当者任せになっています。今の体制でこれを体系的に管理するのは難しいので、実際の材料の動きとは違ったとしても全て材料が先入れ先出しされたと仮定して、材料と商品を無理やり紐づけた箱を作りたいのです。

>仕入れた時点で、売値は決定されてますしね。
その通りです。材料価格と売値の関係が見えるものが何もないので、今回ご相談した箱を作りました。

やりたいことは変わっていません。
【Sheet2】出荷明細のA列に入荷日の早い順(古い材料→新しい材料)に対応する材料が割り当てられるようにしたいです。
(モンスリール) 2022/02/04(金) 16:43


箱というのがイメージできませんが
実際の数量が、何万個というオーダーだと時間がかかるもしれません。

 Option Explicit

 Sub test()
    Dim dicIn As Object, dicOut As Object
    Dim r As Range, v
    Dim k As Long, j As Long
    Dim spec As String, no As String, mx As Long

    Set dicIn = CreateObject("scripting.dictionary")
    Set r = Sheets("Sheet1").Cells(1).CurrentRegion

    v = r.Value
    For k = 2 To UBound(v)
        spec = v(k, 2) & vbTab & v(k, 3) & vbTab & v(k, 4)
        If Not dicIn.exists(spec) Then
            Set dicIn(spec) = CreateObject("system.collections.queue")
        End If
        no = v(k, 1)
        For j = 1 To v(k, 6)
            dicIn(spec).enqueue no
        Next
    Next

    Set dicOut = CreateObject("scripting.dictionary")
    Set r = Sheets("Sheet2").Cells(1).CurrentRegion

    v = r.Value
    For k = 2 To UBound(v)
        spec = v(k, 2) & vbTab & v(k, 3) & vbTab & v(k, 4)
        mx = 0
        dicOut.RemoveAll
        v(k, 1) = dicIn(spec).peek
        For j = 1 To v(k, 6)
            no = dicIn(spec).dequeue
            dicOut(no) = dicOut(no) + 1
            If mx < dicOut(no) Then
                v(k, 1) = no
                mx = dicOut(no)
            End If
        Next
    Next
    r.Value = v

 End Sub

(マナ) 2022/02/04(金) 17:16


マナ様
返信ありがとうございます。

コードを実行したところ、「v(k, 1) = dicIn(spec).peek」の箇所に"実行時エラー424 オブジェクトが必要です"のエラーが出ました。原因を調べて色々やってみましたが、恥ずかしながら修正方法が分かりません。大変申し訳ありませんが、直し方を教えていただけないでしょうか。
(モンスリール) 2022/02/04(金) 22:58


2022/02/04(金) 12:15のサンプルデータで確認しています。
本来、在庫不足とならないデータが前提なので
途中でExut Subしたほうがよいかもしれません。

 Sub test2()
    Dim dicIn As Object, dicOut As Object
    Dim r As Range, v
    Dim k As Long, j As Long
    Dim spec As String, no As String, mx As Long
    Dim stock As Long

    Set dicIn = CreateObject("scripting.dictionary")
    Set r = Sheets("Sheet1").Cells(1).CurrentRegion

    v = r.Value
    For k = 2 To UBound(v)
        spec = v(k, 2) & vbTab & v(k, 3) & vbTab & v(k, 4)
        If Not dicIn.exists(spec) Then
            Set dicIn(spec) = CreateObject("system.collections.queue")
        End If
        no = v(k, 1)
        For j = 1 To v(k, 6)
            dicIn(spec).enqueue no
        Next
    Next

    Set dicOut = CreateObject("scripting.dictionary")
    Set r = Sheets("Sheet2").Cells(1).CurrentRegion

    v = r.Value
    For k = 2 To UBound(v)
        spec = v(k, 2) & vbTab & v(k, 3) & vbTab & v(k, 4)
        mx = 0
        dicOut.RemoveAll
        On Error Resume Next
        stock = 0
        stock = dicIn(spec).Count
        On Error GoTo 0
        If stock < v(k, 6) Then
            v(k, 1) = "在庫不足"
        Else
            v(k, 1) = dicIn(spec).peek
            For j = 1 To v(k, 6)
                no = dicIn(spec).dequeue
                dicOut(no) = dicOut(no) + 1
                If mx < dicOut(no) Then
                    v(k, 1) = no
                    mx = dicOut(no)
                End If
            Next
        End If
    Next
    r.Value = v

 End Sub

(マナ) 2022/02/05(土) 09:06


マナ様
早々とありがとうございます。コードを実行してみた所、希望していた順番で材料番号が表示されました。

材料番号が切り替わるタイミングで"在庫不足"と出るようにしていただいていますが、在庫不足になったら次に古い材料番号が表示される"という動きにすることは可能でしょうか。例えば、入荷日が2021/11/5に200個仕入れた材料が在庫不足になったら2021/11/25に追加入荷した100個の材料番号を割り当てる、というイメージです。
(モンスリール) 2022/02/05(土) 12:18


文章だけでなく、サンプルデータを提示して説明お願いします。
Sheet2のA列は、空欄でなく期待する結果にしてください。

(マナ) 2022/02/05(土) 12:31


マナ様
説明不足で申し訳ありません。以下のような結果を得るにはどうすればよいか教えていただけますでしょうか。

【Sheet1】入荷明細

	A	B	C	D	E		F	G
1	材料	成分	色	大きさ	入荷日		入荷数	仕入価格
2	100	A00	赤	大	2021/11/5	200	\100
3	101	A00	赤	中	2021/11/7	100	\120
4	102	A03	青	大	2021/11/10	120	\90
5	103	A04	青	小	2021/11/15	100	\200
6	104	A02	緑	中	2021/11/16	150	\180
7	105	A00	赤	大	2021/11/25	100	\120 ←追加仕入れ分
8	106	A03	青	大	2021/11/30	100	\100 ←追加仕入れ分

【Sheet2】出荷明細

	A	B	C	D	E		F	G
1	材料	成分	色	大きさ	出荷日		出荷数	出荷価格
2	100	A00	赤	大	2021/12/5	50	\200
3	102	A03	青	大	2021/12/6	100	\180
4	101	A00	赤	中	2021/12/15	80	\250
5	100	A00	赤	大	2021/12/17	150	\220 ←11/5入荷分の在庫が0になる
6	102	A03	青	大	2021/12/22	20	\200 ←11/10入荷分の在庫が0になる
7	104	A02	緑	中	2021/12/18	50	\230
8	105	A00	赤	大	2021/12/20	80	\180 ←11/25入荷分を割り当て
9	106	A03	青	大	2021/12/22	20	\150 ←11/30入荷分を割り当て

(モンスリール) 2022/02/05(土) 18:14


こちらでは期待通りの結果になりますが?

(マナ) 2022/02/05(土) 18:38


マナ様
改めてコードを実行してみた所、今度は欲しい結果を得られました。悩んでいたので本当に助かりました。ありがとうございました。
(モンスリール) 2022/02/05(土) 22:55

 こんにちは!
解決済ですけど、面白そうなのでちょっと書いてみました。
今は一番最後に使った材料の番号にしてます。
でも、一番多く使った材料の方がいいのかなと思ってそのコードも書いてます。
コメントしている部分のコメントを外すと一番多く使われた材料になるはずです?(^^;
ちょっと検証不足なので駄目な時があるかもしれません。
その時は、、、あきらめてください。。。(笑)
では、、では、、、

 Option Explicit
Sub てすと()
Dim MyDic As Object
Dim n As Variant
Dim k As Variant
Dim x As Variant
Dim y As Variant
Dim z As Variant
Dim xx As Variant
Dim 材料番号 As Variant
Dim i As Long
Dim ii As Long
Dim j As Long
Dim ki As Long
Dim ni As Long
Dim 回数 As Long
Dim 出荷Flg As Boolean
ReDim n(0)
ReDim 材料番号(0)
Set MyDic = CreateObject("Scripting.Dictionary")
With Sheets("Sheet1")
    y = .Range("A2", .Range("A" & Rows.Count).End(xlUp)).Resize(, 8).Value
End With
QuickSort y, 5, LBound(y, 1), UBound(y, 1)
For i = LBound(y, 1) To UBound(y, 1)
    x = Application.Transpose(Application.Index(y, i, 0))
    n(UBound(n)) = x
    ReDim Preserve n(UBound(n) + 1)
    材料番号(UBound(材料番号)) = Array(y(i, 1), 0)
    ReDim Preserve 材料番号(UBound(材料番号) + 1)
Next
ReDim Preserve n(UBound(n) - 1)
ReDim Preserve 材料番号(UBound(材料番号) - 1)
ReDim k(0)
z = Sheets("Sheet2").Range("A1").CurrentRegion.Resize(, 8).Value
For i = LBound(z, 1) + 1 To UBound(z, 1)
    xx = Application.Transpose(Application.Index(z, i, 0))
    xx(1, 1) = Empty
    k(UBound(k)) = xx
    ReDim Preserve k(UBound(k) + 1)
Next
ReDim Preserve k(UBound(k) - 1)
For ki = LBound(k) To UBound(k)
    出荷Flg = False
    xx = k(ki)
    For ni = LBound(n) To UBound(n)
        x = n(ni)
        If x(5, 1) <= xx(5, 1) Then
            If (x(2, 1) & x(3, 1) & x(4, 1)) = (xx(2, 1) & xx(3, 1) & xx(4, 1)) Then
                If Not MyDic.exists(xx(2, 1) & xx(3, 1) & xx(4, 1)) Then
                    MyDic(xx(2, 1) & xx(3, 1) & xx(4, 1)) = Array(x(1, 1), 0)
                End If
                If x(6, 1) > 0 Then
                    If x(6, 1) >= xx(6, 1) Then
                        x(6, 1) = x(6, 1) - xx(6, 1)
                        回数 = xx(6, 1)
                        材料番号(ni)(1) = 回数
                        xx(1, 1) = 材料番号(ni)(0)
                        '-----今まで一番多く使われた材料ならコメントを外す---------------------
                        If MyDic(xx(2, 1) & xx(3, 1) & xx(4, 1))(1) < 回数 Then
                            MyDic(xx(2, 1) & xx(3, 1) & xx(4, 1)) = Array(x(1, 1), 回数)
                        End If
                        xx(1, 1) = MyDic(xx(2, 1) & xx(3, 1) & xx(4, 1))(0)
                        '-------------------------------------------------------------
                        xx(6, 1) = 0
                        xx(8, 1) = Empty
                        出荷Flg = True
                        n(ni) = x
                        k(ki) = xx
                        Exit For
                    Else
                        xx(6, 1) = xx(6, 1) - x(6, 1)
                        回数 = x(6, 1)
                        材料番号(ni)(1) = 回数
                        xx(1, 1) = 材料番号(ni)(0)
                        MyDic(xx(2, 1) & xx(3, 1) & xx(4, 1)) = Array(x(1, 1), 回数)
                        x(6, 1) = 0
                        n(ni) = x
                    End If
                Else
                    MyDic(xx(2, 1) & xx(3, 1) & xx(4, 1)) = Array(x(1, 1), 0)
                End If
            End If
        End If
    Next
    If 出荷Flg = False Then
        z(ki + 2, 8) = "未出荷 " & xx(6, 1)
    Else
        z(ki + 2, 8) = Empty
    End If
Next
For i = LBound(z, 1) + 1 To UBound(z, 1)
    z(i, 1) = k(i - 2)(1, 1)
Next
Sheets("Sheet2").Range("A1").Resize(UBound(z, 1), UBound(z, 2)).Value = z
Set MyDic = Nothing
Erase n, k, x, y, z, xx, 材料番号
End Sub
Private Sub QuickSort(MySAry As Variant, ByVal MySKey As Long, ByVal MySLeft As Long, ByVal MySRight As Long)
Dim MySMid As Double
Dim i As Long, j As Long, n As Long
Dim MySLBound As Long, MySUBound As Long
Dim MyStmp As Variant
MySLBound = LBound(MySAry, 2)
MySUBound = UBound(MySAry, 2)
MySMid = MySAry((MySLeft + MySRight) \ 2, MySKey)
i = MySLeft
j = MySRight
    Do
        Do While MySAry(i, MySKey) < MySMid
            i = i + 1
        Loop
        Do While MySAry(j, MySKey) > MySMid
            j = j - 1
        Loop
        If i >= j Then Exit Do
        For n = MySLBound To MySUBound
            MyStmp = MySAry(i, n)
            MySAry(i, n) = MySAry(j, n)
            MySAry(j, n) = MyStmp
        Next
        i = i + 1
        j = j - 1
    Loop
If MySLeft < i - 1 Then QuickSort MySAry, MySKey, MySLeft, i - 1
If MySRight > j + 1 Then QuickSort MySAry, MySKey, j + 1, MySRight
End Sub
すみません。使い切った時にディクショナリーを更新しなといけませんでした。m(__)m
2022/02/06 17:13
(SoulMan) 2022/02/06(日) 13:06

SoulMan様
返信ありがとうございます。
コメントを外したコードで期待した結果を得ることができました。早速活用させていただきます!
自分ももっとVBAを勉強してコードを使いこなせるように頑張ります。本当にありがとうございました。
(モンスリール) 2022/02/07(月) 15:42

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.