質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

1回答

1055閲覧

VBA 別シートが変更されたら表の在庫数を減らしたい

nisvbv

総合スコア2

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

0クリップ

投稿2022/01/06 02:54

編集2022/01/07 03:13

前提・実現したいこと

Excelにて部品在庫管理のマクロをくんでいます。

『在庫』シートに在庫の表があり、B列に商品名、C/E/G/I列に商品の部品名・D/F/H/J列にそれぞれの部品の在庫数が記載されています。(商品の部品列が分けられているのは部品種類別の分類用です)
また『入荷履歴』シートB列に商品名、D列に部品名、F列に使用日付入力欄があります。

『入荷履歴』シートのF列・使用日付欄に日付を入力し、コマンドボタンを押したら『在庫』シートの表の該当する商品名の部品在庫を-1するマクロを組みたいです。(使用日付が入力されていない場合は引き算の処理をしない)

『在庫』シートの表は商品ごとに形式は変わらず(商品名・部品名・部品在庫数の列は変わらない)、また商品名は変わりますが各部品名は変わりません。

発生している問題・エラーメッセージ

With buhinkensaku~の部分が黄色くなり、オブジェクト変数またはWithブロック変数が設定されていませんとエラーが出ます。

該当のソースコード

Sub 入荷履歴_ボタン2_Click() Dim hizuke As Range Dim syouhin As Range Dim buhin As Range Dim syouhinkensaku As Range Dim buhinkensaku For Each hizuke In Sheets("入荷履歴").Range("F:F") Set syouhin = Sheets("在庫").Range("B:B") Set buhin = Sheets("在庫").Range("C:C,E:E,G:G,I:I") If hizuke.Value <> "" Then Set syouhinkensaku = syouhin.Find(what:=hizuke.Offset(0, -4), lookat:=xlWhole) If Not syouhinkensaku is Nothing Then Set buhinkensaku = buhin.Find(what:=hizuke.Offset(0, -2), lookat:=xlWhole) With buhinkensaku.Offset(0, 1) .Value= .Value - 1 End With End If End If Next End Sub

ネットで色々検索してみたのですがよくわからず。。。
ネット知識をつなぎ合わせたコードなのでぐちゃぐちゃだと思いますが、ご教授いただければと思います。

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

<修正>
在庫シートでの商品の確認方法を変更してみました。

VBA

1Sub 入荷履歴_ボタン2_Click() 2 Dim buhin As Range 3 Set buhin = Sheets("在庫").Range("C:C,E:E,G:G,I:I").SpecialCells(xlCellTypeConstants) 4 5 Dim hizuke As Range 6 7 For Each hizuke In Intersect(Sheets("入荷履歴").UsedRange, Sheets("入荷履歴").Range("F:F")) 8 If hizuke.Value <> "" Then 9 Dim s As String, b As String 10 s = hizuke.Offset(0, -4).Value 11 b = hizuke.Offset(0, -2).Value 12 13 Dim c As Range, syouhin As Range 14 15 For Each c In buhin 16 Set syouhin = c.Offset(0, 2 - c.Column) 17 If syouhin.Value = "" Then Set syouhin = syouhin.End(xlUp) 18 If c.Value = b And syouhin.Value = s Then 19 c.Offset(0, 1).Value = c.Offset(0, 1).Value - 1 20 Exit For 21 End If 22 Next 23 End If 24 Next 25End Sub 26

別の方法として、「まず該当商品を検索して、その行から次の商品の行の手前までをbuhinの範囲にする」とする手もあるかと思います。(その方が処理は速いかもしれません。)

VBA

1Sub 入荷履歴_ボタン2_Click() 2 Dim hizuke As Range 3 Dim syouhin As Range 4 Dim buhin As Range 5 Dim syouhinkensaku As Range 6 Dim buhinkensaku As Range 7 8 For Each hizuke In Sheets("入荷履歴").Range("F:F") 9 Set syouhin = Sheets("在庫").Range("B:B") 10 Set buhin = Sheets("在庫").Range("C:C,E:E,G:G,I:I") 11 12 If hizuke.Value <> "" Then 13 Set syouhinkensaku = syouhin.Find(what:=hizuke.Offset(0, -4), lookat:=xlWhole) 14 If Not syouhinkensaku Is Nothing Then 15 Dim startRow, endRow 16 startRow = syouhinkensaku.Row 17 If syouhinkensaku.Offset(1).Value = "" Then 18 endRow = syouhinkensaku.End(xlDown).Row - 1 19 Else 20 endRow = startRow 21 End If 22 Set buhin = Intersect(Sheets("在庫").Range(startRow & ":" & endRow), buhin) 23 24 Set buhinkensaku = buhin.Find(what:=hizuke.Offset(0, -2), lookat:=xlWhole) 25 If Not buhinkensaku Is Nothing Then 26 With buhinkensaku.Offset(0, 1) 27 .Value = .Value - 1 28 End With 29 Else 30 MsgBox "buhinkensaku Is Nothing" 31 End If 32 End If 33 End If 34 Next 35End Sub 36

投稿2022/01/06 13:30

編集2022/01/07 04:32
jinoji

総合スコア4585

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nisvbv

2022/01/07 00:33

ご回答ありがとうございます。 試してみたのですが、うまく作動せず… エラーは出ないのですが計算もされないといった感じです。 自分なりにもう少しいじってみます。
jinoji

2022/01/07 00:36

B列は空白の行もありますか?
nisvbv

2022/01/07 03:15

表のほうにはあります。 わかりにくい質問で申し訳ありません。画像を追加いたしました。 表は商品名だけ異なり、部品名・形式は同じものが複数存在すると考えていただければと思います。
nisvbv

2022/01/10 01:27

返信遅くなり申し訳ありません。 思った通りの動きができました! まことにありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問