• 締切済み

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

みんなの回答

noname#140971
noname#140971
回答No.2

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

noname#140971
noname#140971
回答No.1

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つのタイプのみ値を表示します。

kuroizell
質問者

お礼

ご回答ありがとうございます。 そして本当に申し訳ありません。 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

関連するQ&A