VBAはデータの抽出・編集(他のシートやブックからデータを集める)・集計・参照、計算などには適していますが決められたフォームに出力するのには向いていません。特に
結果的にはVBAではなく関数の機能を使用しますが、次の機能を使用すればデータ件数が少なければVBAなど必要ないかもしれません。
(1)SUM関数との違い
SUM関数が指定した範囲(あるいは個別に指定した)の数字を集計する機能であるのに対して
SUMIF ・・・単一の条件に適合した数値のみ集計
SUMIFS・・・複数の条件に適合した数値のみ集計 する機能があります。
ここからはしばらく下のデータを使用して説明していきたいと思います(全て架空の名称です)
SUMIF関数については一般的な行方向で適合したものを選択をする方法で説明します。
一般的な表記方法は次の通りです。
SUMIF(範囲, 検索条件, 合計範囲)
範囲・・・①合計範囲と異なる列で合計範囲と同じ行を指定する
⇒特定の商品、特定の売上日などを集計する時になど使用する
②合計範囲と同じ列で合計範囲と同じ行を指定する
⇒1行の金額が¥10,000以上の行だけを集計する時などに使用する
検索条件・・・基本の書き方は範囲に対して"="のものを検索(抽出)する。
数値の範囲で指定したい時は" "で式をくくる
=(SUMIF(E2:E15,">=10000",E2:E15)
特定の文字列を含むものを指定したい時は"* * "で文字列をくくる
=SUMIF(B2:B15,"*トヨコー*",E2:E15)
合計範囲・・・条件に従って集計する範囲または列を指定する。
上記の例ではE2:E15と表現しいますが行の追加を想定するならばE:Eまたは$E:$Eなどと表現します
集計表の実施例
各日付の売上合計を表示するシートです。VBAは使っていません。
C列はB列の関数を2行だけ表示させています。5行目と8行めでは検索条件が異なっていることがわかると思います。赤で表示したA5、A8はこの表で表示されている売上年月日を示し、範囲と合計範囲は別のシート(上記の売り上げ明細)を示しています
SUMIFS関数はSUMIF関数が一つの条件でしか選択できなかったのに対し、複数の条件で選択できます。
一般的な表記方法は次の通りです。
SUMIFS(合計範囲,範囲1, 検索条件1 ,範囲2, 検索条件2・・・)
合計範囲・・・条件に従って集計する範囲または列を指定する。SUMIFと同じですが記述する
位置が先頭となります。
範囲1 ・・・SUMIFと同じ文法です
検索条件1・・・SUMIFと同じ文法です
集計表の実施例 表示例だけでは関数が見えないので、C列とH列の関数を表示させた表も追加します。
緑の文字は売り上げ明細とヘッダー部の日付が一致していることを意味します。赤の文字は売り上げ明細の取引先とこの表のA列の取引先が一致していることを意味します。表示されている金額は二つの条件を共に満たした数字です。売り上げ明細の並び順は関係なく同じ結果となります。欠点は、思うように集計されなかった場合に検証が少し手間がかかることです。
VBAでもピポッドテーブルなどを使用すれば縦横の集計処理はできますが、そのままだと売り上げのない日付が表示されないなどと『書式が決まっている表に転記しにくい』ことです。
行と列に展開するにはピポットテーブルを使用するのも一般的です。しかしピポットテーブルは要素のない行、列のデータは作成されないので対策する必要があります。
ここでは『列要素を強引に追加する』と『HLOOKUP』を使う方法を紹介します。
まずそのままピポットデーブルを作成してみます。ピポットテーブルの作成方法はここでは詳しくは述べません。次章『小計の値だけを集計』を参照して頂くか、他のサイトを参考に願います。
上記の事例はVBAを使用していませんが同じBookの他のシートではVBAを使用することもあるでしょう。
その場合ファイルの拡張子は『.xlsm』となります。この拡張子の付いたは報告書をメール等で配信するのは不適切な場合があります。
そこで拡張子を『.xlsx』に変えて保存するマクロを紹介します。セーブする時に拡張子を変えて保存するだけなのですが、いくつもの報告書を作成するとなると
そこでその対策と高速化のため
以上の実施例を紹介します
(1)出力するファイルの名前を(モジュールの外で)定義する
VBAでは読み込むファイル、書き出すファイルをそのディレクトリから全て記述する必要があります。全てモジュールの中で記述するのが普通ですが、外部定義した方が業務を他の人に移管する場合や自信のPCを交換する場合に便利です。
ここでは『動作環境』というシートをマクロを運用しているBookに追加して出力ファイル名の定義に使います。たくさん項目がありますが実際に使うのはC2,C12の2つのセルだけです。
(2)ボタンを登録する
コントロールの挿入でボタンを作ります。
①開発リボンを選ぶ
②挿入下の下三角を押す。
③フォームコントロールの一番左上の□を選ぶ。
④カーソルを右下にドラッグして□を作成する
⑤直後にマクロの登録画面が表示されるので、呼び出すマクロを選択する
⑥ボタンの上にカーソルが移動するので表示される名称を編集する
準備に少し手間取りましたがモジュールは以下の通りになります
(1)Sheet1だけのコピーを作成する
Sub TEST12()
Dim FNAME As String
Worksheets("動作環境").Select
FNAME = Range("C12")
Worksheets("Sheet1").Select
ActiveWorkbook.Save
Sheets("Sheet1").Copy 'Sheet1を独立したBookとして作成する
ActiveSheet.Shapes.Range(Array("Button 1")).Select
Selection.Delete '新しいBookのボタンを削除する
ActiveWorkbook.SaveAs (FNAME) '新しいBookを C2の場所、名前で保存する
End Sub
(2)Bookごとコピーを作成する
Sub TEST13()
Dim copybook As String
Sheets("動作環境").Select
copybook = Range("C12")
Sheets("Sheet1").Select
ActiveWorkbook.Save
ActiveSheet.Shapes.Range(Array("Button 1")).Select
Selection.Delete '新しい名前のBookのボタンを削除する
ActiveWorkbook.SaveAs copybook, FileFormat:=xlWorkbookDefault 'Bookを C12の場所、名前で保存する
End Sub
解説 (1)の場合新しいBookを作成するので、元のシートは実行後も画面に残ります
(2)の場合は元のBookの名前を変えてセーブするため、元のシートは残りません
(ですから事前にVBAでセーブする作業が必須になります)
ボタンの名称"Button 1"は、はホームリボンから右端の『検索と選択』▽『オブジェクトの検索と表示(P)』で探すことができます