初歩的な事で恐縮ですがご教授お願いします。
フォームからテーブルを更新しますが、フォーム上で更新したレコードのみを対象に
処理したいのですが、下記コードで上手くカレントレコードに移動する処理ができない様です。
下記は簡単ですが実際はもう少し込み入った処理をしたいのでVBAで実施したいのです。
よろしくお願いいたします。
Private Sub 名字_AfterUpdate()
Dim db As Database
Dim rs As Recordset
Dim cr As Long
Set db = CurrentDb
Set rs = db.OpenRecordset("名簿")
cr = CurrentRecord
rs.Move cr
rs.Edit
rs!氏名 = rs!名字 & rs!名前
rs.Update
Me.Refresh
End Sub
連結フォームでき処理だと思いますので、わざわざ別にレコードセットを開かなくても、すでにレコードセットが開いています。
単純に Me!フィールド名でカレントレコードのデータにアクセスできます。
下記のコードで済むことです。
提示の処理なら、フォームでやらなくても、テーブルの方で、「氏名」フィールドのデータ型を「演算」にしておいて、
式を
[名字] & [名前]
と設定すれば済む話でもあります。実際の処理ではないとは思いますが、式で表現できることならこちらの方法でもいいでしょう。
hatena様 回答ありがとうございました。
連結フォームからならレコードセットを開かず処理ができるのですね。初めて知りました。。。
またカレントレコードの処理も勉強になりました。テーブルのデータ型を演算で処理する方法も
初めて知りました。実際の処理はたしかに別の形になりますが、このような処理をする場合は
クエリを使うものと考えていました。
Accessは使い始めて1年ぐらいで大変勉強になりました有難うございました。
今後ともよろしくお願いいたします。
もう1点ご教示頂きたくよろしくお願いします。
上記と同じ条件で連結フォーム上の同一レコードに複数のテキストボックスボックスがあり、
上記の Me!氏名 = Me!名字 & Me!名前 の処理と同じ処理をテキストボックスすべてに実施したいのです。
実際は処理部分がもっと長いため、AfterUpdate()のプロシージャ内にモジュールに記載したコードを
callで呼び出したいと考えていますが、その場合にはどのように記載すれば良いでしょうか。
よろしくお願いいたします。
『モジュールに記載したコード』というのはどのモジュールでしょうか。フォームモジュールでしょうか。そとれとも、標準モジュールでしょうか。
フォームモジュールなら、
あるいは、
でいいはずですが、それでだめでしたか。
標準モジュールだと
Me
は使えないので、その部分はCodeContextObject
に変更するなどする必要があります。言葉足らずで申し訳ありません。標準モジュールに記載することしか考えられていませんでしたが、
同一のフォームモジュールに記載して各テキストボックスのAfterUpdateからcallで呼び出したほうが良いですね。
動作を確認することができました。まったく気が付けませんでした。
これが当初にやりたかった事と一番マッチしております。大変勉強になりました。
本当に有難うございました。今後とも何卒よろしくお願いいたします。
そのフォームでしか使わない処理なら、フォームモジュールに記述するのがいいですね。
他のフォームでも使う場合があるなら、標準モジュールですね。その場合、前の回答に示した通り、Me を CodeContextObject に変更すればいいです。