- ベストアンサー
VBAコマンドボタンを使用して在庫を管理する方法
- 花.xlsのシート1には、花の種類と本数が記載されています。VBAのコマンドボタンを押すと在庫.xlsのA列とB列に花の名前を1つにまとめて、合計の本数を書き出します。
- 質問者は、花2.xlsにも同様の情報があるため、VBAのコマンドボタンをクリックすると在庫.xlsのC列に本数を追加したいと考えています。花の名前がすでに存在する場合は、C列に本数を追加し、存在しない場合はA列に花の名前を追加して本数を書き加えます。
- 質問者は、watabe007さんのアドバイスを参考にして在庫管理機能を実装しました。具体的な詳細なコードの説明は提供されていませんが、質問者は応用することができると述べています。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
別案 Private Sub CommandButton1_Click() Dim sh1 As Worksheet, sh2 As Worksheet Dim c As Range, myR As Variant Set sh1 = Workbooks("在庫.xls").Worksheets("Sheet1") Set sh2 = Workbooks("花2.xls").Worksheets("Sheet1") For Each c In sh2.Range("A1", sh2.Cells(Rows.Count, "A").End(xlUp)) myR = Application.Match(c.Value, sh1.Columns(1), 0) If Not IsError(myR) Then sh1.Cells(myR, "C").Value = sh1.Cells(myR, "C").Value + c.Offset(, 1).Value Else With sh1.Cells(Rows.Count, "A").End(xlUp) .Offset(1).Value = c.Value .Offset(1, 2).Value = c.Offset(, 1).Value End With End If Next End Sub
その他の回答 (3)
- watabe007
- ベストアンサー率62% (476/760)
在庫.xls A列のバラ、ひまわり、欄 と 花2.xls A列のバラ、ひまわり、欄 が違う文字列と処理されています どちらかに スペースなどが入っていませんか?
- watabe007
- ベストアンサー率62% (476/760)
補足説明 在庫.xlsのA列の品名のみ取得します ここでA列に重複する品名があると正しい結果が表示されませんので要注意!! With Workbooks("在庫.xls").Worksheets("Sheet1") For Each c In .Range("A1", .Cells(Rows.Count, "A").End(xlUp)) myDic(c.Value) = Empty Next End With 在庫.xlsで得た品名に花2.xlsの品名、数量を加算しています。 With Workbooks("花2.xls").Worksheets("Sheet1") For Each c In .Range("A1", .Cells(Rows.Count, "A").End(xlUp)) myDic(c.Value) = myDic(c.Value) + c.Offset(, 1).Value Next End With With Workbooks("在庫.xls").Worksheets("Sheet1") 在庫.xlsのA列に品名を転記 .Range("A1").Resize(myDic.Count).Value = Application.Transpose(myDic.Keys) 在庫.xlsのC列に数量を転記 .Range("C1").Resize(myDic.Count).Value = Application.Transpose(myDic.Items) End With オブジェクトmyDicの開放 Set myDic = Nothing
お礼
watabe007さん 大変お世話になってます! お教え頂いたものを試しているのですが、こちらではうまく行きません。 やっていることは、 花2.xlsに以下の情報が入っています。 A列 B列 カーネーション 6 バラ 2 椿 3 カーネーション 2 欄 6 菊 2 椿 5 ひまわり 9 バラ 3 そして借用させて頂いたVBAのコマンドボタンを付け 在庫.xlsには A列 B列 バラ 7 コスモス 12 ひまわり 5 欄 3 が既に入っています。 ここでコマンドボタンを押すと以下のようになり うまく行きません。 バラ 7 コスモス 12 ひまわり 5 欄 3 カーネーション 8 バラ 2 椿 8 欄 6 菊 2 ひまわり 9 バラ 3 わたしが望んでいるのは、 A列 B列 C列 バラ 7 5 コスモス 12 ひまわり 5 9 欄 3 6 カーネーション 8 椿 8 菊 2 のように花の名前が重複することなく既に花xlsにある花の名前があればそのC列に数を記入し、無い名前のものはA列の末尾に花の名前を追加し、そのC列に数を記入していく感じです。 何かこちらのミスがあるのでしょうか? 何卒お付き合いの程お願い致します
- watabe007
- ベストアンサー率62% (476/760)
どうぞ~ Private Sub CommandButton1_Click() Dim myDic As Object Dim c As Range Set myDic = CreateObject("Scripting.Dictionary") With Workbooks("在庫.xls").Worksheets("Sheet1") For Each c In .Range("A1", .Cells(Rows.Count, "A").End(xlUp)) myDic(c.Value) = Empty Next End With With Workbooks("花2.xls").Worksheets("Sheet1") For Each c In .Range("A1", .Cells(Rows.Count, "A").End(xlUp)) myDic(c.Value) = myDic(c.Value) + c.Offset(, 1).Value Next End With With Workbooks("在庫.xls").Worksheets("Sheet1") .Range("A1").Resize(myDic.Count).Value = Application.Transpose(myDic.Keys) .Range("C1").Resize(myDic.Count).Value = Application.Transpose(myDic.Items) End With Set myDic = Nothing End Sub
お礼
watabe007さん おっしゃるとおり、スペースが入っていました、 そしてスペースを取り除き同じ文字列にすることでうまく行きました。 感動しました。 watabe007さんのコードは大変シンプルでスッキリしてかっこよく見えます。 大変ありがとう御座いました、 心から感謝しています。