エクセルの備忘録。
下図のようにA列に同じ文字列が隣接する場合に、その文字列ごとのB列の合計値を算出‥それを全ての行に対して手軽に行う方法について。
この例だと同じパスのアセットのファイルサイズを合計したい場面になります。
つまりこうなればOKという訳です。
もっと簡単な表でやってみます。
空欄のC1セルを選んで‥
=IF($A1=$A2, "",SUMIF($A:$A,$A1,$B:$B))
と入力します。こちらは我がエクセル師匠に教えてもらいました。
意味は‥
①(IF部分)もしセルA1がセルA2と同じ値なら今選択しているセルC1は空白にする
②(SUMIF部分)IFに該当しないならA列全体の範囲で値がA1と同じ行のB列を合計する
しかしA列の値がA B A B C Aみたいにバラバラだったらうまくいかないのでソートして固めておかないとダメですね。
さてまだ何も表示されません。
セルをだーーっと最下行までコピーします。
するとA列で同じ文字列が続いた場合は最後の行のC列に合計値が入ります。
それ以外のセルが空白のままというのがミソです。
一番頭に一行挿入してC列をフィルタリング。
空白セルを非表示にします。
これで同じ行をまとめてしまって、ついでにB列の合計値を出せました。
結果を別のシートにでもコピー&ペースト。
いらなくなったB列を削除して完成です。
以上になります。
同じ文字列が隣接する場合にその行を削除してしまいつつも直接B列に合計値を上書けたらもっと手間が省けるのですがVBAでやるしか無いんですかね。。
良い方法をご存じでしたらご教授くださいっ。
*翌日の追記*
検索でこちらのページが見つかり、そのままサックリできました!
Sub Sample() Dim c As Range Dim dic As Object Set dic = CreateObject("Scripting.Dictionary") With Sheets("Sheet1") For Each c In .Range("A1", .Range("A" & .Rows.Count).End(xlUp)) dic(c.Value) = dic(c.Value) + Val(c.Offset(, 1).Value) Next .Columns("C:D").ClearContents .Range("C1").Resize(dic.Count).Value = WorksheetFunction.Transpose(dic.keys) .Range("D1").Resize(dic.Count).Value = WorksheetFunction.Transpose(dic.items) End With End Sub
(上記サイト様より引用させて頂いています)
ついでにA列B列を削除して値の表示形式をユーザー定義でMiB表記に変えて、一定以上の値は赤字に塗るとかも追記してしまうと良さそうですね。