Accessを利用して日付/時刻型でのデータ処理を進めると、ある時に年度処理をする場合にどうすれば良いかという壁に当たることがあります。実は、Accessでの日付処理は「年」単位で1月を始期とした処理をすることはできますが、「年度」の処理(例えば4月を始期とした処理)はAccessに備え付けの区切り単位には含まれていません。
そこで、VBAによるデータ処理をして結果を返す必要がありますので、サンプルデータを用いて年度処理をする方法を見ていきましょう。なお、テーブル・クエリの作成方法についての説明は、以前の記事に譲ることとします。
サンプルデータについて
まず、サンプルテーブルとして以下のフィールドを設定し、サンプルデータを格納します。
表1 サンプルテーブルの構造
フィールド名 | データ型 |
品目 | 短いテキスト |
数量 | 数値型 |
購買日 | 日付/時刻型 |
表2 サンプルデータ
品目 | 数量 | 購買日 |
えんぴつ | 5 | 2019/12/19 |
消しゴム | 1 | 2019/12/20 |
ボールペン | 2 | 2020/01/07 |
ノートブック | 9 | 2020/03/01 |
筆箱 | 2 | 2020/04/04 |
表2に示すように、購買日は2019年から2020年にまたがったデータを用意しました。今回は、「購買日」フィールドの値を使って年度処理をしたいと思います。つまり、サンプルデータの場合では2019年度の購買か、2020年度の購買かが分かるような仕組みを設けたいと思います。
年度識別モジュールの作成
さて、購買日で年度の識別を行うとしましたが、まずは標準モジュールを作成してデータの処理を行えるようにします。以下の記事では、標準モジュールから簡単なソースコードの記入方法までを紹介していますので、ご参考ください。
今回の場合は、「購買日」フィールドの値を受け取って、そのレコードがどの年度に属するかを判定し、結果を返すというモジュールを作成します。この際、戻り値がありますので、Functionモジュールを作成します。
標準モジュールを作成し、表示されたVBA画面で「挿入」タブ→「プロシージャ」をクリックします。続いて、「プロシージャの追加」画面で名前を「Fiscal_Year」、種類を「Functionプロシージャ」、適用範囲を「Publicプロシージャ」としてOKをクリックします。
これにより、図2に示すソースコードが追加されます。
モジュールには、「購買日」フィールドの値 (引数) を与える必要がありため、「Fiscal_Year()」のカッコ内に引数を表す、「koubai_date」を、また戻り値は「年度」を表す整数値にしますので、「As Integer」を追記します。したがって、モジュールの開始は次のように記載します。
Public Function Fiscal_Year(koubai_date) As Integer
さて、ここからソースコードを書いていきます。年度の識別は、例えば2020年1月7日の場合、「月」が1月であることから2019年度と判断しますが、「2020年1月7日」には「2019」という数字が出てこないため、「2020年」から1年さかのぼった値として演算する必要があります。
この際に、Format関数を用いると、購買日の「年」を取得することができますが、取得時のデータ型は「文字列型」として識別されるため、CInt関数を用いてキャストをする必要があります。
ここで、キャストとはあるデータ型を別のデータ型に強制的に変換することを言い、CInt関数は、数値型に強制的に変換する関数となります。
処理の流れとしては、「購買日」フィールドの「月」を取得し、この値が1月、2月あるいは3月の場合は、「購買日」フィールドから取得した「年」を1年さかのぼり、それ以外の月はそのまま「年」を反映するとします。
以上をソースコードで書くと次のようになります。
Public Function Fiscal_Year(koubai_date) As Integer 'koubai_Month変数を文字列型として宣言 Dim koubai_Month as String 'koubai_Month変数に「購買日」の月を代入する。 koubai_Month = Format(koubai_date, "mm") '購買日の「月」が1月、2月あるいは3月の場合の処理。 If koubai_Month = "01" Or koubai_Month = "02" Or koubai_Month = "03" Then'購買日の「年」を取得し、1を引き、数値型としてFiscal_Year(戻り値)に代入する。
Fiscal_Year = CInt(Format(koubai_date, "yyyy") - 1)
Else
'購買日の「年」を取得し、数値型としてFiscal_Year(戻り値)に代入する。Fiscal_Year = Format(koubai_date, "yyyy")
End If
End Function
なお、条件分岐の場合には「If文」を用いますが、記載方法は次の通りです。(Elseに係る記載は省略可能です。)
If 条件式 Then
条件式がTrueの場合の処理
ElseIf 条件式 Then
ElseIfの条件式がTrueの場合の処理
Else
上記の条件にいずれも該当しない場合の処理
End If
以上のソースコードを入力後、作成した標準モジュールは「Module1」として保存します。
年度を表示するクエリの作成
まずは、先に紹介した記事を参考にクエリを作成してください。ここで、追加するテーブルは「サンプルテーブル」で、クエリの【フィールド】項目には、「品目」、「数量」及び「購買日」フィールドを追加します。さらに、「会計年度」フィールドとして【フィールド】項目の最終列に
「会計年度: Fiscal_Year([購買日])」
と入力します。
さて、これで準備はできましたのでデータシートビューに切り替えてみましょう。すると、図5に示すように「会計年度」フィールドは「購買日」フィールドの値から演算した値が返されます。
サンプルの場合は、購買日が「2020/04/04」のレコードについて会計年度が「2020」になっています。
まとめ
今回は、VBAとクエリを組み合わせてAccessで会計年度の出力方法について紹介しました。このように、標準モジュールを作成することで、クエリやフォーム等で作成したモジュールを使用することができ、データ処理を効率良く行うことが可能です。
また、VBAのソースコードは様々なライブラリを用いることで様々な演算処理ができますので、ご自身でも色々と調べていただけると活用の幅が広がるかと思います。
スポンサーリンク
コメント