7/01/2023

Excel。VBA。手早く小計機能で処理したいので、プログラムをつくってみた【Subtotal】

Excel。VBA。手早く小計機能で処理したいので、プログラムをつくってみた

<Excel VBA:Subtotal>

Excelの小計機能を使うときには、最初に並べ替えをして、そのあとに、データタブの「小計」をつかって、集計するわけですね。


ただ、処理数が多く、意外と面倒な処理だといえます。


そこで、Excel VBAでプログラムをつくって対応していきます。


次のデータを用意しました。

小計機能

では、次のようにブログラムをつくってみました。


Sub 小計機能()

    With ActiveSheet.Sort

        .SortFields.Clear

        .SortFields.Add2 Key:=Range("b1"), Order:=xlAscending

        .SetRange Range("a1").CurrentRegion

        .Header = xlYes

        .Apply

    End With

    Range("a1").CurrentRegion.Subtotal groupby:=2, Function:=xlSum, totallist:=4

End Sub


実行してみます。


このように、小計処理をおこなうことができました。


では、プログラム文を説明していきます。


色々なプログラム言語とExcel VBAが少々ことなるところは、あくまでも、「Excel」なんだということです。


要するに、Excelのダイアログボックスをつかった処理は、そのダイアログボックスと同じ項目を設定する必要があります。


小計機能は、基準となる列を並べ替え処理をして、まとめておく必要があります。


並べ替えをしているのが、下記の部分です。

    With ActiveSheet.Sort

        .SortFields.Clear

        .SortFields.Add2 Key:=Range("b1"), Order:=xlAscending

        .SetRange Range("a1").CurrentRegion

        .Header = xlYes

        .Apply

    End With


これは、並べ替えのダイアログボックスをみれば、どこを設定しているか、わかります。


「SortFields.Add2 Key:=Range("b1"), Order:=xlAscending」の「SortFields.Add2 Key:=Range("b1")」は、最優先されるキーです。


商品名ごとの集計をしたいので、見出しの「商品名」があるのがB1なので、「Range("b1")」とします。


「Order:=xlAscending」は、順序なので、昇順で並べ替えをしたいので、「xlAscending」と設定します。


「SetRange Range("a1").CurrentRegion」は、並べ替えは自動的に範囲選択をしますので、A1を起点として連続する範囲を、並べ替えの対象とします。


「Header = xlYes」は、先頭行を見出しとして使用するのチェックマークです。


「Apply」は、OKボタンですね。


これで、並べ替えが行われます。


そして、小計機能をおこなうわけです。


この小計機能もダイアログボックスなので、それを設定するように、プログラムをつくってあげます。


Range("a1").CurrentRegion.Subtotal groupby:=2, Function:=xlSum, totallist:=4


出だしの「Range("a1").CurrentRegion.Subtotal」は、A1を起点とした範囲を「Subtotal」=小計します。


「groupby:=2」は、グループの基準です。

左から2列目の商品名を基準として集計しますので、「2」です。


「Function:=xlSum」は、集計方法です。

合計なので、「xlSum」と設定します。


「totallist:=4」は、集計するフィールドです。

左から4列目の売上高の集計をしたいので、「4」と設定します。


これで、小計をすることができます。


また、データ量が増減しても、「CurrentRegion」としていることで、対応することも可能です。