みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

Access2000 VBA - 変更の履歴が取れません

下記コードで、If Nz(Ctr.OldValue, "") <> Nz(Ctr.Value, "") Thenの行で「指定した式には値がありません」というエラーが出てしまいます。
他のQ&Aで見つけた成功例のほぼコピペなのですが・・・・
どこが悪いのか、ご教示頂けないでしょうか?

よろしくお願い致します。

__________________________________________________________________________________________

Private Sub Form_BeforeUpdate(Cancel As Integer)
Dim Ctr As Control
Dim strSQL As String

For Each Ctr In Me.Controls
If Nz(Ctr.OldValue, "") <> Nz(Ctr.Value, "") Then
strSQL = "insert into 履歴 values('currentuser'," & Ctr.Value & _
",'" & Ctr.Name & "','" & Ctr.OldValue & "',#" & Now() & "#)"
DoCmd.SetWarnings False
DoCmd.RunSQL strSQL
DoCmd.SetWarnings True

End If
Next Ctr
End Sub

投稿日時 - 2008-03-25 14:51:00

QNo.3893377

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

106はエラーに。(説明とコードが違っていますが、説明が優先です)

投稿日時 - 2008-03-25 15:22:21

Public Sub DisplayByRed(ByVal rpt As Report)
   Dim ctl As Control

   For Each ctl In rpt.Controls
     If ctl.ControlType = acTextBox Then
       If Val(ctl & "") < 0 Then
         ctl.ForeColor = RGB(255, 0, 0)
       End If
     End If
   Next ctl
End Sub

これは、レポートのテキストボックスが負の値ならば文字の色を赤くする関数です。
つまり、ctl.ControlType で調べるコントロールを限定しています。
ところで、質問者は全てを対象としていますよね。
だとすれば、例えば、ラベルコントロール、チェックボックスなどは Value がないのでエラーが発生します。

If ctl.ControlType = acTextBox Or ctl.ControlType = XXXX Then

または、

If Instr(1, "/106/109/110/112/", "/" & Trim(Str(ctl.ControlType)) & "/", 1)> 0 Then

で対象を限定すればエラーは回避できます。

acCheckBox=106
acTextBox=109
acListBox=110
acComboBox=111

Private Sub コマンド10_Click()
  Dim ctl As Control

  For Each ctl In Me.Controls
    If InStr(1, "/109/110/111/", "/" & Trim(Str(ctl.ControlType)) & "/", 1) > 0 Then
      MsgBox ctl.Value
    End If
  Next ctl
End Sub

この場合、3つのタイプのみ値を表示します。

投稿日時 - 2008-03-25 15:19:49

お礼

ご回答ありがとうございます。

そして本当に申し訳ありません。
Vistaが原因でした。
VistaでOffice2000はサポート対象外とはいえ・・・・VBAで書いたコードも正常に認識できないようです。
XPでやり直したら正常に動きました。

一応完成コード載せておきます。



Private Sub Form_BeforeUpdate(Cancel As Integer)
 Dim Ctr As Control
 Dim strSQL As String
 For Each Ctr In Me.Controls

  If Ctr.ControlType = 109 Then
   If Nz(Ctr.OldValue, "") <> Nz(Ctr.Value, "") Then

    strSQL = "insert into 履歴 values(" & Me.コード & ",#" & Now() & "#,_
    '" & CurrentUser & "','" & Ctr.ControlSource & "','" & Ctr.OldValue & "','" & Ctr.Value & "')"
    DoCmd.SetWarnings False
    DoCmd.RunSQL strSQL
    DoCmd.SetWarnings True

   End If
  End If
 Next Ctr
End Sub

投稿日時 - 2008-03-25 16:34:53

あなたにオススメの質問