- ベストアンサー
エクセルの集計について質問です。
いつもお世話になっております。 集計を使用しないで関数やマクロを使用して計算することは可能でしょうか? こういったリストを 名称 1日 2日 3日… りんご 1 0 3 りんご 0 0 1 みかん 1 1 4 なし 0 0 2 みかん 1 0 0 こんな感じに集計したいのです。 名称 1日 2日 3日… りんご 1 0 4 みかん 2 1 4 なし 0 0 2 順番とかは特に拘っておりません。 宜しくお願い致します。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
次のようなマクロを作成しました。 このマクロでは、作成したリストの一番最後の行を入力して、そこから一行明けてから 集計を開始するものです。 リストの最初の行は2行目と固定しています。 後はリストのn0からn行目までのA列の名称を順次コピーして、同じものがある場合、追加しない 無い場合追加する、B列の合計をするというものです。 Sub Macro1() Dim n, n0, k, k0, k1 As Integer Dim v1, s1, ss As Integer ' 'リストの最初の行 n0=2 と固定 n0 = 2 n = InputBox("リストの最後の行番号は") '集計の最初の行 k0 = n + 2 k = k0 For i = 2 To n If i = 2 Then Range("A" & CStr(k)).Value = Range("A" & CStr(i)).Value Else k1 = 0 For j = k0 To k If Range("A" & CStr(i)).Value = Range("A" & CStr(j)).Value Then '同じ名称がある場合 k1 = j End If Next j If k1 = 0 Then '新しい行作成 k = k + 1 Range("A" & CStr(k)).Value = Range("A" & CStr(i)).Value Else k = k1 End If End If 'B列の足し算 s1 = Val(Range("B" & CStr(i)).Value) v1 = Val(Range("B" & CStr(k)).Value) ss = s1 + v1 Range("B" & CStr(k)).Value = ss 'C列の足し算 s1 = Val(Range("C" & CStr(i)).Value) v1 = Val(Range("C" & CStr(k)).Value) ss = s1 + v1 Range("C" & CStr(k)).Value = ss 'D列の足し算 s1 = Val(Range("D" & CStr(i)).Value) v1 = Val(Range("D" & CStr(k)).Value) ss = s1 + v1 Range("D" & CStr(k)).Value = ss 'E列以降も必要ならここに追加する Next i End Sub ここまでです。取り合えずのプログラムですので、入力エラーなどには対応していません。 それと指定した行番号以下のセルは自動的に上書きしてしまいますので、動かすときは オリジナルデータを保存しておいてから、テスト実行でお願いします。 必要なデータが消えてしまわないように注意お願いします。
その他の回答 (1)
- laputart
- ベストアンサー率34% (288/843)
例えば集計される部分が2行目から50行目とします (りんご、みかん、なし、りんご、りんご、みかんなどなど) 集計する行を51行目とします。 A51 に りんご を入力 B51には関数で =sumif($A$2:$A50,$A51,B$2:B$50) と関数を作成します これは A2から A50の名称の内 A51と同じものがあれば、その行のB列を合計して B51に計算結果を返すものです。 B51をそのままC,D, Eにコピー可能 建てB52,B53にもコピー可能です。
お礼
回答有難うございます。 申し訳ありません、説明不足でした。 現在、SUMIFを使用しlaputartさんと同じように集計していましたが りんご等の名称は沢山あり入力に手間がかかってしまい、 りんご等の名称を入力させないで質問した通りに関数やマクロで集計結果が 出来ないでしょうかと思いました。
お礼
laputartさんへ 出来ました!まさに私が求めていたものです。 他にもいろいろ応用できそうで助かります。 本当にお世話を掛けました。 有難うございました。