三流君 ken3のmemo置き場

三流プログラマーのメモ書きです。主にVBAやWindowsの話題が多いです

挨拶・自己紹介:
失敗続きのAB型の変わり者 :三流プログラマー Ken3です
フリーのエンジニア・個人事業主です・・と書くと聞こえはイイが(それとなくカッコよく聞こえるが)、 現在は小さな案件の受注請負 と 短期派遣 で 日々つつましく?ほそぼそと暮らしてます。

よく検索されるキーワード: [質問回答XXXXさんへ] [CreateObject] [VBA] [JRA競馬オッズ]

QA110308 Access 更新前処理で値をチェック、親IDを調べてセットする

Access2007で顧客管理を製作中です。

テーブル「T-顧客」
⇒フィールド 
顧客ID/親ID/顧客名1/顧客名2/営業所・支店/郵便番号/住所1/住所2/電話番号 等々・・・・
に、フォームを使って 新規登録をする際
既に登録済みの本社があるとして⇒その営業所を登録する場合
親ID(=本社の顧客ID)を入力すると
顧客名1に自動的に会社名が入る様にcopyできるVBAを教えて下さい

サブフォームを使用して、親ID(=本社の顧客ID)を入力すると
自動的に会社名を表示させる事は、すでに行っていますが、
テーブルに登録させてしまう方法で苦戦しております)

と、質問をいただく

作成したコード(完成したコード)

親IDの更新前処理に、下記のコード(VBA)を追加して、
親IDを使用して、テーブルから顧客名を DLookup関数で取得、単純にセットしてみました。

Private Sub 親ID_BeforeUpdate(Cancel As Integer)
    '更新前にデータチェック

    Dim strID As String
    Dim strNAME As String  '顧客名1
    Dim strNAME2 As String '顧客名2
    
    strID = Trim("" & Me.親ID)  '親IDを保存
    If strID = "" Then Exit Sub '親ID未入力なら何もしない
    
    'IDを使って、顧客名を取得
    strNAME = "" & DLookup("顧客名1", "T-顧客", "顧客ID = '" & strID & "'")
    '↑DLookup ほしいフィールド, テーブル/クエリーなどの場所, 条件
    
    '取得データのチェック と セット
    If strNAME = "" Then  '親が見つからなかったら、エラーメッセージ
        MsgBox "ID " & strID & "の顧客が存在しません、確認してください"
        Cancel = True '処理をキャンセル(カーソルを戻す)、キャンセルの無限ループに注意
    Else
        Me.顧客名1 = strNAME  '取得したデータ(顧客名1)をセット
        '再度2を読み込み、2もセット 同じIDを使って、顧客名2を取得
        strNAME2 = "" & DLookup("顧客名2", "T-顧客", "顧客ID = '" & strID & "'")
        Me.顧客名2 = strNAME2  '取得したデータ(顧客名2)をセット
    End If

End Sub

試行錯誤の動画、いつものデバック風景

なんて感じで、サクっとコードを書いたけど、
いつものようにハマってしまいました。
※面倒なので動画はノーカットです。30分お楽しみください。ほんと何やってんだろ私は...

http://www.youtube.com/watch?v=QXRqxd7QyNY
www.youtube.com

0:00〜 データの準備
04:30〜 フォームの作成
09:00〜 入力IDのチェック
12:55〜 DLookup関数がNullを返す
15:40〜 データ無しの時、再入力させたい
20:45〜 蛇足で顧客名2をセット
25:20〜 テストとまとめ、再度しつこく説明

処理のポイント

処理のポイントを簡単に書きます。

0:00〜 データの準備 04:30

テーブルを1つ作成しました。

テーブル「T-顧客」
⇒フィールド 
顧客ID/親ID/顧客名1/顧客名2/営業所・支店/郵便番号/住所1/住所2/電話番号

作成方法は、手抜きで いつものように Excelに貼って、から、Accessにコピーしました。

Excelでデータ 区切り位置を使用して(AKB48名前・誕生日・愛称)を分割する
http://www.youtube.com/watch?v=uK5MrvtyBX0
www.youtube.com

操作手順 テストデータ作りでExcelのデータをAccessへコピペする方法
http://www.youtube.com/watch?v=2-t57-38K38
www.youtube.com

04:30〜 フォームの作成とタイミングの確認

処理のタイミングを確認したかったので、
MSGBOX などを入れて、確認しました。
※更新後処理に、間違ってコードを書いて確認していたけど。

09:00〜 入力IDのチェック

strID = Trim("" & Me.親ID) '親IDを保存
If strID = "" Then Exit Sub '親ID未入力なら何もしない


09:50〜 DlookUP関数でデータを取り出す

'IDを使って、顧客名を取得
strNAME = "" & DLookup("顧客名1", "T-顧客", "顧客ID = '" & strID & "'")
'↑DLookup ほしいフィールド, テーブル/クエリーなどの場所, 条件

12:55〜 DLookup関数がNullを返す

データ無しの時、DLookup関数がNullを返すので

実行時エラー '94':
Nullの使い方が不正です。

セコイエラーの回避方法で、、
strNAME = "" & DLookup("顧客名1", "T-顧客", "顧客ID = '" & strID & "'")
と、""を頭に付けてみました。

15:40〜 データ無しの時、再入力させたい

データ無しの時に再入力させたかったので、
更新前処理 _BeforeUpdate(Cancel As Integer)
で、
Cancel = True
を使用する。
※更新後処理でSetFocusは効かないので、更新前処理で処理キャンセルにする。

20:45〜 蛇足で顧客名2をセット

蛇足で、顧客名2も追加で読み込んでみた。
一度に DLookupで顧客1と2が取得できないので、
再度取得しただけでした。

        '再度2を読み込み、2もセット 同じIDを使って、顧客名2を取得
        strNAME2 = "" & DLookup("顧客名2", "T-顧客", "顧客ID = '" & strID & "'")
        Me.顧客名2 = strNAME2  '取得したデータ(顧客名2)をセット

25:20〜 テストとまとめ、再度しつこく説明

テスト実行させながら、再度プログラムの説明をしつこくしてます。。。

おわりのあいさつ

更新前処理 _BeforeUpdate でデータチェック
DLookup関数でデータ取得 データ無しの時 Null が返ってきます。
Cancel=Trueでキャンセル(再入力)

そんなお話でした。
何かの参考となれば幸いです。 三流プログラマー Ken3

Ken3 ホームページ 目次

分類:HPを大きく分けると4つの柱(分類)です。

  1. [VBA・マクロ プログラミング]の解説
    当店の人気はVBA系のCreateObject("XXXXXX.application")で他のアプリケーションを操作するサンプルが人気です
  2. [プログラマーの愚痴]では、あまり見せたくない三流プログラマーの内面かな。
    三流君を踏み台にする
  3. [古いクラシック ASP(Active Server Pages)]の解説。
  4. [元コンビニ店長時代の話]が弟に巻き込まれ、失敗した脱サラ、畑違い?の仕事で失敗。
主に上記4つの分類でHP作成やメルマガの発行を行ってます。
※更新頻度が落ちていて情報の鮮度が悪いです。



本当に三流なんです(笑):たまにスゴイですねなんて言われることもありますが、
真実は→ [三流君の真実は...] ←を初めに見てくださるとわかると思います。
(からくりは、成功例↑しか載せてなくて ヒドイ失敗例はお蔵入り迷宮入りが多かったりします)