Microsoft Access 掲示板

フォームからカレントレコードのみ更新

6 コメント
views
4 フォロー

初歩的な事で恐縮ですがご教授お願いします。
フォームからテーブルを更新しますが、フォーム上で更新したレコードのみを対象に
処理したいのですが、下記コードで上手くカレントレコードに移動する処理ができない様です。

下記は簡単ですが実際はもう少し込み入った処理をしたいので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

RYU
作成: 2022/07/23 (土) 05:50:59
通報 ...
1
hatena 2022/07/23 (土) 11:24:36 修正

連結フォームでき処理だと思いますので、わざわざ別にレコードセットを開かなくても、すでにレコードセットが開いています。
単純に Me!フィールド名でカレントレコードのデータにアクセスできます。
下記のコードで済むことです。

Private Sub 名字_AfterUpdate()
    Me!氏名 = Me!名字 & Me!名前
    Me.Refresh
End Sub

提示の処理なら、フォームでやらなくても、テーブルの方で、「氏名」フィールドのデータ型を「演算」にしておいて、
式を [名字] & [名前] と設定すれば済む話でもあります。
実際の処理ではないとは思いますが、式で表現できることならこちらの方法でもいいでしょう。

2

hatena様 回答ありがとうございました。

連結フォームからならレコードセットを開かず処理ができるのですね。初めて知りました。。。

またカレントレコードの処理も勉強になりました。テーブルのデータ型を演算で処理する方法も
初めて知りました。実際の処理はたしかに別の形になりますが、このような処理をする場合は
クエリを使うものと考えていました。

Accessは使い始めて1年ぐらいで大変勉強になりました有難うございました。
今後ともよろしくお願いいたします。

3

もう1点ご教示頂きたくよろしくお願いします。
上記と同じ条件で連結フォーム上の同一レコードに複数のテキストボックスボックスがあり、
上記の Me!氏名 = Me!名字 & Me!名前 の処理と同じ処理をテキストボックスすべてに実施したいのです。
実際は処理部分がもっと長いため、AfterUpdate()のプロシージャ内にモジュールに記載したコードを
callで呼び出したいと考えていますが、その場合にはどのように記載すれば良いでしょうか。
よろしくお願いいたします。

4

『モジュールに記載したコード』というのはどのモジュールでしょうか。フォームモジュールでしょうか。そとれとも、標準モジュールでしょうか。

フォームモジュールなら、

Call プロシージャ名

あるいは、

プロシージャ名

でいいはずですが、それでだめでしたか。

標準モジュールだと Me は使えないので、その部分は CodeContextObject に変更するなどする必要があります。

5

言葉足らずで申し訳ありません。標準モジュールに記載することしか考えられていませんでしたが、
同一のフォームモジュールに記載して各テキストボックスのAfterUpdateからcallで呼び出したほうが良いですね。
動作を確認することができました。まったく気が付けませんでした。

これが当初にやりたかった事と一番マッチしております。大変勉強になりました。
本当に有難うございました。今後とも何卒よろしくお願いいたします。

6

そのフォームでしか使わない処理なら、フォームモジュールに記述するのがいいですね。

他のフォームでも使う場合があるなら、標準モジュールですね。その場合、前の回答に示した通り、Me を CodeContextObject に変更すればいいです。