• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:同じ名前があれば数値のみ追加、無ければ名前と数値を追加 )

VBAコマンドボタンを使用して在庫を管理する方法

このQ&Aのポイント
  • 花.xlsのシート1には、花の種類と本数が記載されています。VBAのコマンドボタンを押すと在庫.xlsのA列とB列に花の名前を1つにまとめて、合計の本数を書き出します。
  • 質問者は、花2.xlsにも同様の情報があるため、VBAのコマンドボタンをクリックすると在庫.xlsのC列に本数を追加したいと考えています。花の名前がすでに存在する場合は、C列に本数を追加し、存在しない場合はA列に花の名前を追加して本数を書き加えます。
  • 質問者は、watabe007さんのアドバイスを参考にして在庫管理機能を実装しました。具体的な詳細なコードの説明は提供されていませんが、質問者は応用することができると述べています。

質問者が選んだベストアンサー

  • ベストアンサー
  • watabe007
  • ベストアンサー率62% (476/760)
回答No.3

別案 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)
回答No.4

在庫.xls A列のバラ、ひまわり、欄 と 花2.xls A列のバラ、ひまわり、欄 が違う文字列と処理されています どちらかに スペースなどが入っていませんか?

pcguard55
質問者

お礼

watabe007さん おっしゃるとおり、スペースが入っていました、 そしてスペースを取り除き同じ文字列にすることでうまく行きました。 感動しました。 watabe007さんのコードは大変シンプルでスッキリしてかっこよく見えます。 大変ありがとう御座いました、 心から感謝しています。

全文を見る
すると、全ての回答が全文表示されます。
  • watabe007
  • ベストアンサー率62% (476/760)
回答No.2

補足説明 在庫.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

pcguard55
質問者

お礼

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)
回答No.1

どうぞ~ 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

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 花の思考・・・

    ●バラや椿の花はとても美しいですが、花は自分は美しいと知っているからあんなに華やかになるのでしょうか、花や植物も何かしら考えることができるのかも。(向日葵の種、食べたことありますか・・・)

  • もし、父の日に花をあげるとしたら、どんな花にする?

    母の日はカーネーションですね! じゃあ父の日はどんな花なのか・・・ちょっと調べたら、赤いバラ、亡くなっている場合は墓前に白いバラなのだそうです。 また、ひまわりという話もあるみたいです。 さて皆さんは、今度の父の日、もし花をあげるとしたらどんな花にしますか? バラですか?

  • VBA DictionaryオブジェクトのItemについての質問です。

    エクセル2000です。 A列からE列までの1行から最終行不特定の表があります。 A列はすべて文字列で、B~Gは数値、E列は文字列です。 A列の文字列には重複があります。 この表を別シートにA列の重複がない表として作成したいと思います。 その際、列が重複する場合にはB~G列は合計数値、E列は文字列を結合させます。 Dictionaryオブジェクトを用い、A列データをKey、B~E列データを配列でItemとして下記のコードを書きました。 このコードで目的は達成しました。 質問はKeyが重複する場合、B~E列のデータを配列として取り込んだItemに次のB~E列のデータを加算あるいは結合する方法の簡略化です。 このコードではItem内の配列データを、さらに配列変数のmyArに代入して、要素ごとにForNextで回しましたが、配列変数にわざわざ代入しなくとも出来る方法があるかどうかが知りたいのです。 あるいはまったく別な方法でもかまいません。 ご教示いただければ幸いです。 Sub ItemsTest() Dim myDic As Object, ns As Worksheet '変数宣言 Dim c As Range, cc As Range, i As Integer Dim myAr Set myDic = CreateObject("Scripting.Dictionary") 'myDicを用意 For Each c In Range(Cells(1, "A"), Cells(Rows.Count, "A").End(xlUp)) 'A列の各データについて If Not myDic.exists(c.Value) Then 'myDicになければ myDic.Add c.Value, Array(c.Offset(0, 1).Value, c.Offset(0, 2).Value, c.Offset(0, 3).Value, c.Offset(0, 4).Value) '追加しB~E列データを配列でItemに Else 'myDicにあれば myAr = myDic(c.Value) 'Itemを配列myArに For i = LBound(myAr) To UBound(myAr) myAr(i) = myAr(i) + c.Offset(0, i + 1).Value '配列の要素ごとに加算 Next i myDic(c.Value) = myAr '配列myArをItemにもどす End If Next c '繰り返し Set ns = Worksheets.Add(After:=ActiveSheet) 'シートを追加 ns.Range("A1").Resize(myDic.Count, 1).Value = Application.Transpose(myDic.Keys) 'A列にKeyデータ転記 For Each cc In ns.Range("A1:A" & myDic.Count) cc.Offset(0, 1).Resize(, UBound(myAr) + 1).Value = myDic.Item(cc.Value) 'B~E列にItemデータ転記 Next End Sub  (o。_。)oペコッ

  • 途中まで出来ているのですが‥(Dicへの複数item追加?)

       A   B   C   D   E    ←シート元 1 大区分 中区分 金額1 金額2 小区分  ←見出し行です。 2  A社 管理課 12000  3000  1 3  B社 総務課 10000  2000  1 4  C社 業務課  800 1000    3 5  A社 総務課           5 6  C社 製造課  600 5000    2 7  A社 製造課 15000        1 8  A社 管理課  300       1 9  B社 管理課  800 2000     4 10  D社 総務課 90000 9000     1 を大区分 中区分 小区分をKeyにして3要素が同じものをまとめて並び替えて集計するのですが(下記のように 金額1 金額2ごとに足し算)    A   B   C   D   E    ←シート集計 1 大区分 中区分 小区分金額1 金額2   ←見出し位置変更 2  A社 管理課  1 12000 3300 3  A社 総務課  5   4  A社 製造課  1 15000   5  B社 総務課  1 10000 2000 6  B社 管理課  4 8000 2000 以下省略 実際に作りたいものは、元シートの金額の項目が多いのです(列が飛び飛びに40位あります)今回の例でいえばCとDが CからF HからV ABからCHとなりそれぞれ金額3,4,5~50みたいになってます。私なりに下記のコードのように進めてますが、表題のようにDictionaryに複数のitemを追加する方法が解らないため、金額の項目ごとに算出を繰り返すという効率が悪い方法をとってます。どなたかご教示頂けると幸いです。 Sub 3keyと2要素() ’実際は40要素くらいある Dim OLDBOOK As Workbook Dim SH1 As Worksheet Dim SH2 As Worksheet Dim myDic As Object, myKey, myItem Dim myVal, myVal2, myVal3, myVal4, myVal5 Dim i As Long Set OLDBOOK = ThisWorkbook Set SH1 = OLDBOOK.Worksheets("元") Set SH2 = OLDBOOK.Worksheets("集計") SH2.Cells.ClearContents SH2.Range("A1:B1").Value = SH1.Range("A1:B1").Value SH2.Range("C1").Value = SH1.Range("E1").Value SH2.Range("D1:E1").Value = SH1.Range("C1:D1").Value Set myDic = CreateObject("Scripting.Dictionary") SH1.Select myVal = SH1.Range("A2", Range("A" & Rows.Count).End(xlUp)).Resize(, 5).Value For i = 1 To UBound(myVal, 1) myVal2 = myVal(i, 1) & "_" & myVal(i, 2) & "_" & myVal(i, 5) If Not myVal2 = "_" & "_" Then If Not myDic.exists(myVal2) Then myDic.Add myVal2, myVal(i, 3) Else myDic(myVal2) = myDic(myVal2) + myVal(i, 3) End If End If Next myKey = myDic.keys ' 書き出し とりあえず2要素   myItem = myDic.items For i = 0 To UBound(myKey) myVal3 = Split(myKey(i), "_") SH2.Cells(i + 2, 1).Value = myVal3(0) SH2.Cells(i + 2, 2).Value = myVal3(1) SH2.Cells(i + 2, 3).Value = myVal3(2) SH2.Cells(i + 2, 4).Value = myItem(i) Next Set myDic = Nothing '******** Set myDic = CreateObject("Scripting.Dictionary") myVal = SH1.Range("A2", Range("A" & Rows.Count).End(xlUp)).Resize(, 5).Value For i = 1 To UBound(myVal, 1) myVal2 = myVal(i, 1) & "_" & myVal(i, 2) & "_" & myVal(i, 5) If Not myVal2 = "_" & "_" Then If Not myDic.exists(myVal2) Then myDic.Add myVal2, myVal(i, 4) Else myDic(myVal2) = myDic(myVal2) + myVal(i, 4) End If End If Next myKey = myDic.keys myItem = myDic.items For i = 0 To UBound(myKey) myVal3 = Split(myKey(i), "_") SH2.Cells(i + 2, 5).Value = myItem(i) Next Set myDic = Nothing ' 以下繰り返しするしかなく困ってます SH2.Select SH2.Range("A2", Range("E" & Rows.Count).End(xlUp)).Sort _ Key1:=Range("AF2"), Order1:=xlAscending, _ Key2:=Range("B"), Order2:=xlAscending, _ Key3:=Range("C2"), Order3:=xlAscending, _ Header:=xlGuess Set OLDBOOK = Nothing Set SH1 = Nothing Set SH2 = Nothing End Sub

  • Excelの2個の条件に合致した数値を入力

    B.xlsのA列とA.xlsのB列、B.xlsのC列とA.xlsのD列の行がマッチしたらA.xlsのF列、H列の数値をB.xlsのD,E列に添付の下図のように数値を入力したいのですがVBAコードが解る方宜しくお願いします。(同じく関数の方もわかればお願いします)

  • エクセルでDictionaryオブジェクト

    メリークリスマス! とはいうものの仕事が終わりません。 これまでエクセルでDictionaryオブジェクトを利用し、AN列にある人名データをKeyにしてT列にある金額の集計を行っていました。 条件 AN列のデータには重複するものが多いが同姓同名は存在しない。 T列には必ず数値が入力されている。 AN列にある人名ごとにT列にある金額の集計を行う。 省略してますが以下のようなコードです。 Sub test01()   Dim myDic As Object   Dim x As Long   Dim myC As Range   Dim ws As Worksheet   Set myDic = CreateObject("Scripting.Dictionary")   x = Cells(Rows.Count, "AN").End(xlUp).Row   For Each myC In Range("AN1:AN" & x) '受取人名列     If Not myDic.Exists(myC.Value) Then       myDic.Add myC.Value, Cells(myC.Row, "T").Value 'T列の金額     Else       myDic(myC.Value) = myDic(myC.Value) + Cells(myC.Row, "T").Value '金額を加算     End If   Next   Set ws = Worksheets.Add(After:=ActiveSheet)   With ws '新規ワークシート     .Range("A1").Resize(myDic.Count, 1).Value = Application.Transpose(myDic.keys) 'A列にデータ     .Range("B1").Resize(myDic.Count, 1).Value = Application.Transpose(myDic.Items) 'B列に結びつけ金額データ   End With   Set myDic = Nothing End Sub これでうまくできていたのですが、今回新しい条件が加わり、頭を悩ませております。 新たな条件とは、同じ表のN列にあるコード(数字8桁)のうち、例えば77777777のものがあれば、追加したワークシートのC列にフラグをたてるというものです。 どのようにすればできるでしょうか? よろしくお願いいたします。

  • エクセルVBA

    エクセル2003です 勉強中です 教えてください Sheet1     A      B      C       D      1   日付    種類    数量1    数量2  2   2月3日    C      300        10   3   2月4日     B      200       5 4   2月5日     A     100       20 5   2月3日     A     100       10 6   2月4日     B     200       5 7   2月5日     C     300       20 8   2月3日      A      300       20 9   2月4日     C      200        5 10  2月5日     B     100       10 Sheet1     F      G      H       I      1   日付    種類    数量1    数量2  2   2月3日    A      400          3   2月3日     C      300       4   2月4日     B     600       5   2月5日     A     100       6   2月5日     C     400       7 したい事 *A列~D列のデータをF列からI列へ複数条件の集計をしたいのですが *A列~D列の数値が変動すると勝手に自動で集計をして欲しい(シートがアクティブでなくても) *下記コードでC列までの集計ができますがD列の集計がわかりません  (増やそうとすると頭の中がぐちゃぐちゃになって・・・) *前回の集計が残ってしまう Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim myDic As Object, myKey, myItem Dim myVal, myVal2, myVal3 Dim i As Long Range("F2", Range("I" & Rows.Count).End(xlUp)).ClearContents Range("F1:I1").Value = Range("A1:D1").Value Set myDic = CreateObject("Scripting.Dictionary") ' データを配列に格納 myVal = Range("A2", Range("A" & Rows.Count).End(xlUp)).Resize(, 4).Value ' myDicへデータを格納 For i = 1 To UBound(myVal, 1) myVal2 = myVal(i, 1) & "_" & myVal(i, 2) If Not myVal2 = "_" Then If Not myDic.exists(myVal2) Then myDic.Add myVal2, myVal(i, 3) Else myDic(myVal2) = myDic(myVal2) + myVal(i, 3) End If End If Next 'Key,Itemの書き出し myKey = myDic.keys myItem = myDic.items For i = 0 To UBound(myKey) myVal3 = Split(myKey(i), "_") Cells(i + 2, 6).Value = myVal3(0) Cells(i + 2, 7).Value = myVal3(1) Cells(i + 2, 8).Value = myItem(i) Next Set myDic = Nothing '並べ替え Range("F2", Range("H" & Rows.Count).End(xlUp)).Sort _ Key1:=Range("F2"), Order1:=xlAscending, _ Key2:=Range("G2"), Order2:=xlAscending, _ Header:=xlGuess End Sub 頭のなかがこんがらがってしまいます お願いです 出来れば説明付きで教えていただけませんか よろしくお願いします

  • 別のファイルの条件にあう数値を反映させたい

    ファイルAはその日の発注個数 C列に順番がバラバラの商品名   O列に個数 のような表になってます ファイルBは一か月の発注個数 B1列に商品名  D1から1行ごとに個数が表示される表になってます ファイルBの商品名と同じ ファイルAの個数を ファイルBのD1に反映させるにはどうすればいいですか? ファイルBのD1に =('F:\発注\[1.xls]Sheet1'!$C$4:$C$43,B1,'F:\発注\[1.xls]Sheet1'!$O$4:$O$43) と自分なりにやってみたら#VALUE!の表記になりました 正しい数式を教えてください

  • エクセルの関数について

    エクセルの関数について質問です。 A1-A20にランダムに花名 B1-B20に○か空欄があります。 チューリップ   ○ バラ        ○ カーネーション  ○ バラ バラ カーネーション チューリップ チューリップ カーネーション チューリップ A1-A10 B1-B10全体で、 B列の「○」がある場所で A1-A10の花名が1種類のみ時は、「真」 A1-A10の花名が2種類以上の時は、「偽」 とするには、どうしたら良いのでしょうか? ちなみに、上の表だと「偽」です。 お願い致します。

  • エクセルの関数について教えてください

       A   B   C 1 りんご   5 2 バナナ   4 3 バラ    3 4 さくら   1 5 バナナ   2 という表があったとします。 りんご・バナナの場合は果物 バラ・さくらの場合は花 という値をC列1~5に返したいのですが そんなことできますか? やはり  バラ  花  さくら 花  バナナ 果物  りんご 果物 という表を別に作らないとだめでしょうか?

田舎が嫌で離婚したい
このQ&Aのポイント
  • 田舎が嫌で離婚を考えている夫婦がいます。独特な田舎の価値観に合わないため、嫁いできた地元での生活に苦しみを感じています。
  • 夫の地元(ど田舎)に嫁いできた結果、田舎の価値観に合わず、離婚を考えるようになりました。生活費の足りない夫に義理兄への貸し付けが続き、家族の生活にも影響が出ています。
  • 田舎での生活に馴染めず、夫婦間の喧嘩も増えています。また、知り合いとの遭遇も多く、外出を控えるようになるなど、精神的にも苦しみを感じています。
回答を見る