• 締切済み

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

  • access2000で使用者を履歴に残したい。

    履歴を取るのに「更新者=使用者」これは、currentuserですよね! 「テーブル全体を履歴に残す」バージョンでテーブルの更新者の規定値にcurrentuser()と入れればできる!と思ったのですが、テーブルではその式は利用できませんでした。モジュールに何か書き込まないとできないのでしょうか? 現在のモジュールは以下の通りです。 Sub History_a() Dim Ctr As Control Dim strSQL As String For Each Ctr In Me.Controls If Ctr.ControlType = 109 Then If Ctr.OldValue <> Ctr.Value Then strSQL = "insert into あ履歴 select * FROM あ " & _ "where 顧客コード = " & Me.顧客コード DoCmd.SetWarnings False DoCmd.RunSQL strSQL DoCmd.SetWarnings True Exit Sub End If End If Next Ctr End Sub ここで作成した使用者を顧客コードをキーに最終更新日の更新者を取り出すという、ややこしくてわけがわからなくなりそうなことも可能でしょうか?

  • 変更履歴テーブルについて

    行き詰まってます。アドバイスお願いします。 変更した履歴を記録しようと見よう見まねで作成しました。 テーブル:履歴  変更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://okwave.jp/qa/q164850.html 宜しくお願いします。

  • ACCESS2000でとっても困っています。履歴がたくさんとれてしまうのです。

    アクセス初心者です。とても困っています。 困っているのは、履歴は書き出すのですが、複数書き出してしまうということなのです。 詳しく申し上げますと、 フォーム「テレ_sb(table:テレ)」に変更があった場合に、履歴「SF_テレ履歴(table:テレ履歴)」を書き出すことを行っています。 顧客ID毎に履歴を取るようにしているのですが、「A」ユーザーに変更を行うと、「A」ユーザーの履歴を取ってくる。ここまでは良いのですが、フォームのテレ_sb(table:テレ)に情報が入っているもの全てについて履歴を取ってしまうのです。 つまり、table:テレ(フォーム:テレ_sb)に10ユーザーの情報が入っているとすると、「A」について変更を行うと、10ユーザー全ての履歴を取ってきてしまうのです。 <<フォーム>>メイン、テレ_sb(table:テレ)、SF_テレ履歴(table:テレ履歴)があります。 テレ_sb(table:テレ)のイベントプロシージャーには以下のように書いております。上記の点、防ぐ方法をどなたかご教授ください。よろしくお願い申し上げます。 Sub History_tel() Dim Ctr As Control Dim strSQL As String For Each Ctr In Me.Controls If ((Ctr.ControlType = acTextBox) Or (Ctr.ControlType = acComboBox)) Then If Ctr.OldValue <> Ctr.Value Then strSQL = "insert into テレ履歴 select * , '" & CurrentUser & "' as 更新者 FROM テレ '" & _ "where 顧客コード = " & Me.顧客コード DoCmd.SetWarnings False DoCmd.RunSQL strSQL DoCmd.SetWarnings True Exit Sub End If End If Next Ctr End Sub Private Sub Form_BeforeUpdate(Cancel As Integer) History_tel End Sub Private Sub Form_AfterUpdate() Forms("メイン").Form.SF_テレ履歴.Requery End Sub

  • Access2000のVBAについて

    下記のプログラムだと挿入が可能になります。 Private Sub 削除_コマンド_Click() If IsNull(Me.社員コード) Then MsgBox ("社員コードが入力されていません") Else Dim strSQL As String strSQL = "INSERT INTO 社員情報テーブル(社員コード,作成日) " _ & " VALUES ('" & Me.社員コード & "', now());" DoCmd.RunSQL strSQL End If End Sub しかし、下記のプログラムだとinsert文の『Me.社員コード』で エラーが発生します。 エラーメッセージは 『メソッドまたはデータメンバが見つかりません』 と表示されます。 上と下とどう違うのでしょうか。 Private Sub 削除_コマンド_Click() If IsNull(Me.社員コード) Then MsgBox ("社員コードが入力されていません") Else Dim strSQL As String strSQL = "INSERT INTO 社員情報テーブル(社員コード,氏名(氏),作成日) " _ & " VALUES ('" & Me.社員コード & "','" & Me.氏名(氏) & "', now());" DoCmd.RunSQL strSQL End If End Sub

  • Access2000 VBAについて質問です。

    Access2000 VBAについて質問です。 下記ソースコードでUPDATE(更新)しているのですが、バチンとAccessが落ちてしまいます。 Private sub UPDATESQL() StrSQL = "SELECT * FROM T_StandardList WHERE ID = " & Me.ID Set ct = CurrentProject.Connection RS.CursorLocation = adUseClient RS.Open StrSQL, ct, adOpenDynamic, adLockOptimistic RS![filed1] = Me![Value1] RS![filed2] = Me![Value2] RS![filed3] = Me![Value3] RS![filed4] = Me![Value4]      Call CloseButton_Click Set RS = Nothing Set ct = Nothing End Sub Private Sub CloseButton_Click() DoCmd.SetWarnings False 'SQLの実行 DoCmd.RunSQL "DELETE FROM T_TempList" DoCmd.Close acForm, Me.Name DoCmd.SetWarnings True End Sub CloseButtonをクリックしても落ちることがあるので、CloseButton_Click関数が怪しいとは感じます。 どなたか詳しい方アドバイスよろしくお願いいたします。 m(_ _)m

  • access一部のフィールドを他のテーブルへVBA

    先日 https://okwave.jp/qa/q10245651.html において > table2の新しいデータとして > table1のデータをコピーしたい、 単に追加で ということであれば、という 御回答: Sub Test() Dim StrSQL As String StrSQL = "INSERT INTO table2 SELECT table1.* FROM table1;" DoCmd.SetWarnings False DoCmd.RunSQL StrSQL DoCmd.SetWarnings True End Sub ---------------------- 上記の 回答をいただき うまく稼働しました 部分的にフィールドを別テーブルに 移動するとき ここでは table1のフィールド名 IDに table2のフィールド名 bに 入っている数値 にい 1を加えた数値を 移動したいのですが Public Function Test() Dim tb1 As Table Dim tb2 As Table tb1 = table1 tb2 = table2 Dim strSQL As String strSQL = "INSERT INTO table2![ID]SELECT"("[b]"FROM tablel)+1" (table1のフィールド[b]の数値に1を加えた数値を table2のフィールド[ID]に移行する、というつもりです) DoCmd.SetWarnings False DoCmd.RunSQL strSQL DoCmd.SetWarnings True End Function 稼働しません すみません 宜しくお願い致します (ついでながら ここで でてくるb というのは テーブル table3 の IDの総和 すなわち SELECT Count(table3.ID) AS b FROM table3; 要は table3の最後のレコードの次のレコードの 番号の数値を table2のIDに移動したい というわけであります) (いずれのIDや bについても 数値型 長整数型 重複あり です)

  • Access VBA Split利用方法

    お世話になります。 VBAを勉強している最中です。 Accessを利用して、txtファイルをインポート後、テーブルの項目を配列利用して カンマ区切りにしたいのと、Splitを利用して、配列を条件分岐に利用して、テーブルに 書き込みをしたいとおもってます。 おそらく基本的なことで自分で勉強するべきと思うのですが 漠然なイメージしかない状態で、ヒントやこういう方法があるなど 教えていただけますでしょうか 基本的な使い方ですと Private Sub XXX_Click() str = Split("あああ いいい ううう")   MsgBox str(1) End Sub 上記の用な利用方法と思いますが、このような使い方ではなく test(0)のような使い方をして、条件分岐で利用したいと おもってます。 イメージとしては、下記のようなことをイメージしてます。 Public Sub Test()   Dim test() As String Dim row As String   Dim iNum1 As Long,   Dim iNum2 As Long      DoCmd.SetWarnings False   DoCmd.RunSQL "DELETE * FROM data"  DoCmd.TransferText acImportFixed, "インポート定義", "data", "d:\data.txt"   DoCmd.SetWarnings True   iNum1 = 0   iNum2 = 0   Do While xxx      If test(0) = 0 Then          iNum1 = iNum1 + 1 iNum2 = 1      Else         xxxx      End If   Loop End Sub ここでSplitを利用してどのように指定するのが望ましいのか考えてしまってます。 test = row.Split(" ") を利用する場合、どのように連結(row)させるのかが不明です。 知識不足もあり、説明がわかりづらいと思うのですが、よろしくお願いします。

  • VBAで同名ファイルの有無を確認させる方法は?

    AccessにてCSVファイルをインポートしたあと、所定の場所にインポート済みファイルを移動させる処理をさせています。 インポート済みのファイルと同じ名前のファイル(このファイルはyyyymmdd.csvと日付を基にしたファイル名称になっています)を取り込もうとしたときに、メッセージボックスを表示させて処理を続行するかどうか問わせたいと考えています。 下記のようにVBAを記述してみたのですが、メッセージボックスは表示されず、インポート処理されてしまいます。 If strFile = strImportedFile Then という、条件がまずいのではないかと思っているのですが、目的に適した記述が思いつきません。 どのような記述がふさわしいでしょうか? ~~~現在の記述~~~ Dim strFile As String Dim strPath As String Dim strImportedFile As String strPath = CurrentProject.Path & "\インポート\" strFile = Dir(strPath & "*.csv") strImportedFile = strPath & "インポート済\" & strFile If strFile = strImportedFile Then MsgBox "すでに処理済の日付のファイルです。" & (Chr(13) & Chr(10)) & "続けますか?", vbOKCancel Exit Sub Else Kill strImportedFile End If DoCmd.SetWarnings False '受け皿になるテーブルをクリアーしてインポート If strFile <> "" Then DoCmd.RunSQL "DELETE * FROM tbl_import" DoCmd.TransferText acImportDelim, "インポート定義", "tbl_import", strPath & strFile, True Name strPath & strFile As strPath & "インポート済\" & strFile End If DoCmd.SetWarnings True '取り込むべき売上ファイルがない場合のためのアラート表示 If strFile = "" Then MsgBox "CSVファイルがありません。" & (Chr(13) & Chr(10)) & "処理を中止します", vbOKOnly Else Exit Sub End If End Sub

  • エクセル VBA OptionButtonからTextBox

    すいません! OptionButtonなら 下記の記述でエラー表示を 簡単にできるのですが これがOptionButtonではなく TextBoxならどのように変化したら 良いのでしょうか? すいません、教えて下さい! Private Sub 記録_Click() Dim i As Integer Dim Cnt As Integer Cnt = 0 For i = 1 To 6 Step 1 If Me.Controls("OptionButton" & i).Value Then Cnt = i Exit For End If Next i If Cnt = 0 Then MsgBox "選択されていません" Exit Sub End If If Me.Controls("Combobox" & Cnt).Value = "" Then MsgBox Me.Controls("OptionButton" & Cnt).Caption & " の内容が選択されていません" Exit Sub End If With 記入フォーム .TextBox5.Value = Me.Controls("OptionButton" & Cnt).Caption .TextBox6.Value = Me.Controls("Combobox" & Cnt).Value End With Unload Me End Sub

  • アクセスVBAです

    Sub test() Dim DB As Database Dim T As TableDef Dim myTable As String myTable = "Table1" Set DB = OpenDatabase(CurrentProject.FullName) For Each T In DB.TableDefs If T.Name = myTable Then DoCmd.DeleteObject acTable, myTable Exit For End If Next DB.Close Set DB = Nothing End Sub これを実行しようとすると Dim DB As Database の部分で コンパイルエラー プロジェクトではなく、ユーザ定義型を指定してください。 と言うエラーになります。 Dim DB As Objectにすればエラーにならずに進みますが 何が原因なのでしょうか?

プリンター印刷できない
このQ&Aのポイント
  • パソコンから印刷すると1日程経ってから出てくる
  • パソコンのOSはWindowsで、接続は無線LAN、電話回線はひかり回線です
  • ブラザー製品についての質問です
回答を見る

専門家に質問してみよう