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