- ベストアンサー
集計するマクロ
面倒ですが宜しくお願い致します。 例えば宅配会社だとして 日付 支店 地域 種類 金額 6/1 A店 A町 A 160円 6/2 B店 B町 B 100円 6/2 C店 B町 C 150円 ~ 7/30 Z店 Z町 Z 200円 のような表があったとして この表でA店,B店のみで種類がA,B以外の月ごとで地域ごとの合計金額を集計して表にするようなマクロを作るにはどうすればよいでしょうか?
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
<サンプルデータ> 6月1日 A店 A町 A 160 6月2日 B店 B町 B 100 6月2日 C店 B町 C 150 7月1日 Z店 Z町 Z 200 A1~E4 のセルにそれぞれ入力されています。金額は計算できるように数値です。 A列は日付。 このとき、 ・A店の金額だけを集計 =SUMPRODUCT((B1:B4="A店")*(E1:E4)) ・6/1~6/30 の金額だけを集計 =SUMPRODUCT((A1:A4>=DATE(2006,6,1))*(A1:A4<=DATE(2006,6,30))*(E1:E4)) ・6/1~6/30 のA店の金額だけを集計 =SUMPRODUCT((A1:A4>=DATE(2006,6,1))*(A1:A4<=DATE(2006,6,30))*(B1:B4="A店")*(E1:E4)) のように SUMPRODUCT 関数で求められます。 途中ある * (アスタリスク)は論理積、つまり AND の代わりだと理解して 良いです。条件をこれで連結しています。 VBA より手軽でいいと思いますよ。
その他の回答 (5)
- TTak
- ベストアンサー率52% (206/389)
検索までVBAでやると、ループ処理が要りますので、データ数が増えるほど処理が遅くなります。どうしてもVBAでやるなら、VBAでオートフィルタを操作すれば良いと思われます。私はSUBTOTAL関数と、オートフィルタを組み合わせて使っています。コーディングが楽です。 コードの順序は 1) 日付~種類のフィールドにオートフィルタをかけます。 2) 金額フィールドの最下段にオートフィルタ対応の合計金額の計算式入力。 3)オートフィルタで絞り込み 4) 2)の結果の値のみを張り付け 5)オートフィルタ解除 となります。 検索条件をその都度入力したい場合は、3)にINPUTBOX関数などを使うと良いでしょう。
- ipsum11
- ベストアンサー率21% (55/251)
すごい適当なので、後は自分で直してみてください。 For c = 1 To 5 If s = "" Then s = Cells(c, 1) ElseIf Month(CDate(s)) <> Month(CDate(Cells(c, 1))) Then Debug.Print Year(CDate(s)) & "/" & Month(CDate(s)) & "" & g & "円" g = 0 End If If (Cells(c, 2) = "A店" Or Cells(c, 2) = "B店") And (Cells(c, 4) <> "A" And Cells(c, 4) <> "B") Then g = g + Val(Cells(c, 5)) End If s = Cells(c, 1) Next c Debug.Print Year(CDate(Cells(c - 1, 1))) & "/" & Month(CDate(Cells(c - 1, 1))) & "" & g & "円" ちなみに、結果を新しいブックに出力することも可能です。上記の例で、「Debug.Print ~」の部分をファイル出力に変えてやればできると思います。 ファイル出力に関しては、調べてみてください。
- chem_taro
- ベストアンサー率32% (33/101)
VBAを使うのであれば、どんなに複雑な計算でも可能ですが、BASIC(プログラミング)の知識が必要になります。 BASICを扱ったことがないのであれば、おすすめできません。
- chem_taro
- ベストアンサー率32% (33/101)
#1の訂正です。 6/1,A店,A町,A,160円,※1,※2 ※1(F)は =IF(AND(OR(B2="A店",B2="B店"),AND(D2<>"A",D2<>"B")),1,0) ※2(G)は =F2*G2 ようは※1で条件にあうもののみ1をかえし、あわないものを0をかえし、それを合計にかけます。
- chem_taro
- ベストアンサー率32% (33/101)
VBAを使ってマクロで解決できるならその方が早そうです。もし、関数のみでするなら =IF(AND(OR(B2="A店",B2="B店"),AND(D2<>"A",D2<>"B")),1,0) という関数を入力した列を金額のとなりF列?に入れます。 これで、「支店がA店またはB店である」かつ「種類がAではなくかつBでもない」であれば1が、そうでなければ0が入ります。 次に隣のG列?に =E2*E2 をいれます。 条件に合わない場合E2には0がはいっていますので、金額は0円になります。条件に合う場合のみ、合計金額が入ります。 あとはこれを合計します。 かなりスマートじゃないですね・・・ あとは、アドイン(インストールの際に選ぶオプション)の「条件付合計式ウィザード」を使うっていう手もあるかもです。(こっちの方がスマートかな)
補足
早速の回答ありがとうございます。 VBAで作成するとどのようになりますか? ちなみに結果を新しいブックに出力することは可能ですか?