人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

またExcelのVBAについて質問です。

http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_dictionary.html
こちらのサイトの「重複しない品名と個数の合計を計算します」の修正の仕方を教えてください。

元データで、B列からE列に数値があった場合の合計をだす
コードの修正方法がわかりません。

よろしくお願い致します。


●質問者: にゃんころね
●カテゴリ:コンピュータ 学習・教育
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● きゃづみぃ
●400ポイント ベストアンサー

>B列からE列に数値があった場合の合計をだす

このソースを見てみると まず 合計先を消去してから 順に品名を転記し、
既に 品名があった場合は、その単価を合計するようになっています。

つまり、修正は 不要です。

もし違う意味でしたら、コメントをください。


きゃづみぃさんのコメント
>|vb| Sub rei21_2() Dim myDic As Object, myKey, myItem Dim myVal Dim i As Long Set myDic = CreateObject("Scripting.Dictionary") Range("G2", Range("H" & Rows.Count).End(xlUp)).ClearContents ' ---元データを配列に格納 myVal = Range("A2", Range("A" & Rows.Count).End(xlUp)).Resize(, 5).Value ' ---myDicへデータを格納 For i = 1 To UBound(myVal, 1) If Not myVal(i, 1) = Empty Then If Not myDic.exists(myVal(i, 1)) Then '---新たなkeyの時はkeyとitemを追加します k = 0 For b = 2 To UBound(myVal, 2) k = k + myVal(i, b) Next b myDic.Add myVal(i, 1), k Else '---すでに存在しているkeyの時はitemを加算します k = 0 For b = 2 To UBound(myVal, 2) k = k + myVal(i, b) Next b myDic(myVal(i, 1)) = myDic(myVal(i, 1)) + k End If End If Next ' ---Key,Itemの書き出し myKey = myDic.keys myItem = myDic.items For i = 0 To UBound(myKey) Cells(i + 2, "G").Value = myKey(i) Cells(i + 2, "H").Value = myItem(i) Next n = UBound(myKey) + 1 Set myDic = Nothing Set myDic = CreateObject("Scripting.Dictionary") myVal = Range("B1", Range("B" & Rows.Count).End(xlUp)).Resize(, 5).Value '店舗ごと For i = 1 To UBound(myVal, 2) - 1 If Not myVal(1, i) = Empty Then If Not myDic.exists(myVal(1, i)) Then '---新たなkeyの時はkeyとitemを追加します k = 0 For b = 2 To UBound(myVal, 1) k = k + myVal(b, i) Next b myDic.Add myVal(1, i), k Else '---すでに存在しているkeyの時はitemを加算します k = 0 For b = 2 To UBound(myVal, 1) k = k + myVal(b, i) Next b myDic(myVal(1, i)) = myDic(myVal(1, i)) + k End If End If Next i ' ---Key,Itemの書き出し myKey = myDic.keys myItem = myDic.items For i = 0 To UBound(myKey) Cells(i + 2 + n, "G").Value = myKey(i) Cells(i + 2 + n, "H").Value = myItem(i) Next Set myDic = Nothing End Sub ||< A1からE4まで データが入っているものとして G2、H2から 商品と店舗ごとの合計を出すように修正してみました。

きゃづみぃさんのコメント
横並びになるように 修正しました。 >|vb| Sub rei21_2() Dim myDic As Object, myKey, myItem Dim myVal Dim i As Long Range("G1", Range("K" & Rows.Count).End(xlUp)).ClearContents Range("G1:K1").Value = Range("A1:E1").Value ' ---元データを配列に格納 myVal = Range("A2", Range("A" & Rows.Count).End(xlUp)).Resize(, 5).Value ' ---myDicへデータを格納 For ik = 2 To UBound(myVal, 2) Set myDic = CreateObject("Scripting.Dictionary") For i = 1 To UBound(myVal, 1) If Not myVal(i, 1) = Empty Then If Not myDic.exists(myVal(i, 1)) Then '---新たなkeyの時はkeyとitemを追加します myDic.Add myVal(i, 1), myVal(i, ik) Else '---すでに存在しているkeyの時はitemを加算します myDic(myVal(i, 1)) = myDic(myVal(i, 1)) + myVal(i, ik) End If End If Next ' ---Key,Itemの書き出し myKey = myDic.keys myItem = myDic.items For i = 0 To UBound(myKey) Cells(i + 2, 7).Value = myKey(i) Cells(i + 2, 6 + ik).Value = myItem(i) Next Set myDic = Nothing Next End Sub ||<

にゃんころねさんのコメント
いつも回答頂きありがとうございます! 日々、勉強をしているのですが、 まだまだ覚えないと行けませんね。 今回も大変助かりました。 ありがとうございました!

きゃづみぃさんのコメント
修正箇所をみて 応用できるように がんばってくださいね。

質問者から

商品 A店 B店 C店 D店
りんご 200 200 150 120
みかん 80 100 90 95
りんご 120 130 110 100

と行った場合の、商品ごとにまとめて、
かつ店舗ごとの合計をだしたいと思っていました。

よろしくお願いします。


2 ● うぃんど
●130ポイント

ご質問の目的であればVBAではなくExcelの集計機能で出来ますが、どうしてもVBAですか?

下記は同じサイト内にある集計の一例です。
http://www.eurus.dti.ne.jp/yoneyama/Excel/syukei.html
ほかにもピボットテーブルなど様々な集計方法がありますので、
順次学習していくと良いでしょう。

VBAでやりたいという場合ですが、Dictionary は一次元の連想配列のため、
複数の列をまとめて取り扱うことには向いていません。参考にしておられるページは、
Dictionaryの使い方の例であって集計の例ではないということです。

Excelにはマクロ記録という機能があります。、
集計作業からコピーまでの作業を記録させてマクロの雛形を作り、
そこに手を加えるという方法でプログラミングを覚えていくこともできますので、あわせてどうぞ。


うぃんどさんのコメント
Dictionary でがんばった人もいるみたいですが、 Excelの機能を利用したVBAでは下記のように短いもので済みます。 短いものは実行時間も短いですし、作成ミスも少ないですし、 後から見直しも楽になりますし、転用も楽になります。 >|vb| Sub Macro1() With ActiveSheet ' アクティブなシートを対象とします。 .Range("G:K").ClearContents ' G:K列に書き出すものとしてまずはクリアします。 ' R1C1(A1)からR10C5(E10)までのデータを集計するものとします。 .Range("G1").Consolidate _ Sources:=Array("R1C1:R10C5"), _ Function:=xlSum, _ TopRow:=True, LeftColumn:=True, _ CreateLinks:=False End With End Sub ||<

にゃんころねさんのコメント
マクロの記録は、時々してそれに手を加えたりもするのですが、 基礎がまだしっかり身についていなのでいつも苦労しています。 アドダイス、大変参考になりました!
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ