• ベストアンサー

ACCESSのレコード操作で1つ前のレコードの再表示方法をご教授下さい。

アクセスで1レコードの入力が終わり、次の入力フォームに移行した時、前のレコードのフィールド内容を参照したいのです。 VBAで関数DLastで呼び出す様にしているのですが、 毎回同じデータが表示されます。レコードは順次入力されていて、 スクロールで1つ遡ると最終データが表示されています。 解決方法をご教授お願い致します。

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

  • ベストアンサー
  • CHRONOS_0
  • ベストアンサー率54% (457/838)
回答No.9

>ボタン経由は避けたいと思います。 >入力の流れの中でスイッチで出来ればと考えています。 レコード移動時イベントを使います 新規レコードに移動したとき 直前入力したレコードの値をコピーし新規レコードに貼り付ければいいんですね レコード移動時に下のようなコードを書きます コピー中フラグをStaticで定義 Ifフラグがオフなら  If新規レコードなら   フラグオン   前のレコードに移動   セットフォーカス   コピー   新規レコードに移動   貼り付け   フラグオフ  End If End If レコードを移動するたびにイベントが発生します これによって無限ループにおちいらないように フラグを設けています

cogi-choco
質問者

お礼

有難うございました。 フォームにテキストボックスを必要なだけ付加し、非表示にして、 データを一時保管させ、さらにテキストボックスを付加し、それが「1」の場合に、先にこしらえたテキストボックスの内容をやり取り する様に致しました。 問題解決です。

cogi-choco
質問者

補足

”前のレコードに移動して、各フィールドの値(文字)をコピーして、 今回の入力が前回のデータと同じであれば貼り付ける”という手順を VBAでやらせたかったのですが・・・・ 前のレコードに移動するのをVBAできる方法をご教授お願い致します。

すると、全ての回答が全文表示されます。

その他の回答 (9)

  • CHRONOS_0
  • ベストアンサー率54% (457/838)
回答No.10

>”前のレコードに移動して、各フィールドの値(文字)をコピーして、 >今回の入力が前回のデータと同じであれば貼り付ける”という手順を >VBAでやらせたかったのですが・・・・ これなら最初に回答した、新規レコードにコピーでいいんじゃないですか ボタンがいやだとおっしゃいますが、コピーをするには何らかの意思表示が必要です 移動だけではそのレコードをコピーしたいかどうか分かりません 移動だけで何でもかんでもコピーしたら要らない物がガパガパコピーされますよ ボタンの代わりにダブルクリックでというのも可能です その場合ウィザードの支援はありませんから ボタンのウィザードで作ったものをダブルクリックイベントに移し変えればいいですね >前のレコードに移動するのをVBAできる方法をご教授お願い致します。 DoCmd.GoToRecord(ObjectType, ObjectName, Record, Offset) でも調べてみれば

cogi-choco
質問者

お礼

ご教授有難うございます。 コントロール(テキストボックス等)のクリック、ダブル クリックでの呼び出しは、テキストボックスのデフォルト操作で 出来る様です。(イベント発生時の表示) 今、考えていますのは、新規レコード入力の為のフォームの入力順2の テキストボックス(デフォルトは「0」)に「1」を入力したときに、 以下のフィールド(7項目)全てに前の各レコードの内容が表示される 様にしたいのです。(「0」の時は表示なしで手入力) 今まで、教えて頂いた方法で考えて見ます。 いろりろお手を取らしましてすみませんでした。

すると、全ての回答が全文表示されます。
noname#140971
noname#140971
回答No.8

補足: 既定値方式について。 tab1: [ID]_[Zip]____[Address1]_[Address2]_[Address3]_[HouseNumber] _01__1430016___東京都_____大田区_____大森北_____111-111 で、[ID]と[HouseNumber]以外を連続データ入力するとします。 この場合、[ID]=1、2、3がある場合、4を入力する時のみ3を4へコピー。 2を訂正する場合に、コピーはしないものとします。 つまり、事実上、新規レコード時発生のみコピー。 で、こういう仕掛けは次のようです。 Option Compare Database Option Explicit Dim isNewRecord As Boolean Private Sub Form_AfterUpdate()   If isNewRecord Then     Me.Zip.DefaultValue = """" & Me.Zip & """"     Me.Address1.DefaultValue = """" & Me.Address1 & """"     Me.Address2.DefaultValue = """" & Me.Address2 & """"     Me.Address3.DefaultValue = """" & Me.Address3 & """"   End If End Sub Private Sub Form_Current()   isNewRecord = Me.NewRecord End Sub Private Sub Form_Load()   Me.Zip.DefaultValue = """" & DLookup("Zip", "tab1") & """"   Me.Address1.DefaultValue = """" & DLookup("Address1", "tab1") & """"   Me.Address2.DefaultValue = """" & DLookup("Address2", "tab1") & """"   Me.Address3.DefaultValue = """" & DLookup("Address3", "tab1") & """" End Sub 問題は、フォームロード時の既定値の最適化です。 例では最新レコードを表示するための条件を指定していません。 ここは、それぞれに工夫。 で、で、これで目的は達成するかと思います。 なお、既定値方式はInsertイベントが発生しないので便利です。

cogi-choco
質問者

お礼

有難うございます。 試して見ます。

すると、全ての回答が全文表示されます。
noname#182251
noname#182251
回答No.7

#3、#6です。面白いのでもう少しやってみました Option Compare Database Dim Pnames(50) As String Dim n, i As Integer Private Sub Form_AfterUpdate() RecordItem End Sub Private Sub Form_Current() If IsNull(Form_フォーム2.id) Then For i = 0 To n - 1 If Form_フォーム2.Controls(i).ControlType = acTextBox Then On Error GoTo skip2 Form_フォーム2.Controls(i) = Pnames(i) skip2: End If Next i End If RecordItem End Sub Public Sub RecordItem() n = Form_フォーム2.Controls.Count For i = 0 To n - 1 If Form_フォーム2.Controls(i).ControlType = acTextBox Then Pnames(i) = Form_フォーム2.Controls(i) End If Next i End Sub これでいくつテキストボックスがあってもコピーされるでしょう。コピーされては困るところは if 文などでスキップしてください。 ちなみにVBAは前から嫌いでしたが、ますます嫌いになりました。コーディングしていて、いらいらさせられること甚だしい。

cogi-choco
質問者

お礼

いらいらさせまして、申し訳ありません。 目的は、直前のレコードの中の幾つかのフィールドデータを コピーしたかったのですが・・・ 私もVisualBasicでなら2元テーブル(マトリックス)データの呼び出しぐらい何とかできるのですが、如何せんアクセスのテーブルの データの呼び出し方が分からなかったもので・・・・ いろいろご教授有難うございました。

すると、全ての回答が全文表示されます。
noname#182251
noname#182251
回答No.6

#3です。ご質問の意味を「直前のレコードを参照したい」のかと誤解していました。同じデータを入力したいのであれば。 Dim pname As String Private Sub Form_AfterUpdate() RecordItem End Sub Private Sub Form_Current() Form_フォーム2.namex = pname If IsNull(Form_フォーム2.xname) Then Form_フォーム2.xname = pname End If RecordItem End Sub Public Sub RecordItem() On Error GoTo skip1 pname = Form_フォーム2.xname skip1: End Sub 「xname」テキストボックス一つだけですが、必要なだけ増やしてください。

cogi-choco
質問者

お礼

フォームにテキストボックスを必要な数だけこしらえて、これに 各データを一時置きし、ご教授のようにデータのやり取りをする様に しました。問題解決です。有難うございました。

すると、全ての回答が全文表示されます。
noname#140971
noname#140971
回答No.5

コピーしたいフィールドの既定値を新規レコードの時に更新。 これでも目的は達成されると思います。 常に、一つ手前のレコードをコピーなんてありえない話ですから・・・。

cogi-choco
質問者

お礼

有難うございました。規定値は使わずにテキストボックスにダイレクトにデータがコピーできるようにし、スイッチ用のテキストボックスの 内容で一時保管していたデータを呼び出す様に致しました。 問題解決です。

cogi-choco
質問者

補足

ご回答有難うございます。 データ入力でロットNo.(主キー)以外は全く同じなのがいくつも続く 時があります。スイッチを利用してロットNo.以外のデータを コピーしたいのです。・・・・・

すると、全ての回答が全文表示されます。
noname#140971
noname#140971
回答No.4

Accessでは、[Ctrl][Shift][2]と押せば、一つ前のフィールドがコピーされます。 で、この機能を利用するのも一つの手です。 で、私は、[F6]を押せば一つ前のフィールドがコピーされるようにしています。 SendKeys "^("")", False つまり、[F6]キーが押されたら、このコードが走る仕掛けです。 で、結構、ユーザは多用しているようです。

cogi-choco
質問者

お礼

有難うございます。 ファンクション・キーへの割付は同一レコード内で、 次のフィールドへのデータのコピーによく使用しておりました。 今、困っているのは、前レコードの同一フィールドの内容を 表示させる事なのですが、それも複数フィールドを同時に と考えております。 フォームのテキストボックスの内容を一時保管する方法が 分かればいいのですが・・・・

すると、全ての回答が全文表示されます。
noname#182251
noname#182251
回答No.3

アクセスには「レコード移動前」「レコード移動後」でイベントが発生しないので、面倒ですが、以下のコードで一応前のデータを表示できます Dim pid, pname As String Private Sub Form_Current() Form_フォーム2.idx = pid Form_フォーム2.namex = pname End Sub Private Sub id_AfterUpdate() RecordItem End Sub Private Sub id_Enter() RecordItem End Sub Private Sub xname_AfterUpdate() RecordItem End Sub Private Sub xname_Enter() RecordItem End Sub Public Sub RecordItem() On Error GoTo skip1 pid = Form_フォーム2.id pname = Form_フォーム2.xname skip1: End Sub idとnameをidx、namex非連結テキストボックスに表示するだけですが、適当にチューニングしてください。

cogi-choco
質問者

お礼

有難うございます。 アクセスのテーブルの扱いに 慣れていないもので・・・・・ 早速試して見ます。

すると、全ての回答が全文表示されます。
  • CHRONOS_0
  • ベストアンサー率54% (457/838)
回答No.2

DLastはそのような用途に使う関数ではありません 詳しくはMSの技術情報を見てください 要望とは少し異なりますが 移動する前に表示されているレコードを新規レコードにコピーするボタンならウィザードで簡単に作れますよ

cogi-choco
質問者

お礼

有難うございます。 ボタン経由は避けたいと思います。 入力の流れの中でスイッチで出来ればと考えています。

すると、全ての回答が全文表示されます。
noname#110201
noname#110201
回答No.1

そのDLast関数を呼び出すイベントプロシージャが実行されるためのイベントが発生していないのでは? あるいは、新しいレコードを入力する際のどこかのタイミングで、その「前のレコードのフィールド内容」が表示されるコントロールを、リフラッシュ(あるいはリクエリー)してみてはどうでしょう。

cogi-choco
質問者

お礼

ご教授有難うございます。 早速トライしてみます。

すると、全ての回答が全文表示されます。

関連するQ&A