目次
DLOOKUPで見つからないときは、入力処理を行う
こんにちは。伊川(@naonaoke)です。
DLOOKUP関数で値がみつからないときに、テーブルにデータを入力するのは面倒ですね。
そんな時に、入力するテーブルが自動で表示されたら便利ですよね。
自動でテーブルを起動する技を紹介します。
また、同じような記事を紹介していますので、ぜひ合わせて読んでみてください。
問題提起
(株)IKAWAの阿久 世子男(アク セスオ)は上司から下記の依頼を受けました。
DLOOKUP関数で何も表示されないときに、簡単に処理できるようにしてほしい。
どのような方法があるだろうか?
解決策
・DAO Recordset Nomatch Seekを使って検索する。
レコード追加手順
今回は、すこし、組み合わせるパーツが多いので、難しいかもしれません。
ただし、今回の内容は、テーブル全部を検索します。
あまりにも、データが多いと、処理が遅くなるので、注意しましょう。
レコード追加手順 作成手順その1 データベース確認
上の図のようなテーブルがあります。
社員IDを入力したときに、なにも表示されない場合の処理方法を記載します。
社員IDの更新後処理にコードを記載します。
レコード追加手順 作成手順その2 コードを仕込む
Option Compare Database Private Sub 社員ID_AfterUpdate() Dim ctDBname As String: ctDBname = CurrentProject.Path & "\" & "DLOOKUP2.accdb" Dim Ws As Workspace Dim db As DAO.Database Dim Rs As DAO.Recordset Dim rc As Integer Set Ws = DBEngine.Workspaces(0) Set db = Ws.OpenDatabase(ctDBname) Set Rs = db.OpenRecordset("MT_社員", dbOpenTable) With Rs .Index = "PrimaryKey" .Seek "=", Me.社員ID If .NoMatch = True Then rc = MsgBox("追加処理を行いますか?", vbYesNo + vbQuestion, "確認") If rc = vbYes Then MsgBox "追加処理を行います" DoCmd.OpenTable "MT_社員", acViewNormal, acEdit Else MsgBox "追加処理を中断します" End If End If If .NoMatch = False Then Me![氏名] = DLookup("氏名", "MT_社員", "社員ID='" & Me![社員ID] & "'") Me![部門] = DLookup("部門", "MT_社員", "社員ID='" & Me![社員ID] & "'") End If End With End Sub Private Sub 部門ID_AfterUpdate() Me.[社員ID] = DLookup("社員ID", "MT_社員", "部門ID=" & [部門ID]) Me.[氏名] = DLookup("氏名", "MT_社員", "部門ID=" & [部門ID]) Me.[部門] = DLookup("部門", "MT_社員", "部門ID=" & [部門ID]) End Sub
レコード追加手順 作成手順その3 コードを実行する
デーブルが開きました。
ここで、A006の社員を追加登録します。
追加処理をしない場合は、割愛します。
今回のコードの内容
トランザクションや、DAOなど、難しい内容が多いです。
トランザクションとは、取引の意味です。
イメージ的には、今回の場合においては、社員IDを探す場所を確保するというような意味です。
そして、社員IDを探す、見つける、見つけないというのが、トランザクション(取引)の一環なのです。
ここがポイント
難しい内容は、その英語の意味から、想像します。今回のトランザクションなどは、取引という意味でした。そのトランザクションで、ACCESSがどのような動きをしてるのかを想像すると理解が早まります。
まとめ
難しい内容でも、自分なり理解を深めている阿久 世子男(アク セスオ)です。特に、DAO等このようなことを理解していくとACCESSは本当に面白くなります。
今回のサンプルファイルは、No71です。
わからない事を延々と考えるのは、無駄です。
- なんで作動かないの?
- もうやだ!VBAなんか嫌い!
- ネットで調べても情報がない!
必ず作動するコードが、ここにあります。