人生最悪の忘れ物

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

A 回答 (10件)

>ボタン経由は避けたいと思います。


>入力の流れの中でスイッチで出来ればと考えています。
レコード移動時イベントを使います

新規レコードに移動したとき
直前入力したレコードの値をコピーし新規レコードに貼り付ければいいんですね

レコード移動時に下のようなコードを書きます

コピー中フラグをStaticで定義

Ifフラグがオフなら
 If新規レコードなら
  フラグオン
  前のレコードに移動
  セットフォーカス
  コピー
  新規レコードに移動
  貼り付け
  フラグオフ
 End If
End If

レコードを移動するたびにイベントが発生します
これによって無限ループにおちいらないように
フラグを設けています

この回答への補足

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

補足日時:2008/08/27 14:30
    • good
    • 1
この回答へのお礼

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

お礼日時:2008/08/28 09:16

>”前のレコードに移動して、各フィールドの値(文字)をコピーして、


>今回の入力が前回のデータと同じであれば貼り付ける”という手順を
>VBAでやらせたかったのですが・・・・
これなら最初に回答した、新規レコードにコピーでいいんじゃないですか
ボタンがいやだとおっしゃいますが、コピーをするには何らかの意思表示が必要です
移動だけではそのレコードをコピーしたいかどうか分かりません
移動だけで何でもかんでもコピーしたら要らない物がガパガパコピーされますよ
ボタンの代わりにダブルクリックでというのも可能です
その場合ウィザードの支援はありませんから
ボタンのウィザードで作ったものをダブルクリックイベントに移し変えればいいですね

>前のレコードに移動するのをVBAできる方法をご教授お願い致します。
DoCmd.GoToRecord(ObjectType, ObjectName, Record, Offset)
でも調べてみれば
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/08/27 19:06

補足: 既定値方式について。



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イベントが発生しないので便利です。
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/08/27 14:43

#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は前から嫌いでしたが、ますます嫌いになりました。コーディングしていて、いらいらさせられること甚だしい。
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/08/27 14:27

#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」テキストボックス一つだけですが、必要なだけ増やしてください。
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/08/28 09:20

コピーしたいフィールドの既定値を新規レコードの時に更新。


これでも目的は達成されると思います。
常に、一つ手前のレコードをコピーなんてありえない話ですから・・・。

この回答への補足

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

補足日時:2008/08/25 16:40
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/08/28 09:29

Accessでは、[Ctrl][Shift][2]と押せば、一つ前のフィールドがコピーされます。


で、この機能を利用するのも一つの手です。
で、私は、[F6]を押せば一つ前のフィールドがコピーされるようにしています。

SendKeys "^("")", False

つまり、[F6]キーが押されたら、このコードが走る仕掛けです。
で、結構、ユーザは多用しているようです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/08/25 19:41

アクセスには「レコード移動前」「レコード移動後」でイベントが発生しないので、面倒ですが、以下のコードで一応前のデータを表示できます



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非連結テキストボックスに表示するだけですが、適当にチューニングしてください。
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/08/22 21:04

DLastはそのような用途に使う関数ではありません


詳しくはMSの技術情報を見てください

要望とは少し異なりますが
移動する前に表示されているレコードを新規レコードにコピーするボタンならウィザードで簡単に作れますよ
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/08/22 20:52

そのDLast関数を呼び出すイベントプロシージャが実行されるためのイベントが発生していないのでは?



あるいは、新しいレコードを入力する際のどこかのタイミングで、その「前のレコードのフィールド内容」が表示されるコントロールを、リフラッシュ(あるいはリクエリー)してみてはどうでしょう。
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/08/21 09:52

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す


おすすめ情報

このQ&Aを見た人がよく見るQ&A