• 締切済み

レコード更新時にデータ値を自動入力したい

たびたびすみません。また詰まってしまったので教えていただけませんでしょうか。 Accessでレコード更新時にある項目に自動的に値を代入したいです。 前提としてテーブルは消費者マスターと単価マスターがあります。 単価マスターはフィールドとして単価ランク(主キー)と単価(通貨型)があります。 消費者マスターのレコードをフォームを使って編集する際に単価ランクをキーに 単価マスターから単価を引っ張ってきて 料金 というフィールドに代入して画面に表示し、 必要に応じて 料金 を画面から変更する形にしたいと考えてます。 どのように指定すればよいでしょうか? それからこれは別の質問にした方がいいかもしれませんが、差し支えなければ 教えて下さい。 レコードの更新の際に 更新日 というフィールドに当日日付を自動的に代入したいのですが どうすればいいでしょうか?

みんなの回答

回答No.4

> 実行結果については、どちらも特にエラーメッセージは表示されず > 画面で見る限りは何も入っていないように見えます。 > 該当項目に移動し金額や日付を入力し更新ボタンをクリックすると > 正常に反映されていました。 ということは値の代入はできているが、表示に反映されてないという状況のようですね。 通常はすぐに反映されるはずなんですが、なにか普通でない設定をしているのかな。 とりあえず、OS、Accessのバージョン、単票フォームなのか帳票フォームなのか、など、 また、標準から変更した設定などがあればご提示ください。 あと、対症法的な対策になりますが、下記のコードを追加してみてください。 Private Sub 単価ランク_AfterUpdate()   Me.料金=DLookup("単価","単価マスター","単価ランク=" & Me.単価ランク)    Me.Repaint End Sub あるいは、Me.Recalc を追加してみてください。

crabcan
質問者

補足

お手数かけます。 まずは本日のテスト結果を報告します。   Me.Repaint も Me.Recalc も特に変わらずでした。 それと今までは更新日も日付もブランクのままテストしていたのですが 今日は事前に値を入れてテストしてみました。 結果は事前に入れた値が表示されました。 それからパソコンの稼働環境ですが  OS は XP Home Editin Version 2002 Service Pack3 Office 2007 Explorer8 です。 Form は単票形式で作成しています。 設定は特に変更していないように思います。 テキストボックスで直接指定すれば、値が代入されたので 特に特殊な設定はしていないように思うのですが違うのでしょうか。

回答No.3

> 一つ目ですが、どんな値が入っているか調べようと思い、 > テキストボックスを作成し、そのコントロールソースに直接 >  = DLookup("単価","単価マスター","単価ランク=" & Me.単価ランク) > と指定したのですが、後ろの部分が自動的に [Me].[単価ランク] にされてしまい > うまくいきませんでした。 Me というキーワードはVBAのコード中でしか使えません。 >  = DLookup("[単価]", "単価マスター", "[単価ランク]=" & [Forms]![frm結果入力]![単価ランク]) > と指定したところテキストに単価の数値が入りました。 その式でもいいのですが、同じフォーム上のフィールドやコントロールを参照するときは、フォーム名を省略することでできます。 = DLookup("[単価]", "単価マスター", "[単価ランク]=" & [単価ランク]) >   Private Sub 単価ランク_AfterUpdate() >   Me.料金=DLookup("[単価]", "単価マスター", "[単価ランク]=" >   & [Forms]![frm結果入力]![単価ランク]) >   End Sub > と指定してみたのですが、うまくいきませんでした。 "[単価ランク]=" の後に改行が入ってますが、実際のコードにも入ってますか。 入っているなら削除してください。 ここに書き写すときに整形するために入れたのならいいのですが。 で、うまくいかないとは具体的にどのようになるのでしょうか。 エラーメッセージがでるとか、なんの反応もないとか、詳細に説明してください。 > それから二つ目ですが Me.更新日 = Date() と入力したのですが > () が自動的に消されて Me.更新日 = Date となってしまい > うまくいきませんでした。 () は消されても問題ないです。コード的には問題ないですね。 それで実行したときにどうなるのか。エラーがでるのか、でるならどんなエラーなのか。 何の反応もないのか。これも説明してください。 あと、コードを編集した後、VBAウィンドウのメニューの[デバッグ]-[****のコンパイル]をクリックしてから、上書き保存するようにしてください。コンパイルするとコードに構文間違いがあると指摘してくれます。

crabcan
質問者

補足

遅い時間に考えていただきありがとうございます。 補足で説明させていただきます。 改行についてはしていません。 ご推測の通り説明する時に長すぎて見づらいと思い改行しました。 実行結果については、どちらも特にエラーメッセージは表示されず 画面で見る限りは何も入っていないように見えます。 該当項目に移動し金額や日付を入力し更新ボタンをクリックすると 正常に反映されていました。 コンパイルはご説明いただいた通りに行いエラーがないのを確認してから SAVEしました。 私がわかる状況はこの程度ですが、これで判断できるでしょうか。 宜しくお願いします。

回答No.2

> 該当フォーム上の単価ランクのプロパティシートの更新後処理の欄に教えていただいた > 式をいれてみましたが、うまくいきませんでした。 ひょっとすると更新後処理の欄に直接コードを記述したのかな。 更新後処理にイベントプロシージャとして関連づけるには、下記の手順で。 更新後処理のドロップダウンリストから [イベント プロシージャ] を選択。 右端のビルドボタン[...]をクリックする。 VBAウィンドウが開き、下記のように表示されるので、 Private Sub 単価ランク_AfterUpdate() End Sub 真ん中の行に下記のようにコードを記述します。 Private Sub 単価ランク_AfterUpdate() Me.料金=DLookup("単価","単価マスター","単価ランク=" & Me.単価ランク) End Sub 二つ目についても、イベントプロシージャが下記のようになるようにしてください。 Private Sub Form_BeforeUpdate(Cancel As Integer) Me.更新日 = Date() End Sub

crabcan
質問者

補足

懇切丁寧なご説明ありがとうございます。超初心者の私には大変ありがたいです。 イベントプロシージャなるものの存在もわかり一歩前進できました。 それで結果ですが申し訳ないですが、うまくいきませんでした。 それで昨日、今日と私なりに試したことを報告しますので、どこが悪かったか 指摘していかだけませんでしょうか。 一つ目ですが、どんな値が入っているか調べようと思い、 テキストボックスを作成し、そのコントロールソースに直接  = DLookup("単価","単価マスター","単価ランク=" & Me.単価ランク) と指定したのですが、後ろの部分が自動的に [Me].[単価ランク] にされてしまい うまくいきませんでした。 それでDLookup関数を調べ  = DLookup("[単価]", "単価マスター", "[単価ランク]=" & [Forms]![frm結果入力]![単価ランク]) と指定したところテキストに単価の数値が入りました。 そこでイベントプロシージャに   Private Sub 単価ランク_AfterUpdate()   Me.料金=DLookup("[単価]", "単価マスター", "[単価ランク]="   & [Forms]![frm結果入力]![単価ランク])   End Sub あるいは   [Forms]![frm結果入力]![料金] = DLookup("[単価]", "単価マスター", "[単価ランク]="   & [Forms]![frm結果入力]![単価ランク]) と指定してみたのですが、うまくいきませんでした。 情報不足かと思いますが、わかる範囲で教えていただけませんか。 それから二つ目ですが Me.更新日 = Date() と入力したのですが () が自動的に消されて Me.更新日 = Date となってしまい うまくいきませんでした。

回答No.1

> 単価マスターはフィールドとして単価ランク(主キー)と単価(通貨型)があります。 > 消費者マスターのレコードをフォームを使って編集する際に単価ランクをキーに > 単価マスターから単価を引っ張ってきて 料金 というフィールドに代入して画面に表示し、 フォーム上の 単価ランク の 更新後処理のマクロかイベントプロシージャで、DLookupで該当する単価を取得して、料金フィールドに代入すればいいでしょう。 イベントプロシージャのコード例 Me.料金=DLookup("料金","単価マスター","単価ランク=" & Me.単価ランク) 単価ランク は数値型の場合 > レコードの更新の際に 更新日 というフィールドに当日日付を自動的に代入したいのですが フォームの更新前処理で、更新日にフィールドに Date() を代入します。 Me.更新日 = Date()

crabcan
質問者

補足

日曜日にも関わらず早速回答いただきありがとうございます。 しかし私が初心者で回答頂いた内容が理解できていないせいかうまくいきませんでした。 具体的に言いますと一つ目については、 該当フォーム上の単価ランクのプロパティシートの更新後処理の欄に教えていただいた 式をいれてみましたが、うまくいきませんでした。 エラー表示はなく値がはいっていない状況でした。 指定する内容はコピー&ペーストで行ったので間違いはないと思います。 "単価マスター"の前の"料金"を"単価"に変えてみましたが結果は変わりませんでした。 二つ目については、 フォームのプロパティシートの更新前処理の欄に式を指定したのですが値は変わらず レコードを更新する際に 'Me'オブジェクトを見つけることができません という エラーメッセージが表示されました。 どのように指定すればよかったのでしょうか?

関連するQ&A

  • レコードの更新履歴について

    Oracle初心者です。 レコードの更新履歴を残す方法を考えているところです。 ■やりたいこと 1)登録、更新、削除の全てについて 2)実行前のレコードを抽出したい 3)特定レコードの更新履歴を一覧として表示したい ■対象レコード ID(主キー、ユニーク) フィールドA(テキスト) フィールドB(テキスト) フィールドC(テキスト) 1つ方法として・・・ 履歴を残したいテーブルと同じ構造の履歴テーブルを作成して、登録、更新、削除が行われる際、必ずこの履歴テーブルに登録することを考えました。 が、あまりスマートでない気もしましたので質問します。 他によい案はありますでしょうか?

  • AXXESSでフォームに表示されているレコードを更新する方法

    いつもありがとうございます。 今回もACCESSの質問です。 顧客マスタを作成し、フォームからフィルターで抽出したレコードが画面に表示されています。 コマンドボタンを押す事でこのレコードの特定のフィールドを更新したいと考えています。 ADOでレコードセットをOPENし、FindしてUpdateする方法だとレコードの競合が発生してしまいます。 簡単にできる方法があるような気がしますが思いつきません。 どなたかお助けをお願いします。

  • Access2003の更新クエリ、レコードの更新欄のフィールド名を自動的に入力するには?

    AとBという2つのテーブルが、全く同じフィールドを30個持っています。 AとBでIDが同一のモノのみ、AにBのデータを丸々更新したいのですが [B].[フィールド名1]というように、IDを除いた残り29個のレコードの更新の欄に 手入力する方法で現在行っています。 追加クエリなどだとフィールドが同じ場合は自動的にレコードの追加欄にフィールド名が現れるのですが 同様に更新クエリでもフィールド名を自動的に出す方法はありますか? 現在上記のような更新クエリを10件以上新規で作成しなければならないのですが 各件に29個も手入力で行うのが非常に面倒でなりません。 やはりSQL等で仕組んでいくようにするのでしょうか?

  • 票フォーム-データ更新について

    Access2003を利用しています。 伝票入力用のワークテーブルを帳票フォームで入力しようとしています。 (ワークテーブル内容) ID 商品コード 商品名 数量 単価区分 単価 金額 単価A 単価B 単価C  ・  ・ (10種類の単価設定あり) 単価J 帳票フォームのレコードソースにワークテーブルをセットして (表示) 商品コード、商品名、数量、単価 金額 (非表示)A単価、B単位、C単価、~J単価 としています。 商品コードが入力されると、商品マスターから情報を取得して 単価A~Jに値をコピーしています。 txt単価A = recW("単価A")  txt単価B = recW("単価B")  txt単価C = recW("単価C")    ・   ・ txt単価J = recW("単価J")  ここで質問ですが、 現状だとレコードに値を入れたい場合、 非表示のテキストボックスを利用していますが フォームのレコードセットにそのまま代入する方法はないでしょうか? 初心者の質問でお恥ずかしいですが、何卒、ご教授ください

  • アクセスの自動入力フォームに手動で入力したい

    初心者ですが、ネットで調べながらaccess2013で、納品書フォームを作りました。 納品書明細テーブルと商品マスタテーブル(商品コード、品番、単位)を納品書明細クエリで紐づけしてフォームを作成しました。商品コードを入力すると、自動的に品番と単位が入るようになっています。 ここで、商品コードがついていない商品(商品マスタに含まれず、今後登録する予定もない)も品番と単位の欄に手動で入力できるようにしたいのですが、可能でしょうか。 今手動で入力すると「フィールド'商品コード'とキーが一致しているレコードをテーブル'商品マスタ'で探すことができません」とエラーが出てしまいます。 ご教示いただけましたら幸いです。よろしくお願いいたします。

  • Access更新クエリの「レコード更新」をフォームから指定する方法

    お世話になっています。 早速ですが質問があります。 テーブルにあるフィールドの値を全て変更する更新クエリを作成したのですが、出来ればフォームから指定したいのです。 どうやったら「レコードの更新」の値をフィールドから指定出来るのでしょうか? 以上、よろしくお願いします

  • 【Access2002】サブフォームのレコードを自動的に1行表示させたい

    お世話になります。 契約社員の契約更新を管理するDBを作っています。 社員マスター(社員NO,氏名、部署...主キーは社員NO)と をメインフォームに 契約マスター(社員NO、回数、更新済・・・主キーは社員NOと回数) をサブフォームにして フォームを作成中です。 例として 社員NO 010 氏名 田中太郎 営業部←メイン 回数 1回目、更新済YES/NO(チェックボックス)←サブ というレコードを持つとします。 契約社員は半年後に2回目の更新をするのですが、 その際、「回数は入っているが(2回目)更新済がNOのもの」という 選択クエリで次に更新する契約社員を抽出したいとおもいます、 今は、この2回目というのを手入力していますが(コンボボックス) 1回目の更新済がYESになれば、自動的に 回数の2回目を入力できた状態であれば非常に楽になります。 関数か簡易なVBAで何かいい方法があれば教えてください。 ちなみに回数は6回目が上限で、常に次の1回分だけ回数が自動的に入ってほしいです。(1,2回目が更新されているのなら3回目が入っている状態) よろしくお願いします

  • アクセスフォームのデータ入力

    教えてください。 アクセス2000で銀行残高管理DBを作っています。 データ入力用フォームで次のフィールドがあるとします。 (1)支払先(2)借方科目名(3)貸方科目名(4)金額(5)摘要 1)同じフォームで複数行のレコードを入力できるようにしたいのですができますか? たとえば5行くらいです。  2)同じ科目の取引が何回も続くような場合に、実行キーを押すと前の行の同じフィールドのレコードを自動的に入力させることはできますか? 以上、ご指導お願い致します。

  • Accessのフォームでデータを入力すると、テーブルと一致するデータをあるフィールドに代入してしまうことは可能ですか?

    本来のAccessの使い方ではないかもしれませんが・・・。 あるフォームで品番を入力すると、品番マスターなるテーブルから値を 検索して一致したフィールド(品名・数量)の値を直接フォームの フィールドに代入してしまうことは可能ですか? マクロの値の代入というものを使ってもうまくいきません。 また、クエリーを使えば、品番を入力すれば品名・数量が出るように することはできるのですが表示上だけですので、フォームに直接値 が入力されるようにしたいのです。 方法がうまく思いつきません。どうかお知恵をお貸しください!!

  • Access2003で、フォーム画面でデータを入力すると、他のレコード

    Access2003で、フォーム画面でデータを入力すると、他のレコードの同じフィールドが全て同じデータになってしまいます。 変更すると、同じ様に全てのレコードのデータが変更されてしまいます。 1件1件別のデータを入力出来る様にするにはどうしたら良いでしょうか? どなたか教えて下さい。 宜しくお願いしますm(_ _)m