- 締切済み
VBAについて
下記のAシートをBシートの様にまとめたいのですが・・。 <Aシート> A列 B列 1 名前 数量 2 リンゴジュース 2 3 オレンジジュース 3 4 牛乳 1 <Bシート> A列 B列 1 名前 数量 2 ジュース 5 3 牛乳 1 Select Case NAMAE Case "リンゴジュース","オレンジジュース" ・・・・ こんな感じでしょうか? 宜しくお願い致します。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- watabe007
- ベストアンサー率62% (476/760)
参考に Sub Test() Dim myDic As Object, v As Variant Dim NAMAE As String, BUNRUI As String Dim KAZU As Long, i As Long With Worksheets("Aシート") v = .Range("A2", .Cells(Rows.Count, "A").End(xlUp)).Resize(, 2).Value End With Set myDic = CreateObject("Scripting.Dictionary") For i = 1 To UBound(v) NAMAE = v(i, 1) KAZU = v(i, 2) Select Case True Case NAMAE Like "*ジュース" BUNRUI = "ジュース" Case NAMAE Like "*牛乳" BUNRUI = "牛乳" Case Else BUNRUI = NAMAE End Select myDic(BUNRUI) = myDic(BUNRUI) + KAZU Next With Worksheets("Bシート") .Range("A1:B1").Value = Array("名前", "数量") .Range("A2").Resize(myDic.Count, 2).Value = _ Application.Transpose(Array(myDic.Keys, myDic.Items)) End With Set myDic = Nothing End Sub
- KenKen_SP
- ベストアンサー率62% (785/1258)
VBA の前に、データに「種類」とか「カテゴリ」などの情報を持たせた 方が良いでしょう。こんな感じ。 A列 B列 C列 1 名前 種類 数量 2 リンゴジュース ジュース 2 3 オレンジジュース ジュース 3 4 牛乳 牛乳 1 例えば、「コーヒー牛乳」は「ジュース」なのか「牛乳」なのか。 文字列によって判断するのが難しくなりますよね? 単純に「牛乳」という「文字列を含む」というロジックでは、コーヒー 牛乳は、「牛乳」として集計されてしまいます。 そこで、その判断ができる情報を設けておく必要があります。 # PC には何が「ジュース」で何が「牛乳」なのか判断できません。 既存のデータでなんとかして、という場面が無いわけではありませんが、 事前にデータを「扱いやすい形に加工しておく」という考え方を優先 させた方が後々幸せになれます。 なぜなら、SUMIF ワークシート関数やピボットテーブルの利用等、または ACCESS クエリの利用など解決の選択肢が広がるからです。 また、VBA で集計機能を実装するとしても、ソースはぐっと簡潔になります。 文字列をシコシコ解析して条件分岐させて集計・・・というロジックは ソースが複雑になりがちですし、想定外の文字列があった場合に弱いですよ。 (例外処理) ロジックを考えてる時間があれば、プリントアウトしたものを電卓で集計 できちゃったりしたら本末転倒ですから。
- imogasi
- ベストアンサー率27% (4737/17069)
なぜSelect Case の問題なのかわからない。もう少しVBAの経験をつむ 必要あるのでは。特に処理ロジックの確立。結果的に丸投げ質問になっている。 ーー 例データ Sheet1 A2:B7 名前 数量 リンゴジュース 2 オレンジジュース 3 牛乳 1 コーヒー牛乳 4 さわやか牛乳新岩井 6 ーーー Sheet2 A2:B4 名前 数量 ジュース 牛乳 ーー コード Sub test01() d1 = Worksheets("Sheet1").Range("A65536").End(xlUp).Row d2 = Worksheets("Sheet2").Range("A65536").End(xlUp).Row MsgBox d1 & " " & d2 For i = 3 To d2 MsgBox "*" & Worksheets("Sheet2").Cells(i, "A") & "*" x = WorksheetFunction.SumIf(Worksheets("Sheet1").Range("A3:A" & d1), "*" & Worksheets("Sheet2").Cells(i, "A") & "*", _ Worksheets("Sheet1").Range("B3:B" & d1)) Worksheets("Sheet2").Cells(i, "B") = x Next i End Sub 結果 Sheet2 A2:B4 名前 数量 ジュース 5 牛乳 11 ーー この上記(関数利用法)のロジックのほかにも 総なめ法 ソート法 検索法 など思いつくが。
- cistronezk
- ベストアンサー率38% (120/309)
MsgBox "ジュースの合計:" & WorksheetFunction.SumIf(Range("A2:A4"), "*ジュース", Range("B2:B4")) MsgBox "牛乳の合計:" & WorksheetFunction.SumIf(Range("A2:A4"), "牛乳", Range("B2:B4"))
- watabe007
- ベストアンサー率62% (476/760)
>Case "リンゴジュース","オレンジジュース" > ・・・・ >こんな感じでしょうか? ジュースの種類が2つなら良いのでは Select Case True Case NAMAE Like "*ジュース" MsgBox NAMAE & "はジュースに分類" Case NAMAE = "牛乳" MsgBox NAMAE & "は牛乳に分類" End Select
補足
ご回答ありがとうございます。 数量はどのようにしたら良いでしょうか?