- ベストアンサー
VBAコマンドボタンを使用して在庫を管理する方法
- 花.xlsのシート1には、花の種類と本数が記載されています。VBAのコマンドボタンを押すと在庫.xlsのA列とB列に花の名前を1つにまとめて、合計の本数を書き出します。
- 質問者は、花2.xlsにも同様の情報があるため、VBAのコマンドボタンをクリックすると在庫.xlsのC列に本数を追加したいと考えています。花の名前がすでに存在する場合は、C列に本数を追加し、存在しない場合はA列に花の名前を追加して本数を書き加えます。
- 質問者は、watabe007さんのアドバイスを参考にして在庫管理機能を実装しました。具体的な詳細なコードの説明は提供されていませんが、質問者は応用することができると述べています。
- みんなの回答 (4)
- 専門家の回答
関連する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
- ベストアンサー
- Visual Basic
- Excelの2個の条件に合致した数値を入力
B.xlsのA列とA.xlsのB列、B.xlsのC列とA.xlsのD列の行がマッチしたらA.xlsのF列、H列の数値をB.xlsのD,E列に添付の下図のように数値を入力したいのですがVBAコードが解る方宜しくお願いします。(同じく関数の方もわかればお願いします)
- ベストアンサー
- Visual Basic
- エクセルで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列にフラグをたてるというものです。 どのようにすればできるでしょうか? よろしくお願いいたします。
- ベストアンサー
- Excel(エクセル)
- エクセル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に返したいのですが そんなことできますか? やはり バラ 花 さくら 花 バナナ 果物 りんご 果物 という表を別に作らないとだめでしょうか?
- ベストアンサー
- オフィス系ソフト
お礼
watabe007さん おっしゃるとおり、スペースが入っていました、 そしてスペースを取り除き同じ文字列にすることでうまく行きました。 感動しました。 watabe007さんのコードは大変シンプルでスッキリしてかっこよく見えます。 大変ありがとう御座いました、 心から感謝しています。