Access (VBA)

Access VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10全般 : Access 2016)
「データの競合」のかわりにユーザーメッセージで処理
投稿日時: 23/06/21 19:07:21
投稿者: おーさん0729

「データの競合」を起こさず、ユーザーメッセージで処理をしたいのですが、方法がわかりません。
http://sennin.image.coocan.jp/access/access15/access15.htm
上記サイトにて、近しい方法を見つけたのですが、
 
Sub HandleLocks(ChangeColor As Long, OriginalColor As Long)
  Dim ctl As Control
  Dim MsgResponse As Integer, Msg As String
  Dim ChangeFields As New Collection, CF As Control, CollectCount As Integer
  Dim rs As Recordset
  Dim RSC As Recordset
  
  Set RSC = Me.RecordsetClone
  RSC.Bookmark = Me.Bookmark 'Recordsetのポインタをフォームのレコードに同期させる
  
  For Each ctl In Me.Controls 'フォーム上のテキストボックス・コントロールの値とレコードセットの値を比較する
    If ctl.ControlType = acTextBox Then
      If ctl <> RSC(ctl.ControlSource) Then '変更があった場合は文字を赤にする
        ctl.ForeColor = ChangeColor
        ctl.Tag = RSC(ctl.ControlSource) '変更前の値を各コントロールのTagに保存する
        ChangeFields.Add ctl '変更されたコントロールをコレクションに追加する
      End If
    End If
  Next
 
において、「フォーム上のテキストボックス・コントロールの値とレコードセットの値を比較する」がうまくできません。
このサイトの場合、入力用のフォームを使っていますが、
作成しているものは、表示されるフォーム(単票)と入力フォームが同じです。(フォームに直接入力)
ここを改変することができれば、なんとかなるのではと考えています。
よろしくお願いします。

回答
投稿日時: 23/06/22 15:33:56
投稿者: hatena
投稿者のウェブサイトに移動

当方の簡単なサンプルテストでは問題なく動作しているようですが、具体的にどのようにうまくできていのですか。
 
どのようにテストして、どのような結果になるのか、具体的に説明してください。

投稿日時: 23/06/22 20:00:08
投稿者: おーさん0729

hatena さんの引用:
当方の簡単なサンプルテストでは問題なく動作しているようですが、具体的にどのようにうまくできていのですか。
 
どのようにテストして、どのような結果になるのか、具体的に説明してください。

 
コード自体はサイトのものをそのまま使っています。
同じレコードを同時に編集して、「データの競合」を起こしてます。
 
If ctl.ControlType = acTextBox Then
      If ctl <> RSC(ctl.ControlSource) Then
ここの9回目くらいで「エラー3265、このコレクションには項目がありません」
と出ます。
 
フォームヘッダーのコントロールを参照しているようでした。
詳細のコントロールを参照できるようにしたいです。

回答
投稿日時: 23/06/22 22:20:31
投稿者: hatena
投稿者のウェブサイトに移動

おーさん0729 さんの引用:
フォームヘッダーのコントロールを参照しているようでした。
詳細のコントロールを参照できるようにしたいです。

 
For Eachループを下記のようにすれば、詳細セクションのコントロールのみの参照になります。
 
For Each ctl In Me.Section(acDetail).Controls

    '中略  

Next ctl

 
Form.Section プロパティ (Access) | Microsoft Learn
https://learn.microsoft.com/ja-jp/office/vba/api/access.form.section

投稿日時: 23/06/22 22:37:50
投稿者: おーさん0729

hatena さんの引用:
おーさん0729 さんの引用:
フォームヘッダーのコントロールを参照しているようでした。
詳細のコントロールを参照できるようにしたいです。

 
For Eachループを下記のようにすれば、詳細セクションのコントロールのみの参照になります。
 
For Each ctl In Me.Section(acDetail).Controls

    '中略  

Next ctl

 
Form.Section プロパティ (Access) | Microsoft Learn
https://learn.microsoft.com/ja-jp/office/vba/api/access.form.section

ありがとうございます!
明日には試せそうにないので、週明けに試してみます!

投稿日時: 23/07/23 19:42:08
投稿者: おーさん0729

hatena様
 
すみません。遅くりました。
できました!
別件等でバタバタしておりました。
 
ありがとうございました!