エクセルマクロ(VBA):ワークシート関数
経理課で
つり銭を印字した封筒を出力するマクロを使って
いますがプリンターが故障して1日使えなかった
様です。
機械が壊れてはソフトも何の力も発揮できませんね。
「こんな時にコンピュータは困るのよね~」って
愚痴の一つでもこぼされると思っていましたが、
「久ぶりに手書きでやりましたが、
いつもは30分程の作業が
午前中かかってしまいました。
以前はこれが当然の様に仕事を
してましたが今では考えられません。
ありがとうございます。」
と感謝の言葉を頂きました。
嬉しいものです。
*==============================*
では、本題です。
今日は、VBAで使うワークシート関数について
書いてみたいと思います。
エクセルのワークシートで使うSUM関数や
SUBTOTAL関数等がVBAでも使えるので
プログラムを作る上でとても助かります。
例えば、次の処理で考えると
図1
商品毎の売上合計を計算して求めています。
単純にプログラムの流れを考えると、
日付毎に並んでいるデータを
商品毎に並び替えて、
1番目から順番に読んで(参照)いき
商品名が同じなら合計を計算して
商品名が変わった時点で、個数の合計と
売上の合計を出力して、次の商品の
処理を続けていきます。
しかし、VBAではオートフィルターと
SUBTOTAL関数を組み合わせると
繰り返しや分岐を使わなくても簡単に
処理ができます。
プログラムです。
Sub Macro1()
'
Sheets("Sheet2").Select
Range("c3:d6").ClearContents
Sheets("Sheet1").Select
Range("B2").Select
Selection.AutoFilter
Selection.AutoFilter Field:=2, Criteria1:="りんご"
Sheets("Sheet2").Range("C3") = WorksheetFunction.Subtotal(9, Range("D3:D22"))
Sheets("Sheet2").Range("d3") = WorksheetFunction.Subtotal(9, Range("e3:e22"))
Selection.AutoFilter Field:=2, Criteria1:="みかん"
Sheets("Sheet2").Range("C4") = WorksheetFunction.Subtotal(9, Range("D3:D22"))
Sheets("Sheet2").Range("d4") = WorksheetFunction.Subtotal(9, Range("e3:e22"))
Selection.AutoFilter Field:=2, Criteria1:="すいか"
Sheets("Sheet2").Range("C5") = WorksheetFunction.Subtotal(9, Range("D3:D22"))
Sheets("Sheet2").Range("d5") = WorksheetFunction.Subtotal(9, Range("e3:e22"))
Selection.AutoFilter Field:=2, Criteria1:="ぶどう"
Sheets("Sheet2").Range("C6") = WorksheetFunction.Subtotal(9, Range("D3:D22"))
Sheets("Sheet2").Range("d6") = WorksheetFunction.Subtotal(9, Range("e3:e22"))
End Sub
横に長すぎて、見づらいと思いますが、
プログラムの中で、
「WorksheetFunction.Subtotal」という命令が
ありますが、
ワークシート関数の「Subtotal」の前の
「WorksheetFunction」が
ワークシート関数をVBAで使う時に
記述する命令になります。
それでは昨日の記事に書いた、「F8」の
機能を使って一づつ流れを追ってみます。
売上一覧(シート1)があります。
「F8」
オートフィルターがかかります。
「F8」
りんごが抽出されます。
「F8」
シート2にりんごの合計が出力されました。
同じような流れで、「みかん」、「すいか」、「ぶどう」も集計していきます。
ワークシート関数が使えるとプログラミングも楽にできすね。
VBAって、なんて便利なんだろうとつくづく思います。
関連記事