エクセルマクロ(VBA):ワークシート関数

ミール

2009年08月14日 12:10

経理課で
つり銭を印字した封筒を出力するマクロを使って
いますがプリンターが故障して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って、なんて便利なんだろうとつくづく思います。

関連記事