スポンサーリンク
小計機能の改良マクロ
以前の記事で、Excelの小計(集計)機能についてデメリットを愚痴っぽく書いてしまった。
批判的なことを書くだけではしょうがないので、この小計(集計)機能について、使い勝手を改良するマクロを作ってみたものを記す。
動作条件がちょっとやかましいのだが
- 集計において「基準」となる列の1行目に「G」の文字を入れることを条件とする。
「G」の文字は2個以上入れることは不可。
したがって、集計する表は、Excelシートの2行目以降から始まっていて、1行目は空けられていることが条件だ。
「G」は「Group」の「G」ね。 - 集計の「集計する数値フィールド」となる列の1行目に「T」の文字を入れることを条件とする。
「T」は「Total」の「T」ね。 - 集計の方法は「データの個数」「平均」とかはなく「合計」のみ。
というようになる。
私がマクロを作る時はほとんど、自分の必要に強く駆られてなのだが、なぜこのマクロを作ったのかは後述するので、まずは当該マクロを下に記述する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
Sub anotherSubtotal() '集計コマンドを、少し改良。 Dim arr As Variant Dim sumCol As Variant Dim ws As Worksheet Dim totalRng As Range Dim groupCol As Long Dim iniCol As Long Dim endCol As Long Dim c As Long Dim num As Long Dim msg As String On Error GoTo theEnd Set ws = ActiveSheet msg = "この処理は、1行目に「G」を入れた列を基準列として、" msg = msg & vbCrLf & "1行目に「T」を入れた列に集計をかけます。" msg = msg & vbCrLf & "よろしければ、集計セル範囲を選択して下さい。" 'セル範囲を指定するメッセージボックス(Type:=8で指定) Set totalRng = Application.InputBox(msg, "集計セル範囲", Default:=Selection.Address, Type:=8) iniCol = totalRng(1).Column endCol = totalRng.Columns.Count arr = Range(ws.Cells(1, iniCol), ws.Cells(1, endCol)).Value ReDim sumCol(1 To 1) For c = 1 To endCol Select Case arr(1, c) Case "G" If groupCol > 0 Then '1個を超えて「G」がある場合 MsgBox "「G」を入れた列が2個以上あるので、処理中断します。", vbExclamation, "基準列オーバー" Exit Sub End If groupCol = c Case "T" num = num + 1 ReDim Preserve sumCol(1 To num) sumCol(num) = c '集計列に追加 End Select Next c Call appSet totalRng.Subtotal GroupBy:=groupCol, Function:=xlSum, TotalList:=sumCol _ , Replace:=True, PageBreaks:=False, SummaryBelowData:=True Call appReset Exit Sub theEnd: Call appReset Exit Sub End Sub |
小計機能を頻繁に使うなら、個人用マクロブックに追加してみると良いと思う。
正直、細かい動作チェックとかは二の次で、エラーの時は<On Error GoTo>で逃げている。
間に合わせ程度のマクロだ。
動作イメージ
まず、上図の表を、D列「担当者CD」を基準に「販売台数」「売上金額」を集計するとした場合に、基準列の1行目に「G」、集計列の1行目に「T」を入れる。
そしてマクロを起動すると、メッセージが出る。
このメッセージボックスは、セル範囲を指定するよう促すもの。
メッセージにしたがい集計したいセル範囲を、タイトル行を含めて選択する。
そしてメッセージの「OK」をクリックする。
そうすると、通常の小計機能のように、集計が実行される。
以前の記事で、小計機能においては「集計するフィールド」というのをチェックボックスに1個1個チェックを入れていくのが煩雑だということを述べたが、その点だけは解消しようと思ったマクロだ。
まあかなり粗いマクロだとは思うけど、まず小計機能への依存じたいを減らして、ピボットテーブルとか他の機能の使用を増やしていこう。
スポンサーリンク