- 締切済み
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
- みんなの回答 (2)
- 専門家の回答
みんなの回答
106はエラーに。(説明とコードが違っていますが、説明が優先です)
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つのタイプのみ値を表示します。
お礼
ご回答ありがとうございます。 そして本当に申し訳ありません。 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