• ベストアンサー

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

  • Access 連結フィールド値を自動で表示

    Accessでフォーム上にサブフォーム(データシート)を作成すると、 新規レコード欄にも自動的に連結フィールドの値が表示されます。 このサブフォームをメインフォーム上に作らずに、 コマンドボタンクリック時にあるフィールドが一致する(上記で言う連結フィールド)データを表示したサブフォーム(データシート)を開くかたちにしたいのですが、そうすると当然ながら新規レコード欄には連結フィールドの値は表示されません。 これをメインフォーム上にサブフォームを作った時と同じように、新規レコード欄に連結フィールド値を表示させるにはどうしたら良いでしょうか? サブフォームを開く段階で新規レコードに結合フィールドの値を(VBAで)入力する事も考えましたが、そうするともしそこにデータを入れるつもりじゃなくても1つのレコードとしてデータが残ってしまいます。 メインフォーム上に作ったサブフォームなら、新規レコードに結合フィールドの値は表示されているものの、その他のフィールドにデータを入力しなければ1つのレコードとしてデータが残ることはありません。 こういう事が可能かどうかわかりませんが、ご存知でしたら教えてくださいませ。 よろしくお願いします!

  • アクセス 前レコード内容を、新レコードにコピー

    アクセスで、テーブルに [日付] と [内容] のフィールドがあって、フォームでデータを入力する際、新しいレコードに[日付]を入力した後、[内容]の項目で、前回に最後のレコードで入力した [内容] のデータを、そのまま新しいレコードに入力したい。コピー貼り付けでもできるが、コマンドボタンを押して、1発で前回のデータをコピーしたい。どんなにしたらできるのですか?よろしくお願いします。

  • ACCESS フォームで抽出条件の違うレコード表示

    宜しくお願いします。 ACCESSでレコードソースをQ_Bとするフォームに、ヘッダー部分に別のクエリ(Q_Aとします)のデータを表示させようと思っています。 Q_Aのデータを元にフォーム内でnoごとに表示するテキストボックス(リストボックスなどでも可)を変えて表示させたいのですがうまくいきません。 Q_Aは No 日付 1 1/15 2 2/1 3 2/5 4 3/12 ・・・レコード数は10あります。 Q_Aの日付フィールドのみ一定期間ごとに変更します。 ですので、一つのテキストボックスには例えば Noのフィールドの「1」のレコードが表示されるようにしたいのです。 Q_Aを元に、レコード数10が個別に表示されるテキストボックス等を、VBAなど?で抽出条件を指定しておきフォームを開いた際に表示できるようにしておきたいのですが、どのような方法があるかご教授願えますでしょうか? よろしくお願い致します。

  • Accessでフォーム上に 直前の データを表示させるには

    Accessでフォーム上で、データを入力するのに、一つ前のレコードの データを基参考に 次のデータを入力したいと思います。一つ前のレコードを そのフォーム上に表示させるには どうすれば良いのでしょうか? あるレコードのすべてのフィールドの値を表示させたいのです。

  • access 現在のレコードが先頭から何番目?

    お世話になります access97ですがそれ以降のバージョンとしても回答でも助かります テーブルAを基に作成したフォームがあり、テーブルAの各データに対応するフォームとなっています テーブルのレコードが例えば3番目のデータを表示するフォームであれば そのフォームのテキストボックスに 3 と 表示されるようにしたいのですが、 あらかじめ用意されている関数には なさそうです エクセルではmatch関数などあるようですがaccessではVBAで作成しないとならないでしょうか もしそうだとしましたら どのようなコードになりますか 例えば学生さんの履修科目の試験の成績を入力したテーブルがあるとして 各学生さんに対応するフォームが1枚ずつできるイメージです 各人のID番号を先に作成して それをフォームに表示するのではなくて テーブルのなかの第何番目かの数値をフォームに表示したいのですが どのようにしたら よいものでしょうか フォームの下のほうにレコードカウントが アクセスには デフォルトでありますが その数字を 自動的に フォーム上に表示したいというわけです 要は新規に入力するデータが 第何番目かを自動的に判別して 新しい帳票フォームの あるテキストに自動で表示したいというわけです わかりにくくて すみませんが お知恵をお貸しくださいませ 宜しくお願い致します

  • アクセスのテーブルのレコードをひとつのフォームにすべて表示ししたい

    アクセス2002を使っています。 ひとつのテーブルに登録しているレコードの値(日付順のフィールドにより数値を入力たレコードです)をひとつの単票形式のフォームにすべて表示するようにしたいのですが、できますか? よろしくお願いします。

  • Access2003 レコードがすべてロックされているため、フィルタを適用できません。エラーについて

    お世話になっております。 Access2003のフォームで今までは普通に使えていたのですが、突然エラーが出るようになりました。 マウスのスクロールボタンでスクロールすると通常は次々にレコードが変わっていきますが、1レコードスクロールするたびに、”レコードがすべてロックされているため、フィルタを適用できません。”というエラーが表示されます。(エラーを閉じると次のレコードには移っています。) コマンドボタン移動するときはこのエラーは出ません。 また、新規入力をするときに、最初に何か入れた時点で同様のエラーが出ます。 そのエラーを閉じれば次からはそのエラーは出ません。 エラーメッセージによると、この二つが”すべてのレコードになっていると書いてありますが、二つともロックしないになっています。 ・オプション≫詳細≫規定のレコードロック ・フォーム≫プロパティ≫レコードロック 思えばこのエラーが出る前後にほかのフォームでVBAが消えるという現象が起きましたので、何かがおかしくなっているのでしょうか。 ご教授いただければ幸いです。よろしくお願いいたします。

  • Accessでの新規レコードの追加の方法

    Windows XP上でMicrosoft Access 2000を使用しています。 オートナンバー型フィールド1つのみを含むテーブルに新規レコードを追加したいのですが、クエリやそれを基にしたフォームを介した方法はもちろんのこと、テーブルをデータシートビューで表示した状態でも追加することができません。 例えばレコードセレクタからレコード追加を選んでレコード保存を選んでも追加されません。 このテーブルに別のフィールドを追加してデータを入れるとレコードの追加が可能なのですが、オートナンバー型フィールド1つのみではうまくいきません。 どなたかオートナンバー型フィールド1つのみを含むテーブルに新規レコードを追加する方法を御存知でしたら御教示下さいませ。

  • ACCESSでのひとつ前レコードの求め方について

    ACCESS2000にてDLOOKUP関数とDMAX関数を用いて一つ前のレコード内容フィールドを クエリにて作成しようとしております。下記の式を設定しクエリを実行すると一つ前の レコード情報(前レコードの ”終了時間”内容)は出力されるのですが、暫くすると "クエリ式 '連番' の構文エラー:演算子がありません" と表示されます。 上記エラーの対処方法を教えて頂けたら思います。 尚、該当の数式ですが 前終了時間: DLookUp("終了時間","訪問業務テーブル(更新後)","連番=" & DMax("連番","訪問業務テーブル(更新後)","連番<" & [連番])) となっております。 ”連番”は オートナンバー形式のもので 1から順番に振られており、この連番を元にひとつ前レコードを参照する様にしております。 上記式に使用されている フィールドのデータ型ですが (1)連番: オートナンバー型 (2)終了時間: テキスト型 となっております。 お手数ですがよろしくお願いします。

  • 【Access2000】レコードの抽出方法

     Access2000を使用してデータベースを作成していますが、抽出条件でつまずいています。  具体的には、  【1】選択クエリーAを基に作成したフォームA(単票形式でレコードを1件ずつ表示)があります。  【2】フォームAの中に単票形式でレポートを出力するマクロボタンが有。  【3】現在はマクロボタンを押すとパラメータで「データNo.?」と入力してもらう形になってレコードを1件抽出する形になっています。    ※画面上に表示されている「データNo.」フィールドの数値を入力してもらう形です。  質問についてですが、今のところはパラメータを入力してもらいレコードを抽出→レポートを出力していますが、パラメータを使わず、現在、フォーム上に表示されているレコード(表示されている1件)を抽出する方法はないかと壁にぶち当たっています。  言い換えれば、レポートを出力する際の元になるクエリの抽出条件で「現在、表示されているレコード」をどのように記述すればいいか、もし御存知の方がいらっしゃいましたら御教示お願いいたします。