変更履歴テーブルの作成方法とフォームでのエラーについて

このQ&Aのポイント
  • 変更履歴テーブルの作成方法とフォームでのエラーについてアドバイスをお願いします。
  • 変更履歴テーブルの作成方法とフォームでのエラーについて、アドバイスをお願いします。
  • 変更履歴テーブルの作成方法とフォームでのエラーについて、アドバイスをお願いします。
回答を見る
  • ベストアンサー

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

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

質問者が選んだベストアンサー

  • ベストアンサー
  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.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 & _ "履歴登録に失敗しました" を入れれば動きます。多分(^_^;)

tamating
質問者

お礼

遅くなり、大変失礼しました。 私用で休んでおりました。 早速試してみました。 無事変更履歴へ入っていました。 一対多のリレーションを組んでいるとだめなんですね。履歴に残すデータは全て多側でした。 まだ、未開のコードでかかれているので、勉強してコードの中身を理解したいと思います。 どうもありがとうございました。

その他の回答 (2)

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.2

原因が分かり(Google)ました http://kure-ryusuke.blogspot.com/2008/12/access_17.html 1対多のクエリーを元にしたフォームだと発生しました。 回避策はあるのかな?

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.1

ん~ エラーが再現できない。 エラーで止まったときに、下行の ctr.Name にマウスを持ってゆくか Ctrl + G を押してイミディエイトウィンドウ内で ?ctr.name で エンターキー コントロールの名前が現れますのでフォームに戻って そのコントロールを詳しく調べれば解決に繋がると思います。 あと同じくイミディエイトウィンドウで ?ctr.oldValue ?ctr.value の結果も分かるかと思いますので以上3点どうなってますか? PS. Access のバージョンも教えてください。

関連する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

  • 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 ここで作成した使用者を顧客コードをキーに最終更新日の更新者を取り出すという、ややこしくてわけがわからなくなりそうなことも可能でしょうか?

  • 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

  • エクセル 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にて フォーム1でレポート、レコードを選択後に レポートを開くと同時に印刷フォームも開くように組んでます。 その印刷フォームで印刷をすると、印刷フォーム自体が印刷されてしまうので ”レポート名”を認識させてから印刷しています。 その時の”レポート名”を開いたときに自動的に変数として印刷フォームに引き継ぎたいのですが やり方が分かりません。 意図としては、印刷フォームを汎用的に使いたいためです。 印刷フォームの呼び出しコードは下記にて Private Sub コマンド18_Click() Dim report_name As String Dim report_value As String If Not IsNull(コンボ50.Value) = True Then report_name = コンボ48.Value  ’レポート名です report_value = コンボ50.Value DoCmd.OpenReport report_name, acViewPreview, , "[現場名]='" & report_value & "'" DoCmd.MoveSize Width:=10000, Height:=13000 Reports(report_name).ZoomControl = 75 Else MsgBox "項目を選択してください。" End End If DoCmd.OpenForm "印刷_フォーム", acNormal End Sub Private Sub コマンド53_Click() Dim new_date As String Dim form_name As String If Not IsNull(コンボ48.Value) = True Then form_name = コンボ48.Value DoCmd.OpenForm form_name, acNormal, , , acFormAdd DoCmd.MoveSize Width:=12000, Height:=13000 Else MsgBox "[取引先名]を入力してください。" End If End Sub 下記は印刷フォームにて、印刷設定をする場合のコードです Private Sub コマンド0_Click() Dim report_name As String report_name = "レポート名" On Error Resume Next DoCmd.SelectObject acReport, report_name, True DoCmd.RunCommand acCmdPrint End Sub

  • チェックボックス選択後、フォームに移して編集したい

    チェックボックスの選択では Private Sub 選択_Click() If Me!選択 Then CurrentDb.Execute "UPDATE 申請履歴Q SET 選択 = False;" Me.Refresh End If End Sub でチェックボックスを1つづつ選択可能にしたのですが、 フォームに移動しようとすると最初の(001)のデータがフォームに 出てきてしまいます。 Private Sub 編集_Click() Dim mode As Variant mode = Me.選択.Value DoCmd.OpenForm FormName:="編集F", DataMode:=acFormEdit うまく選択できていないのは分かるのですが、本を何冊も広げてみても 良い回答に行きつきません。 何卒、ご指導の程宜しくお願い致します。

  • vba ユーザーフォームにて質問

    勉強のためにvbaにユーザーフォームを作っています。 画像のとおり青色が塗られている箇所に、ユーザーフォームで社員名、件数を 転記したいです。 ユーザーフォーム 社員名 件数 を入力したら範囲はC3からC15転記されます。 転記終わったら、D3からD15に転記。この作業をH列まで行いたいのですが、 C3の列以降転記できません。 お答えできる方いればよろしくお願いします。 Private Sub CommandButton1_Click() Dim rc As Long Dim retu As Long Dim Ctrl As Control If Me.txtComboBox1.Value = "" Then MsgBox "社員名を選択してください!", vbOKOnly Me.txtComboBox1.SetFocus Exit Sub End If rc = MsgBox("件数を入力しますか?", vbYesNo) If rc = vbYes Then MsgBox "実行する" Else MsgBox "中止しました" Exit Sub End If retu = Cells(2, Columns.Count).End(xlToLeft).Column + 1 Cells(3, retu).Value = Me.txtComboBox1.Value ←社員を選択 Cells(4, retu).Value = Me.txtsuzuki.Value  ←売れた件数 Cells(5, retu).Value = Me.txttoyota.Value  ←売れた件数 Cells(6, retu).Value = Me.txthonnda.Value   ←売れた件数 For Each Ctrl In Me.Controls If Ctrl.Name Like "txt*" Then Ctrl.Value = "" End If Next Ctrl End Sub

  • Accessの検索フォーム作成で。

    Access2000です。 一覧テーブルは ・名前 ・項目1 ・評価1 ・項目2 ・評価2 となっていて、 山田太朗  | タバコのポイ捨てはしない  | 5 | 10分前行動 | 4 | 前田前   | 交通ルールを守る      | 5 | 挨拶をする  | 4 | 大坪拳   | 10分前行動        | 4 | 挨拶をする  | 5 | のようになっています。 これをもとに「検索フォーム」をデザインフォームで、 名前   [     ] 項目1  [     ] 項目2  [     ] 項目3  [     ] と作成し、「検索」というボタンを押すと、「検索結果フォーム」に検索結果が出るようにしました。 検索ボタンは Private Sub コマンド9_Click() Dim SQL As String Dim WhereCond As String Dim condName As String Dim condKoumoku1 As String Dim condKoumoku2 As String Dim condKoumoku3 As String WhereCond = "" '名前 If Me!名前.Value <> "" Then condName = "(一覧.名前 like '*" & Me!名前.Value & "*')" WhereCond = WhereCond & " and " & condName End If '項目1 If Me!項目1.Value <> "" Then condKoumoku1 = "(一覧.項目1 like '*" & Me!項目1.Value & "*')" WhereCond = WhereCond & " and " & condKoumoku1 End If : WhereCond = Mid(WhereCond, 6) DoCmd.OpenForm "検索結果フォーム", acNormal, , WhereCond End Sub となっています。 そこで、検索フォームで 項目に検索値を入れた場合、一覧の項目すべての中から検索できるようにするにはどうしたらいいのでしょうか? また、今の状態ですとand検索ですが、or検索するにはどのようにしたらいいでしょうか?

  • アクセス 処理の分岐について。

    Private Sub コマンド42_Click() Dim CT1 As Control For Each CT1 In Me.Controls If CT1.ControlType = acTextBox Or CT1.ControlType = acComboBox Then CT1.Value = Null ElseIf CT1.ControlType = acCheckBox Then CT1.Value = False End If Next Dim strmsg As String strmsg = "基本情報登録画面を閉じますか?" If MsgBox(strmsg, vbOKCancel + vbCritical) = vbOK Then DoCmd.Close End If DoCmd.OpenForm "Mainmenu" End Sub というプログラムを書きました。これだと、OKコマンドをクリックすると基本情報登録画面が閉じて、MainMenuが開きます。cancelコマンドをクリックすると、基本情報登録画面がそのままで、MainMenuが開きます。キャンセルのときは、基本情報登録画面をそのままにして、アクションは何もおきなくていいのですが、何を変えればいいのでしょうか? call再表示でFunction 再表示()で書き込んでみたのですが、エラーが出ます。多分、簡単なことなのでしょうけど、うまくいきません。どなたかわかる方がいましたらご教示ください。よろしくお願い致します。

  • サブフォーム用のテーブルのデータで検索をしてマスタフォームに表示したい。

    Access2000での質問です。 T_マスタ(氏名ID・氏名)・T_サブ(氏名ID・データ年・データ種類)というテーブルから F_マスタ・F_サブというフォームを作成し、 F_マスタの中にサブフォームとしてF_サブを入れています。(氏名IDでリンク) F_検索というフォームを作成し、 データ年・データ種類で検索するようにしました。 この結果を、F_マスタで表示したいのですが、 F_マスタはT_マスタから作成されているため、検索結果が 希望するものではなくなってしまいます。 F_サブでみればきちんと検索されているのですが、 それでは氏名がみれないので。。。 このようなことはできるのでしょうか? F_検索の検索ボタンのコードです。 ------- Private Sub コマンド1_Click() Dim SQL As String Dim WhereCond As String Dim condNendo As String Dim condSyurui As String 'データ年 If Me!データ年.Value <> "" Then condNendo = "(T_サブ.データ年 like '*" & Me!データ年.Value & "*')" WhereCond = WhereCond & " AND " & condNendo End If '種類 If Me!データ種類.Value <> "" Then condSyurui = "(T_サブ.データ種類 like '*" & Me!データ種類.Value & "*')" WhereCond = WhereCond & " AND " & condSyurui End If WhereCond = Mid(WhereCond, 6) DoCmd.OpenForm "F_サブ", acNormal, , WhereCond End Sub ------- *上記の「F_サブ」を[F_マスタ」で開くようにしたいのです。 宜しくお願いします。

専門家に質問してみよう