Access 得意先マスタを VBA モジュールを使った開発方法を紹介します。

テクノデービー時代に作成した自社の社内システムの得意先マスタを参考に説明したいと思います。
又、下の方には、以前作成した動画も設置しています。動きなど参考にして頂ければと思っています。

作成している得意先画面の説明

画面の項目名はだいたい漢字4文字に統一しています。 しかし、それでは素人さんで分かりずらいと言う人の為に画面下にメッセージ欄を設けてカーソルが止まった項目の意味や注意点などを設定できるようにしています。

項目名の色は、基本的に黒色なのですが、下記の青色部分は。 「ここでは曖昧検索が出来ますよ。 」と言う意味で青色にしています。

ご覧のように、コンボボックスがありません。 これは、弊社の特徴の一つです。 この部分はモジュールで説明します。
コンボボックスは表示スペースが広く必要なので、あちこちにコンボボックスが存在すると画面作成が難しくなってしまいますが、ここでは無いのでスッキリした画面になっています。

画面下欄で項目名が無いところは、お客様ごとに項目名を設定できるようにしています。

  • 5個のマスタの設定(地区、業種など)
  • 3個の文字データ入力の設定(最終卒業、最寄駅など)
  • 3個の数値データ入力の設定(ランク付けなど)
  • 3個の日付データ入力の設定(〇〇会員登録日など)

ボタン

  • メモ(日付、件名、本文、担当名などの登録や、メール内容の自動登録なども可能)
  • 関連ファイル(見積書、店舗画像などのあらゆるファイルとその保存場所を登録しておき、必要な時、瞬時に開けるようにする)
  • 送付先情報(会社の代表者以外、総務、経理、営業などを登録)
  • 所属・同好会(この得意先は、どんなどんな会に所属してあるか、登録した所属単位にメモやメール発行が可能)
  • 趣味特技(趣味や特技の登録)
  • 家族構成
  • 売上履歴(売上伝票で入力した明細を表示できます。 )
  • 請求・月次(月単位の請求書の前月残、入金、売上、消費税、今回請求などの情報を参照できます。 )

これ全てを紹介する事は無理と思いますが、少しづつ追加して行きたいと思います。

BB のフォーム(画面)の開発手法

画面作成で常に一定して設定しているもの

  • ラベル、入力コントロールの高さ:0.48 に固定しています。
  • 背景色:#B9D2F1 (季節に合わせたり、アキがきたら変更しています。 )
  • フォント:MS ゴシック
  • フォント サイズ:11
  • 上余白:0.03

コントロールの設定

  • 幅は、ラベルは、「顧客番号」など全角4文字で 1.8 入力欄は、ここでは電話番号をコードとしていますので、092-273-1410 は 2.9 にしています。 これらの値は、実際に文字を入力して表示されるのを確認して決めています。
  • 顧客番号のラベルの位置は、上:0.5 左:0.5から 設定しています。 左側優先の上から下方向へコントロールを設定しています。
  • 下側には、現在値 0.5 の場所に 0.56 を加算した値を次の「顧客名」とし、更に 0.56 加算した場所を「フリガナ」のようにしています。
  • 横方向には、ラベルと入力コントロール間は、0.1に、又、右と左と 2 列ある場合は、上図のようにグループ化して、01 を原則として配置しています。

このように決めておくと、悩まず、いつも同じような画面になります。 業務で使う画面ですのでわかりやすく、入力欄があちこちバラバラにならないように単純にしています。 デザイン性は無いかもしれませんね。

タブ移動順の設定

タブ移動順は、0 から コントロールを下の方へ、下までいったら右側をまた、上から下の方へと順番につけています。

IMEの設定

通常は、IME 入力モードに、「オフ」と「ひらがな」を使用し、アプリの内容に合わせて 「半角カタカナ」なども使います。

使用可能、編集ロックの設定

上図では、営業所NO、担当番号、敬称など、値を入力するところは通常のままですが、その値に対して営業所名や担当者が表示される部分は、使用可能:いいえ、編集ロック:はい に設定しまう。 よって実際入力される部分は、これの逆になります。

立体表示の設定

  • 入力項目は全て、「くぼみ」
  • 表示のみの場合、「いいえ」
  • 表示+上書有の場合は、「くぼみ」背景スタイルを「透明」にしています。

上図の営業所NO欄のように、通常営業所番号は初期値として 001 を表示、しかし、変更したい場合もあるので、背景色を「透明」に設定
又、例えば、商品コードを入力したて商品名を表示する場合、商品の色など入力したいなどの商品名欄も「くぼみ」の背景スタイルを「透明」にしてします。

その他の設定

  • 入力規制:ここは、1 から 12 までの値という場合などアプリに合わせて設定します。
  • 文字配置:標準、左、中央、右

など、他にもアプリに応じて設定を行います。

次が、だいたいモジュールの設定になりますが、モジュールは、別ページとして次回紹介致します。

恥ずかしいですが、下記の動画を参考にして下さい。

尚、他にも動画をご覧になりたい場合は、YouTube で「社内システム商助」「井手 弘行」などで検索して下さい。

ここからはモジュールに入ります

ここで説明する内容は、BB が我流でやっている事であって、決してこれが正しいソフト開発方法です。とは言っていません。ただ、これまでこの方法でプロとしてやって来ましたので興味のある方は参考にされたらどうでしょうか。という気持ちで投稿しています。インデントは、3 です。WordPress では半角の空白が上手く表現できないため見にくいです。一旦メモ帳などにコピーして見やすいように整理して見て下さい。

可笑しな点や、もっといい方法もあるかも知れません。この点はご理解下さい。

又、どうしても理解できない。サポートして欲しい。という場合は、弊社の有料サポートにはなりますが、「Q&R」をご利用下さい。

得意先マスタ画面を「開く時」のモジュールの一部を表示します

Private Sub Form_Open(Cancel As Integer)
On Error GoTo ERR_Form_Open
   Set DB01 = CurrentDb
 得意先マスタの右側にボタンが並んでる部分の処理で BB 特有の作り方です。
   TK_XXX という基本テーブルから入力専用の TN_XXX テーブルを作成します。
   この TK_XXX テーブルは絶対に削除しません。
   下記は、たくさんの一時テーブル TN_XXX を一括して削除する時に使用します。
   ここでは、メモ、関連ファイルなどボタンを押した時に使用するファイルです。
   For IT01 = 0 To DB01.TableDefs.Count – 1
      If DB01.TableDefs(IT01).Name = “TN_URI” Then DoCmd.DeleteObject acTable, “TN_URI”
      If DB01.TableDefs(IT01).Name = “TN_KAK” Then DoCmd.DeleteObject acTable, “TN_KAK”
      ・・・・ 省略 ・・・
   Next
   一旦削除しましたが、入力用に再度、新しく作成します。
   SSQL = “SELECT * INTO TN_URI FROM TK_URI;”: DB01.Execute SSQL
   SSQL = “SELECT * INTO TN_KAK FROM TK_KAK;”: DB01.Execute SSQL
   SSQL = “SELECT * INTO TN_MEM FROM TK_MEM;”: DB01.Execute SSQL
      ・・・・ 省略 ・・・
 自由項目設定の処理
   SSQL = “SELECT * FROM TM_JSA;”
   Set DN01 = DB01.OpenRecordset(SSQL, DB_OPEN_DYNASET)
   If DN01.EOF Then
   Else
      設定している項目名(ラベル名)を代入し表示します。
      Me.KMMST1 = IIf(IsNull(DN01!JSAMS1), “”, DN01!JSAMS1) ‘マスタ項目1(マスタ項目2から6は省略)
      Me.KMMOJ1 = IIf(IsNull(DN01!JSAMJ1), “”, DN01!JSAMJ1) ‘文字項目1(文字項目2から3は省略)
  Me.KMSUT1 = IIf(IsNull(DN01!JSAST1), “”, DN01!JSAST1) ‘数値項目1(数値項目2から3は省略)
      Me.KMHDK1 = IIf(IsNull(DN01!JSAHD1), “”, DN01!JSAHD1) ‘日付項目1(日付項目2から3は省略)
  ラベル名が設定された項目は、入力出来るが、ラベル設定が無い項目は入力出来ない。
      If Len(Trim(DN01!JSAMS1)) = 0 Or IsNull(DN01!JSAMS1) Then マスタ項目(2から6は省略)
         Me.TOKMS1.Enabled = False
      Else
         Me.TOKMS1.Enabled = True
      End If
      If Len(Trim(DN01!JSAMJ1)) = 0 Or IsNull(DN01!JSAMJ1) Then ’文字項目(2と3は省略)
         Me.TOKMJ1.Enabled = False
      Else
         Me.TOKMJ1.Enabled = True
      End If
  数値項目 文字項目を同じ要領なので1から3を省略します。
  日付項目 文字項目を同じ要領なので1から3を省略します。
   End If
   DN01.Close
 営業所マスタから営業所名を読込、表示します。
 Me.TOKEGN = DLookup(“EGSNME”, “TM_EGS”, “EGSCOD='” & Me.TOKEGC & “‘”)  ‘営業所名
 F05ファンクションキーや、ボタンを押した時と同じで、全ての入力された値をクリアーにして画面を初期状態にする。
 F05_Click
EXIT_Form_Open:
 Exit Sub
ERR_Form_Open:
 Resume EXIT_Form_Open
End Sub

得意先マスタの「日付欄の更新後処理」のイベント プロシージャ

変数名 TOKTRB は、得意先:TOK 登録:TR 日:B のように名前を付けています。最初と最後の青色部分は、エラー処理部分です。

Private Sub TOKTRB_AfterUpdate()  
On Error GoTo ERR_TOKTRB_AfterUpdate
   If IsNull(Me.TOKTRB) Then
  ここでは、空白になったら今日の日付を登録日として代入します。
      Me.TOKTRB = Format(Date, “yy/mm/dd”)
   Else
  部品を使って 1、1/15、10/5、10/15 などの値を yy/mm/dd に変換します。
      Me.TOKTRB = TDBHDKNRK(Me.TOKTRB)
   End If
EXIT_TOKTRB_AfterUpdate:
   Exit Sub
ERR_TOKTRB_AfterUpdate:
   MsgBox Err.Description:Resume EXIT_TOKTRB_AfterUpdate
End Sub

今日が、2017/11/30 として、得意先の新規登録時に、登録日は、17/11/30 と表示されます。

ここで、日付を 17/11/15 に変更したい場合は、15 + Enter、17/10/25 に変更したい場合は、10/25 + Enter と簡単に入力が行えるようにした部品です。

殆どのシステムで日付入力があります。お客様の要望に合わせて西暦表現と和暦表現を作成しておけば開発がとても楽になり良いですよ。

部品名 TDB:テクノデービー HDK:日付関連 NRK:入力用 の意味です。

Function TDBHDKNRK(PR01 As String)
On Error GoTo ERR_TDBHDKNRK
   ‘日付の入力 1、12、3/1、4/23などを現在日付に変換する
   Dim HIDK As String, ST01 As String
 TDBHDKNRK = 1
   HIDK = Format(Date, “yy/mm/dd”)
 値が、1 から 9 までの数字の場合
   If Len(LTrim(RTrim(PR01))) <= 2 Then
      ST01 = Left(HIDK, 6) + Right(“00” + Trim(PR01), 2)
   End If
 If Len(Trim(PR01)) = 3 Then
      値が3桁の文字で、1/1 などの値
      If Mid(PR01, 2, 1) = “/” Then
         月、日が 1 桁の場合は、0 を加えて 2 桁にし、17/10/30 のようにする
         ST01 = Left(HIDK, 3) + Right(“00” + Left(PR01, 1), 2) + “/” + Right(“00” + Right(PR01, 1), 2)
      End If
   End If
   If Len(Trim(PR01)) = 4 Then
      If Mid(PR01, 2, 1) = “/” Then
    値が 4 桁で、1/15
         ST01 = Left(HIDK, 3) + Right(“00” + Left(PR01, 1), 2) + Right(PR01, 3)
      Else
         値が 4 桁で、10/1 
         ST01 = Left(HIDK, 3) + Left(PR01, 3) + Right(“00” + Right(PR01, 1), 2)
      End If
   End If
   If Len(Trim(PR01)) = 5 Then
      値が 5 桁で、10/30 のような日付
      ST01 = Left(HIDK, 3) + Right(PR01, 5)
   End If
   If Len(Trim(PR01)) = 8 Then
      直接 17/10/30 の入力
      ST01 = PR01
   End If
   この当時は、1900 年から 2000 年の2つが発生していたからの処理、今では不要
   IT01 = IsDate(IIf(Left(ST01, 1) > “5”, “19”, “20”) + ST01)
   If IT01 = 0 Or Len(ST01) <> 8 Then
      ERMD = MsgBox(“日付入力が正しくありません。”, 16, “日付/時間の確認”)
      Exit Function
   Else
      If CVDate(ST01) + 180 < Date Then
         MsgBox (“入力された日付が極端に古い日付です。間違いないか確認をして下さい。”)
      End If
  受けた時のパラメータに値を返す
      TDBHDKNRK = ST01
   End If
EXIT_TDBHDKNRK:
   Exit Function
ERR_TDBHDKNRK:
   MsgBox Err.Description:Resume EXIT_TDBHDKNRK
End Function

Access95 時代からたくさんのアプリを作りましたので、その時代の部品だと思います。気づいた部分は適当に変更して活用して下さいネ。