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

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

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

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

マクロ

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

Q&A

解決済

1回答

292閲覧

コンボボックスの内容を検索し、該当セルの個数を変えたい

nisvbv

総合スコア2

VBA

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

マクロ

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

0グッド

0クリップ

投稿2022/01/19 06:21

編集2022/01/19 06:22

お世話になっております。

今在庫管理のマクロを組んでおり、UserForm内のコンボボックス(製品名のコンボボックスは1~5,部品名は6~10)に、製品名・部品名を入力すると『在庫』シートの該当在庫数が+1されるようにしたいです(例えば、〇〇製品の部品Aが入力されたらその在庫数を+1する)。

『在庫』シートに
B列…製品名
C・E・G列…部品名、その隣にそれぞれの在庫数
が記入されています(下記図ご参照いただければと思います)。

B列C列D列E列F列G列H列
〇〇製品部品A在庫数部品B在庫数部品C在庫数
部品AA在庫数部品BB在庫数部品CC在庫数
部品AAA在庫数部品BBB在庫数部品CCC在庫数
B列C列D列E列F列G列H列
××製品部品A在庫数部品B在庫数部品C在庫数
部品AA在庫数部品BB在庫数部品CC在庫数
部品AAA在庫数部品BBB在庫数部品CCC在庫数
B列C列D列E列F列G列H列
△△製品部品A在庫数部品B在庫数部品C在庫数
部品AA在庫数部品BB在庫数部品CC在庫数
部品AAA在庫数部品BBB在庫数部品CCC在庫数

※製品の名前は変わりますが、部品名はすべて同じです。
製品名だけ違う表が複数あるとイメージしていただければと思います。

Private Sub CommandButton1_Click() Dim cb1 As ComboBox, cb2 As ComboBox For n = 1 To 5 Set cb1 = Me.Controls("ComboBox" & n) Set cb2 = Me.Controls("ComboBox" & (n + 5)) Set seihin = Sheets("在庫").Range("B:B").SpecialCells(xlCellTypeConstants) Set buhin = Sheets("在庫").Range("C:C,E:E,G:G").SpecialCells(xlCellTypeConstants) Dim w1 As Range For Each w1 In seihin If cb1.ListIndex > -1 And cb2.ListIndex > -1 Then Dim s As String s = w1.Value Dim c As Range For Each c In buhin If Not w1 Is Nothing Then If cb2.Value = c.Value And cb1.Value = s Then c.Offset(0, 1).Value = c.Offset(0, 1).Value + 1 Else Exit Sub Exit For End If End If Next End If Next Next End Sub

エラーは出ないのですが、一つめの表(シートの一番上の表)しか処理されず困っています(二つ目以降の表は入力しても変化なし)。
どうすればすべての表に適用されるかご教授いただけますと幸いです。

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

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

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

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

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

guest

回答1

0

おそらくですが...
Exit SubExit Forが連続して書かれている部分がかなり気になりますね👀
どちらも正しくないのではないかな?...と思います。
「一番上の表だけしか処理されない」のではなく、「一番上に置いてある表しか処理していない」プログラムになっていないでしょうか?一番上の表を一つ下にずらすだけで、どこにもカウントされないのでは?

少し失礼な表現かもしれませんが、独創的なマクロですね💦
for each文は確かに便利ですが今回の例にはあまり適さない気もします。
Rangeオブジェクトは基本的に複数のセルに同時に処理をかけたい場合に使います。
そのRangeからfor eachで一つずつ取り出すのならRangeを使う必要性はあまりなさそうです。

ひとまず私ならこう作るな~というのを書いておきますね^^
追記で質問があるならまた質問してください。

その前に...

For文の途中で処理をやめて、For文の先頭に行きたい!という場合...(ほかの言語ではContinueといいます)
VBAにはContinue文というものがないので、goto文を使うしかないのですが...

VBA

1'偶数だけ出力したいとする(イミディエイトウインドウに出力されます) 2'Subは省略 3Sub Test() 4 for i = 0 to 10 5 if i mod 2 = 1 then goto ContinueFor1 '奇数なのでContinue 6 console.debug i 7ContinueFor1: 8 next i 9End Sub

みたいにすれば奇数の時だけconsole.debug iは実行されません。
goto ContinueFor1ContinueFor1ラベルに処理が移動するからです。
(まぁ...この例ならContinue使う必要はありませんが💦)

私の実装

同じ名前の製品が複数あったら複数の表に+1されます。
部品シートに配置されている表が1000列よりも下にあるなら、MaxRowの値を増やしてください。
即興で作っただけなので、実行速度はまったく気にしていません。
速度を気にするなら、「A製品が部品シートの上から何番目にあるか?」という情報をあらかじめExcelのシートで計算させておいて、その情報をもとにマクロで実行するなどの方がよいと思います。
それと、ここでは詳しく述べませんが、計算設定が「自動計算」のままマクロでセルの値を変更すると遅くなる場合もあります(数式が多い場合)。その場合はマクロ実行時だけ「手動計算」に切り替えるマクロを書くことをお勧めします(方法は検索ですぐ出てきます)。
本当はCommandButtonとかComboBoxの名前も変更したいですが、互換性のためにそのままにしておきます。

※動作確認はしていないのですいません

VBA

1Private Sub CommandButton1_Click() 2 Const MaxRow = 1000 '在庫シートの1000列目まで検索 3 Dim TargetSheet as Sheet 4 Set TargetSheet = Sheets("在庫") 5 6 Dim CbSeihin As ComboBox, CbBuhin As ComboBox 7 Dim n As Integer 8 For n = 1 To 5 9 Set CbSeihin = Me.Controls("ComboBox" & n) 10 Set CbBuhin = Me.Controls("ComboBox" & (n + 5)) 11 12 if CbSeihin < 0 or CbBuhin < 0 then goto ContinueFor1 13 14 Dim i As Long 15 Dim row As Long, col As Long 16 For row = 1 to MaxRow 17 if TargetSheet.Cells(row, "B") = CbSeihin.Value then 18 i = row 19 do 20 for col = 0 to 4 step 2 21 if TargetSheet.Cells(i, "C").Offset(0, col) = CbBuhin.Value then 22 TargetSheet.Cells(i, "C").Offset(0, col + 1) = TargetSheet.Cells(i, "C").Offset(0, col + 1) + 1 23 end if 24 next col 25 i= i + 1 26 loop while TargetSheet.Cells(i, "B") = "" 27 '同じ製品名の表がない保証がある場合は以下のコードを有効にすれば速くなります 28 'Exit For 29 end if 30 Next row 31ContinueFor1: 32 Next n 33End Sub

参考になれば幸いです^^

投稿2022/01/19 09:28

HiraKazu1124

総合スコア322

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

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

nisvbv

2022/01/20 07:26

試してみたところ、ほしかった動作になりました。 ご丁寧なご指摘・ご回答誠にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問