VBAでSUMIF関数と同じ集計を行いたい!

このQ&Aのポイント
  • データ数が膨大なため、SUMIF関数では処理が遅くなってしまいます。そこでVBAを使用して同じ集計を行いたいです。
  • 12枚のシートに同じレイアウトのデータがあります。各シートごとに行数が異なります。
  • 集計結果Sheetには、品名ごとの収入計と支出計を集計する必要があります。
回答を見る
  • ベストアンサー

SUMIF関数と同じ集計をVBAで行いたい

今はSUMIF関数で複数シートデータの集計をしていますが、 データ数が膨大なため処理に多大な時間が掛かっています。 VBAで同じ様な処理がしたく、ご教授の程よろしくお願いします。 Sheetは1~12まであり、同じレイアウトです。 行数は、Sheetごとに異なります。 集計結果Sheetに、品名ごとの収入計と支出計を集計したい。 Sheet1    A    B    C    D 1 月日  品名   収入 支出 2 5/10  りんご  30000  20000 3 5/15  さかな  20000  30000  4 5/20  きのこ  50000  20000 5 5/25  さかな  30000  10000 6 5/30  おかし  15000  10000 7 5/30  おかし  20000  20000 5 5/10  りんご  40000  20000 Sheet2    A    B    C    D 1 月日  品名   収入 支出 2 6/13  きのこ  10000  30000 3 6/25  さかな  20000  20000 4 6/30  おかし  55000  30000 5 6/10  りんご  20000  10000 6 6/15  さかな  10000  10000 集計結果Sheet    A    B    C 1 品名   収入  支出 2 きのこ 3 さかな  4 おかし  5 りんご 

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

  • ベストアンサー
  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.2

>なお、一番後ろのシート名は何でも良いのでしょうか? なんでも(白紙)でいいです。 >申し訳ございませんが、下記の部分で実行エラー13 型が一致しません >とエラーが出ます。 >: x(2, k) = x(2, k) + v(i, 2) シートの左から1~12番目で間違いないですか? 収入・支出はC・D列の2行目からで、数字(文字列)ではないですよね? 空白セルとかが途中にありますか?

yuripp
質問者

お礼

すみません、出来ました! 丁寧なご回答、ありがとうございました。

その他の回答 (1)

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.1

Sub test()  Dim Dic As Object  Dim ws As Integer  Dim v As Variant  Dim x As Variant  Dim i As Long, j As Long, k As Long  Set Dic = CreateObject("Scripting.Dictionary")  ReDim x(1 To 3, 1 To 1)    For ws = 1 To 12      With Worksheets(ws)           v = .Range(.[B2], .Cells(Rows.Count, 2).End(xlUp).Resize(, 3))      End With      For i = 1 To UBound(v, 1)          If Not Dic.exists(v(i, 1)) Then             j = j + 1             Dic(v(i, 1)) = j             x(1, j) = v(i, 1): x(2, j) = v(i, 2): x(3, j) = v(i, 3)             ReDim Preserve x(1 To 3, 1 To j + 1)          Else             k = Dic(v(i, 1))             x(1, k) = v(i, 1): x(2, k) = x(2, k) + v(i, 2): x(3, k) = x(3, k) + v(i, 3)          End If      Next  Erase v  Next  With Worksheets(Worksheets.Count)      .Cells.ClearContents      .Range("A1:C1").Value = Array("品名", "収入", "支出")      .Range("A2").Resize(j, 3).Value = Application.Transpose(x)  End With  Erase x  Set Dic = Nothing End Sub シート1~シート12の結果が一番後ろに新規でシートを作っておけば そこに表示されるはずです。 試してみて下さい。

yuripp
質問者

補足

ご教授の程、ありがとうございました。 申し訳ございませんが、下記の部分で実行エラー13 型が一致しませんとエラーが出ます。 : x(2, k) = x(2, k) + v(i, 2) なお、一番後ろのシート名は何でも良いのでしょうか?

関連するQ&A

  • 【再質問】SUMIF関数と同じ集計をVBAで行いたい

    恐縮なのですが、今一度質問させてください。 今はSUMIF関数で複数シートデータの集計をしていますが、 データ数が膨大なため処理に多大な時間が掛かっています。 VBAで同じ様な処理がしたく、ご教授の程よろしくお願いします。 Sheetは1~12まであり、同じレイアウトです。 行数は、Sheetごとに異なります。 集計結果Sheetに、品名ごとの月集計をしたい。 Sheet1    A    B    C    D 1 月日  品名   収入 支出 2 5/10  りんご  30000  20000 3 5/15  さかな  20000  30000  4 5/20  きのこ  50000  20000 5 5/25  さかな  30000  10000 6 5/30  おかし  15000  10000 7 5/30  おかし  20000  20000 5 5/10  りんご  40000  20000 Sheet2    A    B    C    D 1 月日  品名   収入 支出 2 6/13  きのこ  10000  30000 3 6/25  さかな  20000  20000 4 6/30  おかし  55000  30000 5 6/10  りんご  20000  10000 6 6/15  さかな  10000  10000 集計結果Sheet    A    B    C    D 1 品名   4月   5月   6月 2 きのこ  3 さかな  4 おかし  5 りんご  例)きのこ 4月の収入-支出を、B2セルに入力したい。 シートは4月・5月と、月別に分かれています。

  • ExcelのVBAで集計をしたいです。

    EXCELで、VBAを使用して元データのシートから、集計シートを作成したいです。 Sheet1 A B C D E F 1 品名 サイズ1 サイズ2 サイズ3 元のサイズ 売り上げた量 2 A 1 100 150 200 1000 50 3 B 2 100 200 100 1500 10 4 A 2 200 300 500 2000 100 5 A 1 150 150 100 1000 80 6 A 2 150 150 600 3000 100 Sheet2(集計用に新規作成されたシート:作成時は空シート) A B C D 1 品名 サイズ1 元のサイズ 売り上げた量の合計 2 A 1 1000 130 3 B 2 1500 10 4 A 2 2000 100 5 A 2 3000 100 元のサイズのものがどれだけ使用されて売れたのかを集計しようとしています。 ちなみにサイズ1は変更されません。 条件が複数個になるので、Sheet2の合計は、SUMPRODUCTを使用することになると思うのですが、 C列までの、品名、サイズ1、元サイズが重複しないように抽出するためには、 どのようにしたらよいのでしょうか?

  • VBAでSUMIF関数を繰り返す

    VBA初心者です。よろしくお願いします。 Book1のSheet1のA2の値を検索条件とし、Book2のsheet1のA列を検索し、条件に合った行のC列の合計値を取得するとします。出力先はBOOK1のA2と同じ行、C2です。 これだけであれば、sumif関数で処理できるのですが、 Book1のA列の最終行までこの処理を繰り返さなければなりません。 また、毎月、Book1,2ともに最終行が変化します。 上記を簡単に書くと以下になります。 ■Book1のsheet1    A   B   C 1  101  リンゴ (ここにBook2の合計値を出力したい) 2  202  レモン (ここにBook2の合計値を出力したい) 3  510   柿   (ここにBook2の合計値を出力したい) ■Book2のsheet1    A   B    C 1  202  レモン  10 2  202  レモン  30 3  101  リンゴ  200 4  707  ブドウ  50 5  101  リンゴ  70 6  510   柿   100 上記処理をsumif関数、forを使って作成してますが、どうもうまくいきません。 申し訳ございませんがよろしくお願いします。 環境は、Windows7、Office2010 です。

  • excel vba sumif 月間集計

    excel vba sumif 月間集計 どなたか教えていただけますか? sheet1に1日毎のデータが打ち込まれています。そのデータを同じブック内の月間シートが開いたときに表示してるのですが、31日間分のコードをsumifで処理しているため、かなりのファイル容量となり重くなります。もっと効率的な方法はないのでしょうか、(範囲指定の繰り返し処理等)お願いいたします。 なお、sheet1からsheet5まで日毎のデータをそれぞれ月間シート1~5に集計してます。 例です。 sheet1は   A    B     C    D     E   F・・・・ 1 日  目的  距離  燃料 2 1   社用  50 3 1   私用  60   10  4 2   社用  30 月間シート1は   A   B   C   D E    F 1 日  距離  燃料       1110 2 1  110    10 3 2   30     0  Private Sub Worksheet_Activate() UserForm1.Hide Range("A1").Select '距離数 Range("B2").Value = WorksheetFunction.SumIf(Sheets("Sheet1").Range("A2:A300"),   Range("A2"), Sheets("Sheet1").Range("C2:C300"))   Range("B3").Value = WorksheetFunction.SumIf(Sheets("Sheet1").Range("A2:A300"),   Range("A3"), Sheets("Sheet1").Range("C2:C300"))      ・      ・      ・ '累計 ・・・は、こんな感じ処理してます Dim myRng As Range Dim c As Range Set myRng = Range("F2:F32") For Each c In myRng c.Value = c.Offset(0, -4).Value + c.Offset(-1, 0).Value  Next c  End Sub

  • エクセル関数でグループ単位に集計を行う

    エクセル初心者です。 入力伝票データを元に、集計シートに自動的に品名コード順の合計を作成したいのですが、うまくできません。 データシートのデータをソートせずに関数だけで出来る方法をお教えください。 ※エクセルはExcel2003を使用しています。 《データシート》例 [見出し] A1:年月日,B1:伝票番号,C1:品名コード,D1:数量,E1:単価,F1:金額 [データ] A2:2008/10/1,B2:Z-001,C2:S0001,D2:3,E2:1,000,F2:3,000 A3:2008/10/1,B3:Z-002,C3:S0002,D2:1,E3:2,000,F3:2,000 A4:2008/10/1,B4:Z-003,C4:S0003,D4:2,E4:3,000,F4:6,000 A5:2008/10/2,B5:Z-004,C5:S0002,D5:1,E5:2,000,F5:2,000 A6:2008/10/2,B6:Z-005,C6:S0001,D6:3,E6:1,000,F6:3,000 A7:2008/10/3,B7:Z-006,C7:S0003,D7:2,E7:3,000,F7:6,000 《集計シート》例 [見出し] A1:品名コード,B1:伝票数,C1:数量計,D1:合計金額 [集計値] A2:S0001,B2:2,C2:6,D2: 6,000 A3:S0002,B3:2,C3:2,D3: 4,000 A4:S0003,B4:2,C4:4,D4:12,000 ※品名コードは固定せず、データシートに入力されたものだけを集計したい

  • エクセルで集計

    エクセルで集計 シート1:A列に日付2000行程度、B列に品名A,B,C,D…500種類程度、C列にその内容。日毎に行は増えていきま、同じ品名が何度も登場してきます。 シート2:ここに新しくシート1の集計をして、同じ品名の多い順に並べ替えてリストを作成したいと思います。 シート1に新しく行が増えると同時にシート2の集計に反映させたいのですが、いい方法はありますか?

  • SUMIF関数の集計が上手くいきません。

    「集計」シートのA列に得意先コード・O列に集計欄 「貼付」シートのE列に得意先コード・J列に集計欄があります。 なお、「貼付」シートのE列は重複する場合もあります。 「集計」シートのA列の値を、「貼付」シートのE列から探して、その行のJ列の数値の合計を 「集計」シートのO列に集計したいと思っています。 「集計」シートのA406が「B」で「貼付」シートのE200とE300が「B」で、「貼付」シートのJ200が「150」 ・J300が「250」であれば「集計」シートのO406に「500」(150+250)を表示させたいと思っています。 なお、「貼付」シートのE列には他に「B」の値がないものとします。 そこで、O列に次の関数を入れました。 「=SUMIF(貼付!E:E,A403,貼付!J:J)」 すると、(O4:O405)の範囲では、きちんと「貼付」シートの、各得意先コード別の合計が表示されるの ですが、O406の値が「0」と表示されます。 数式は合っていると思うのですが、何が誤っているのか、わかるかたはいらっしゃいますか? 406行目がA列に得意先コードが入っている最終行であることも関係ありますか? あるいは、どのように集計したら良いのか、教えていただけると助かります。

  • エクセルVBA 年月で集計したい

    お世話になります。 下記の様にシート1に入力した値をボタンで シート2の集計シートの該当年月に加算させたいたいのですが、 年月で振り分ける方法が分かりませんでした。 ●シート1(個数入力)   A     B    1      H24/12/25 2りんご    1 3みかん    2 4ばなな    3 5すいか    4      ⇒GOボタン ●シート2(年月毎の集計)   A     B      C      D    1     24年10月 24年11月 24年12月 2りんご   0      1 3みかん   0      2 4ばなな   0      3 5すいか   0      4 シート1のB1の日付の年月とシート2のB1の年月が一致したら、値をB2~B5に加算 一致しなければ、C1、D1 という感じで考えております。 IF文の条件式がどのようになれば良いか教えていただけないでしょうか? 分かりづらくて申し訳ございませんが、よろしくお願い致します。 エクセルは2000を使用しております

  • SUMPRODUCT関数で複数条件適用されない

    Sheet1 A列:日付 B列:注文番号 C列:品名 D列:整理番号 E列:数量 集計 A列:品名 B~AF列:日付(1~31日) 【集計】B~AF列の日付、A列の品名が 【Sheet1】A列の日付、C列の品名と一致したら 【Sheet1】E列の数量を【集計】の該当するセルに抽出する 式をSUMPRODUCT関数で作成しました。 例)10/1 りんご 20 【集計】B3セルに以下の数式を入れましたが なぜか数量が「0」のままになります。 =SUMPRODUCT('Sheet1'!$A$3:$A$200='集計'!B$2)*('Sheet1'!$C$3:$C$200="りん ご")*('Sheet1'!$E$3:$E$200) 特に数式のミスはないと思うのですが どうしても正しい値が入りません。 数式に間違いがあればご指摘いただけませんでしょうか。 また、他に良き方法があればご教示いただけるとありがたいです。

  • SUMIFの計算結果が0

    ブック内に商品別のシートが数枚あり、 それを月別集計する別シートを作っています ■商品シート A   B   C    D    E 月日  商品  仕入  出荷  在庫 ↓出荷状況によって入力が増減します ■月別集計シート A1=TODAY()  B1=型式  C=在庫 ↓商品別に一覧で在庫表示させる A1には、今日の日時を表示(仕様) C=在庫セルにSUMIFで在庫数計算させているのですが、、、 計算結果が0になってしまいます =SUMIF('型式シート'!$A$1:$A$500,">=MONTH($A$1)",'型式シート'!$C$1:$C$500) -SUMIF('型式シート'!$A$1:$A$500,">=MONTH($A$1)",'型式シート'!$D$1:$D$500)   その月の全仕入から全出荷を引いて在庫計算させているのですが、 SUMIFの計算結果が0になってしまいます。 記述もしくは検索条件のやり方が違うのでしょうか? お手上げ状態です、、TT

専門家に質問してみよう