報告書の作成

VBAはデータの抽出・編集(他のシートやブックからデータを集める)・集計・参照、計算などには適していますが決められたフォームに出力するのには向いていません。特に

  1. ソースの異なる要素を一枚の帳票に印刷する場合(売上実績・受注実績・受注残・売掛金残高など)
  2. 日次・月次の推移表
  3. ヘッダー部やフッター部に数多くの情報を印刷する場合などです

結果的にはVBAではなく関数の機能を使用しますが、次の機能を使用すればデータ件数が少なければVBAなど必要ないかもしれません。

 


 1.SUMIF関数とSUMIFS関数

 

(1)SUM関数との違い

SUM関数が指定した範囲(あるいは個別に指定した)の数字を集計する機能であるのに対して

SUMIF  ・・・単一の条件に適合した数値のみ集計

SUMIFS・・・複数の条件に適合した数値のみ集計 する機能があります。

ここからはしばらく下のデータを使用して説明していきたいと思います(全て架空の名称です)


(2)SUMIF関数

 

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はこの表で表示されている売上年月日を示し、範囲と合計範囲は別のシート(上記の売り上げ明細)を示しています

 


(2)SUMIFS関数

 

SUMIFS関数はSUMIF関数が一つの条件でしか選択できなかったのに対し、複数の条件で選択できます

一般的な表記方法は次の通りです。

SUMIFS(合計範囲,範囲1, 検索条件1 ,範囲2, 検索条件2・・・

合計範囲・・・条件に従って集計する範囲または列を指定する。SUMIFと同じですが記述する

位置が先頭となります。

範囲1    ・・・SUMIFと同じ文法です

検索条件1・・・SUMIFと同じ文法です

 

集計表の実施例  表示例だけでは関数が見えないので、C列とH列の関数を表示させた表も追加します。

緑の文字は売り上げ明細とヘッダー部の日付が一致していることを意味します。赤の文字は売り上げ明細の取引先とこの表のA列の取引先が一致していることを意味します。表示されている金額は二つの条件を共に満たした数字です。売り上げ明細の並び順は関係なく同じ結果となります。欠点は、思うように集計されなかった場合に検証が少し手間がかかることです。

VBAでもピポッドテーブルなどを使用すれば縦横の集計処理はできますが、そのままだと売り上げのない日付が表示されないなどと『書式が決まっている表に転記しにくい』ことです。

 

 

2.ピポッドテーブルの機能を使う

 

 行と列に展開するにはピポットテーブルを使用するのも一般的です。しかしピポットテーブルは要素のない行、列のデータは作成されないので対策する必要があります。

ここでは『列要素を強引に追加する』と『HLOOKUP』を使う方法を紹介します。

まずそのままピポットデーブルを作成してみます。ピポットテーブルの作成方法はここでは詳しくは述べません。次章『小計の値だけを集計』を参照して頂くか、他のサイトを参考に願います。

 

 

 

 

 

 

 

 

 

 

 

  • 日付が飛んでいて1日から31日まで欄ができている表にはコピーしにくいです。
  • VLOOKUP関数が指定した『セルの値』と同じ値のセルを『特定の行』の中から選び出してその右側の情報を表示させるのに対し、HLOOKUP関数は指定した『セルの値』と同じ値のセルを『特定の列』の中から選び出してその『下側』の情報を表示させます。行の並びに関しては(基本的に)呼び出す側と呼び出される側と同じにしておく必要があります。
  • フォームの決まった表から上記の表の数字を呼び出した表とそのセルに登録した関数(の一部)の例を示します。
  • 関数は$をうまく使って右にコピーした時に呼び出す対象がずれないように工夫して下さい

3.作成したBookの形式を変えて保存する

 

上記の事例はVBAを使用していませんが同じBookの他のシートではVBAを使用することもあるでしょう

その場合ファイルの拡張子は『.xlsm』となります。この拡張子の付いたは報告書をメール等で配信するのは不適切な場合があります。

そこで拡張子を『.xlsx』に変えて保存するマクロを紹介します。セーブする時に拡張子を変えて保存するだけなのですが、いくつもの報告書を作成するとなると

  1. 元の『.xlsm』のファイルをセーブし忘れる
  2. 最終報告シートだけのBookを作ろうとした場合手間がかかる
  3. 全く同じ名前の『.xlsm』と『.xlsx』が存在すると誤って削除してしまう危険性がある

 そこでその対策と高速化のため

  • 元のファイルをSAVEした後に拡張子を変えて新規ファイルを保存する
  • 元のファイルをSAVEした後に最終報告シートだけ新規ファイルに保存する
  • マクロをボタンに登録して実行できるようにする
  • 拡張子を変えて保存する場合規則性を持たせる(元のファイル名と異なる名前にする)
  • その規則性を(マクロの中で定義するのではなく)外部化する。具体的には同一ファイルの別のシートにその名前(一部を変える、ファイル名に文字を追加する)の定義をする

以上の実施例を紹介します

 

(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)』で探すことができます