プロが教えるわが家の防犯対策術!

いつもこの場をお借りしてご教授いただいております。

sheetsA(在庫情報と入庫情報が入力されているシートです)
A列 在庫数
B列 受注合計数(sheetsBの受注数量の合計値が表示されています。)
M列 商品名(sheetsBの商品名と同じ)
Y列 ここに結果を入力するためのセルです
※ 複数ロットの入庫予定があるため、1行だけのデータではありません。

sheetsB(受注情報が入力されているシートです)
B列 受注された商品名(sheetsAの商品名と同じ)
C列 受注数量
K列 受注品の納期
※ 1行ごとにお客様からの受注情報があります。
※ 複数の受注を受けているため、1行だけのデータではありません。


○在庫・入荷情報(sheetsAに相当)
みかん(商品名)の在庫数が200個あります。次の入庫予定は4/10です。

◇受注情報(sheetsBに相当)
みかん(商品名)の受注が3/10に80個、3/20に100個、3/30に200個あります。

この時、在庫数200個は3/20の受注までは足りますが、3/30の受注分には足りません。
そのため、4/10の入庫予定を繰り上げなければなりません。

いま計算させて表示させたいのは、在庫数から受注数を引き算して、不足になる日の『3/30から不足』という情報です。

知人のマクロを応用し、エラーが発生しないまでは動作しましたが、上記内容を満たせているマクロプログラムなのかが分かりません。

↓ いま現在のマクロプログラム ↓
Dim i, lastrow, sumQ As Long 'sheetsAの定義
Dim sumC, lastrow2, ii As Long 'sheetsBの定義
 lastrow = Sheets("sheetsA").Range("A400").End(xlUp).Row 'sheetsAの最終行
  lastrow2 = Sheets("sheetsB").Range("A2000").End(xlUp).Row 'sheetsBの最終行
For i = 3 To lastrow
For ii = 15 To lastrow2

'Y列の在庫切れ日時対象
If Sheets("sheetsA").Range("A" & i).Value < Sheets("sheetsA").Range("B" & i).Value Then sumC = Sheets("sheetsA").Range("M" & i).Value And sumC + Val(Sheets("sheetsB").Range("C" & ii).Value) Else sumC = Sheets("sheetsA").Range("A" & i).Value And Val(Sheets("sheetsB").Range("C" & ii).Value)
If sumC > Val(Sheets("sheetsA").Range("A" & i).Value) Then
While Val(Sheets("sheetsA").Range("A" & i + 1).Value) - sumC < 0
Sheets("sheetsA").Range("Y" & i).Value = Sheets("sheetsB").Range("K" & ii).Value & "から不足"
sumC = Sheets("製品発注残一覧").Range("C" & i).Value '製品発注残一覧の受注合計数
ii = ii + 1
Wend
Sheets("sheetsA").Range("Y" & i).Value = Sheets("sheetsB").Range("K" & ii).Value & "から不足"
Sheets("sheetsA").Range("Y" & i).Value = ""

Next
Next

End Sub

よろしくお願いいたします。

質問者からの補足コメント

  • こちらがsheetsAになります。
    商品名ごとに空白行を入れているため、すべての行に必ずデータがあるわけではありませんが、
    空白行以外の行には必ずデータが入っています。

    「変数を使用して、別シートの値の引き算結果」の補足画像1
    No.2の回答に寄せられた補足コメントです。 補足日時:2018/03/21 17:46
  • こちらがsheetsBになります。
    このシートはデータだけのため、空白行はありません。
    N列に関数エラーがありますが、添付するためにデータをコピーするとエラーになりましたが、
    問題ありません。

    「変数を使用して、別シートの値の引き算結果」の補足画像2
      補足日時:2018/03/21 17:49
  • こちらが『sheetsA』になります。
    ”製品発注残一覧”というシートは本来のシート名(sheetsB)で、簡単にするために
    シート名を変更しました。
    ややこしくしてすみません。

    引き続きsheetsBを添付いたします。

    「変数を使用して、別シートの値の引き算結果」の補足画像3
    No.6の回答に寄せられた補足コメントです。 補足日時:2018/03/22 17:23
  • こちらがsheetsBになります。
    まだ小さいでしょうか??

    引き続きよろしくお願いいたします。

    「変数を使用して、別シートの値の引き算結果」の補足画像4
    No.7の回答に寄せられた補足コメントです。 補足日時:2018/03/22 17:26

A 回答 (8件)

プログラムが正しいかどうか確認してくれというのはこのような場ではふさわしくないのではないでしょうか?



仮に大丈夫と回答がついたとしても、誰も責任とってくれませんし。

ここがうまく行かないとか、そういう質問ならいいんでしょうけど。
    • good
    • 0
この回答へのお礼

そうですよね。。。
説明不足ですみません。
改めて質問させていただきます。

お礼日時:2018/03/25 10:13

No6です。


サンプル画像の提示例が漏れました。以下の様な画像が提示されることを期待しています。
(例ではA,B,M,Y列のみですが、ほかにも関連する列があればそれも含めてください)
SheetsB,製品発注残一覧についてもお願いいたします。
「変数を使用して、別シートの値の引き算結果」の回答画像7
この回答への補足あり
    • good
    • 0

補足要求です。



①画像が小さいのでよく状況がつかめません。
私の添付画像(例)のように、今回のマクロで関連する列のみを表示すれば、もっと鮮明にレイアウトが判るかと思われます。
(関係ない列は非表示にします)
そのようにして、SheetsA、SheetsBを再提示していただけませんでしょうか。


>みかん(商品名)の受注が3/10に80個、3/20に100個、3/30に200個あります。
>この時、在庫数200個は3/20の受注までは足りますが、3/30の受注分には足りません。
>そのため、4/10の入庫予定を繰り上げなければなりません。
①と同様に画像が小さいので、状況がよくわかりません。

③”製品発注残一覧”というシートも使用されているようですが、これについてのレイアウトの提示もお願いします。


>Y列 ここに結果を入力するためのセルです
Y列には、どのような結果を入力したいのでしょうか?
この回答への補足あり
    • good
    • 0

No.4 の訂正



「ただし罫線などが先にひかれているとそこまで使われていると判断されてしまいます。」の一行は不要でした。
申し訳ございません「SpecialCells(xlCellTypeLastCell)」の時と混同していました。
    • good
    • 0
この回答へのお礼

とんでもございません。
間違えていただいたおかげで、2通りの使い方を理解しました。

大変お手数をおかけしますが、引き続きよろしくお願いいたします。

お礼日時:2018/03/21 18:25

No.3 のお礼について



使われているセルを探してその行番号を返しますので狭めても時間は変わりません。もし時間が変わるならばデータを落としているはずです。
一般的には最終行指定などせず「Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row」などが使われます。
ただし罫線などが先にひかれているとそこまで使われていると判断されてしまいます。
    • good
    • 0
この回答へのお礼

なるほど。
そんなことまで知りませんでした。
では安全策として、データの範囲を指定せず、ご指摘いただいたとおりに変更させていただきます。
ありがとうございます。

お礼日時:2018/03/21 18:08

No.1 のお礼についてのヒント



☆「lastrow = Sheets("sheetsA").Range("A400").End(xlUp).Row」について
これの意味はA列の400行目(実際には400行は入らない)から上に向かって使われているセルを探してその行番号を「lastrow」に代入します。つまり400行以降のデータは無視されます。

☆「lastrow2 = Sheets("sheetsB").Range("A2000").End(xlUp).Row」
これの意味はA列の2000行目(実際には2000行は入らない)から上に向かって使われているセルを探してその行番号を「lastrow2」に代入します。つまり2000行以降のデータは無視されます。
    • good
    • 0
この回答へのお礼

ご連絡ありがとうございます。
私も同じ解釈をしておりましたので、その点は問題ありません。

範囲を広げすぎると、マクロ処理に時間がかかったため、範囲を狭めました。

引き続きよろしくお願いいたします。

お礼日時:2018/03/21 17:51

もう一つ確認ですが


① 「sheetsA」に必ずデータが有るのは本当にA列でしょうか?M列ではないでしょうか?
② 「sheetsB」に必ずデータが有るのは本当にA列でしょうか?B列ではないでしょうか?
この回答への補足あり
    • good
    • 0

確認しますが


①「sheetsA」は399行までしかデータは無いのですか?
②「sheetsB」は1999行までしかデータは無いのですか?
    • good
    • 0
この回答へのお礼

連絡ありがとうございます。
データ量は多少前後しますが、sheetsAは200行程度、sheetsBは2,000前後まであります。
2,500行を超えることはありません。

よろしくお願いいたします。

お礼日時:2018/03/21 17:24

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!