行き詰まってます。アドバイスお願いします。

変更した履歴を記録しようと見よう見まねで作成しました。
テーブル:履歴
 変更ID、フィールド名、変更前名前、変更後名前、変更日

フォームの更新前処理で

Dim ctr As Control
Dim sqla As String

For Each ctr In Me.Controls
If ctr.ControlType = 109 Then
If Nz(ctr.OldValue, "") <> Nz(ctr.Value, "") Then
sqla = "insert into 履歴 values(" & Me.ID & ",'" & ctr.Name & "','" & ctr.OldValue & "','" & ctr.Value & "',#" & Now() & "#)"
DoCmd.SetWarnings False
DoCmd.RunSQL sqla
DoCmd.SetWarnings True
End If
End If
Next ctr


としています。
これでフォームでいじって試してみると
「この操作は、このタイプのオブジェクトには実行できません。」とエラーになってしまいます。
デバッグで→If Nz(ctr.OldValue, "") <> Nz(ctr.Value, "") Then
になっています。

他の形の質問を参考に作ったのですが、どこがおかしいのでしょうか?
http://oshiete.goo.ne.jp/qa/164850.html

宜しくお願いします。

A 回答 (3件)

不思議とフォームの更新前ではエラーになるのに


各コントロールのイベントならエラーにならずに拾えるようです。
当方、Windows XP SP3 & Access 2002 SP3 環境
なので泥臭い方法ですが、
履歴を保存したい各コントロールの更新前処理にそれぞれ

Dim ctr As Control
Dim sqla As String
On Error GoTo errHndl

Set ctr = Screen.ActiveControl
sqla = "insert into 履歴 values(" & _
   Me.ID & ",'" & ctr.name & "','" & ctr.OldValue & "','" & ctr.Value & "',#" & Now() & "#)"
CurrentDb.Execute sqla, dbFailOnError
Set ctr = Nothing
Exit Sub

errHndl:
Set ctr = Nothing
MsgBox "Number= " & Err.Number & Err.Description & vbCrLf & _
"履歴登録に失敗しました"

を入れれば動きます。多分(^_^;)
    • good
    • 0
この回答へのお礼

遅くなり、大変失礼しました。

私用で休んでおりました。

早速試してみました。
無事変更履歴へ入っていました。
一対多のリレーションを組んでいるとだめなんですね。履歴に残すデータは全て多側でした。

まだ、未開のコードでかかれているので、勉強してコードの中身を理解したいと思います。

どうもありがとうございました。

お礼日時:2011/04/19 11:51

原因が分かり(Google)ました



http://kure-ryusuke.blogspot.com/2008/12/access_ …

1対多のクエリーを元にしたフォームだと発生しました。
回避策はあるのかな?
    • good
    • 0

ん~ エラーが再現できない。


エラーで止まったときに、下行の ctr.Name にマウスを持ってゆくか
Ctrl + G を押してイミディエイトウィンドウ内で
?ctr.name で エンターキー
コントロールの名前が現れますのでフォームに戻って
そのコントロールを詳しく調べれば解決に繋がると思います。

あと同じくイミディエイトウィンドウで
?ctr.oldValue
?ctr.value
の結果も分かるかと思いますので以上3点どうなってますか?

PS.
Access のバージョンも教えてください。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング