プログラムの見通しを良くするために
作成するプログラムの流れ、構成をチェックします

プログラムはデータを登録、修正、削除作業を処理するものです
それぞれに処理内容は異なりますが共通部分として
「入力データのチェック」があります

この入力チェックを各項目で実施しています
非連動フォームを作成する02 を参照して下さい
 

プログラムはプロパティの「イベント」タブ内
「更新前処理」に記載されていますので
今回であれば
「処理区分」「費用大項目ID」「費用大項名」「ふりかな」
「更新日時」「レコードの更新」と6箇所で行うことになり
プログラムがとても煩雑になります
 

基本形は
入力チェックをする
OKであれば処理(登録、修正、削除)をする
なので
入力チェックをエラーチェック
処理と登録(Regist)と言うコードを作成して
各項目からエラーチェックに飛ぶ仕組みにすれば
プログラムの見通しはとても良くなります

書き換え前のコードは

これは「ふりかな」の更新前処理コードですが
同様の内容が「費用大項目名」の更新前コードに存在するので
1つのプログラム(コード)が巨大化して流れが掴みにくいです

フロー図のしたがって
エラー処理をするコードを新たに作成して
更新前処理からCall文で飛ぶように書き換えると

このコードではエラー処理を「ErrorOccurred」という独自関数で処理しています
さらに「RestrictON」というモジュール化した独自関数を使って
コードを簡素化しています

書き換え前のコードと比べると
一連の流れが掴み易くなっているのが確認できます

 

このコードの説明をする前にモジュール、独自関数が理解できないと進みませんので
先にモジュール、独自関数の説明をします

モジュールとは

いままでに作成してきたVBAのプログラムは「プロシージャ」と呼ばれます
基本「プロシージャ」は書かれた場所でしか動作しません
今回であればフォーム「M01FRM001」で作成しています

赤色マーキングした上部の表題や
左側の赤枠部分プロジェクトを見れば
今回のプロシージャがフォームM01FRM001に属していることが確認できます
したがって
フォームM02FRM0001で
フォームM01FRM001に属しているプロシージャを動かすことはできません
なぜなら
プロシージャが階層構造で構成されているからです
階層構造については文法の基礎02を参照して下さい

 

話題は変わりますが
EXCELでSUM関数をよく利用すると思います
SUM関数は「シート1」でも「シート2」でも同じように動きます
ACCESSでも同様にSUM関数が利用できます
フォーム1でもフォーム2でも動きます
 

これはSUM関数がどこからでも使える「共通関数」として設定されているからです
この「共通関数」を保存する場所を「モジュール」と呼びます
そして「標準モジュール」とは
フォームやレポート、クエリなど
同じデータベース内のあらゆる場所から呼び出して使う
汎用的プログラムを記述する場所になります

独自関数とは

関数についてはこちらのブログを参照して下さい

文法の基礎03

Functionプロシージャ

今回は標準モジュール「M03共通関数群」として
エラーチェック関数「RestrictON」を作成しています
この構文の詳細説明をします

Functionプロシージャの構文は

となりますので
引数は
CheckTarget
RestrictLong
leng0approve
Title
の4つとなります

この引数を判断して戻り値として
Boolean」型(True Or False)をかえします

 

構文の構造を踏まえてコードを見ていきます
最初のIF文は
IsNull」関数を使って未入力チェックをしています
2つ目と3つ目のIF文は
InStr」関数を使って「“”」「‘」のチェックをしています
最後のIF文は
Len」関数を使って文字数をチェックしています

それぞれのチェックで
問題がなければ「True」を
問題があれば「False」を戻り値としてこの関数から飛び出します

 

そしてこの関数をどこからでも利用できるために
Private宣言をせずにモジュール化しています

 

モジュール化した関数はプログラムの流れを良くするために
別の場所にまとめて保管します
今回は標準モジュール「M03共通関数群」として保管しています

エラー関数ErrorOccurredの仕組み

独自関数が理解できれば改めて説明は必要ないと思いますが
大枠の説明をします
再度コードを表示します

エラー関数ErrorOccurredの引数は「Target」です
「Target」をSelect文で判断して処理を切り分けています
エラー関数を呼び出すきっかけは更新前処理(BeforeUpdate)になりますので
きっかけをあたえた項目(Target) の処理を実行することになります

 

エラー関数ErrorOccurredの戻り値は
初期値として「False」に設定されています
(コードの最初でErrorOccurred=Falseとなっている)
そして判断の中でエラーが発見されると
戻り値を「True」に変更して関数を飛び出します
ErrorOccurred=True
Exit Function

したがって
エラー関数ErrorOccurredはエラーがあれば「True」を
問題がなければ「False」を返すことになります

 

更新前処理コードを確認すると
If ErrorOccurred(Me.ActiveControl.Name) Then
Cancel=True
end If
なので
ErrorOccurredが「True」の時は
キャンセルを有効にするという意味になります

 

BeforeUpdateは引数に「Cancel」を持っていますので
更新前処理でエラー処理結果が「True」の時は
キャンセルが有効となり
更新前処理の実行がキャンセルされることになります

 

プログラムは1つ実行されると必ず次の実行処理に進みます
今回の例で言えば
「費用大項目名」でエラーが発生して処理が中断されても
マウスポインターは次の「ふりかな」項目に移動します
せっかくエラーを発見しても
エラー箇所からマウスポインタ―が移動してしまうと
エラーの修正が不明確になり困ります
そのために
更新前処理ではエラーが発生したら処理を中断する機能が付いています
これでエラー発生時にはマウスポインターは移動せず
エラー発生個所に留まります

 

登録時の再入力チェックもこのエラー関数を使いますが
全項目をチェックする必要があります
しかしエラー関数を呼び出すきっかけ(更新前処理)が存在しないので
特別な方法で呼び出します
その方法については次回となります

ACCESS関連の話はこちらから