ken3memo (三流君)

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




[記事一覧、バックナンバーを見る]

2011-03-11

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

D

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

D

操作手順 テストデータ作りでExcelのデータをAccessへコピペする方法

http://www.youtube.com/watch?v=2-t57-38K38

D

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の使い方が不正です。

f:id:ken3memo:20110311033417j:image

セコイエラーの回避方法で、、

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

加藤加藤 2011/03/28 15:59 細かい解説と動画でのご案内、貴重なお時間を頂戴頂きました事心より感謝致します。ありがとうございました。
パソコンが破損し、メールも消え・・地震などの影響もあり なかなかAccessの製作にかかれなかった為に返信が大変遅くなりまして申し訳ございませんでした。
学校を出たわけでもなく・・貧乏会社で経費の限られた中で製作しております。
『Microsoft Access VBA ・・』で検索をかけ、色々やれる事を増やしております。
また、遊びに来るかと思います。
ありがとうございました。

ken3memoken3memo 2011/03/28 22:00 少しは参考になったみたいでよかったです。では、また。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/ken3memo/20110311/1299782074




[記事一覧、バックナンバーを見る]








ブログトップ 記事一覧 ログイン 無料ブログ開設