電子書籍の厳選無料作品が豊富!

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

A 回答 (4件)

> 実行結果については、どちらも特にエラーメッセージは表示されず


> 画面で見る限りは何も入っていないように見えます。
> 該当項目に移動し金額や日付を入力し更新ボタンをクリックすると
> 正常に反映されていました。

ということは値の代入はできているが、表示に反映されてないという状況のようですね。

通常はすぐに反映されるはずなんですが、なにか普通でない設定をしているのかな。
とりあえず、OS、Accessのバージョン、単票フォームなのか帳票フォームなのか、など、
また、標準から変更した設定などがあればご提示ください。

あと、対症法的な対策になりますが、下記のコードを追加してみてください。


Private Sub 単価ランク_AfterUpdate()
  Me.料金=DLookup("単価","単価マスター","単価ランク=" & Me.単価ランク)
   Me.Repaint
End Sub

あるいは、Me.Recalc を追加してみてください。

この回答への補足

お手数かけます。
まずは本日のテスト結果を報告します。
  Me.Repaint も Me.Recalc も特に変わらずでした。
それと今までは更新日も日付もブランクのままテストしていたのですが
今日は事前に値を入れてテストしてみました。
結果は事前に入れた値が表示されました。

それからパソコンの稼働環境ですが
 OS は XP Home Editin Version 2002 Service Pack3
Office 2007
Explorer8
です。

Form は単票形式で作成しています。
設定は特に変更していないように思います。
テキストボックスで直接指定すれば、値が代入されたので
特に特殊な設定はしていないように思うのですが違うのでしょうか。

補足日時:2012/09/12 21:25
    • good
    • 0

> 一つ目ですが、どんな値が入っているか調べようと思い、


> テキストボックスを作成し、そのコントロールソースに直接
>  = DLookup("単価","単価マスター","単価ランク=" & Me.単価ランク)
> と指定したのですが、後ろの部分が自動的に [Me].[単価ランク] にされてしまい
> うまくいきませんでした。

Me というキーワードはVBAのコード中でしか使えません。

>  = DLookup("[単価]", "単価マスター", "[単価ランク]=" & [Forms]![frm結果入力]![単価ランク])
> と指定したところテキストに単価の数値が入りました。

その式でもいいのですが、同じフォーム上のフィールドやコントロールを参照するときは、フォーム名を省略することでできます。

= DLookup("[単価]", "単価マスター", "[単価ランク]=" & [単価ランク])

>   Private Sub 単価ランク_AfterUpdate()
>   Me.料金=DLookup("[単価]", "単価マスター", "[単価ランク]="
>   & [Forms]![frm結果入力]![単価ランク])
>   End Sub

> と指定してみたのですが、うまくいきませんでした。

"[単価ランク]=" の後に改行が入ってますが、実際のコードにも入ってますか。
入っているなら削除してください。
ここに書き写すときに整形するために入れたのならいいのですが。

で、うまくいかないとは具体的にどのようになるのでしょうか。
エラーメッセージがでるとか、なんの反応もないとか、詳細に説明してください。

> それから二つ目ですが Me.更新日 = Date() と入力したのですが
> () が自動的に消されて Me.更新日 = Date となってしまい
> うまくいきませんでした。

() は消されても問題ないです。コード的には問題ないですね。
それで実行したときにどうなるのか。エラーがでるのか、でるならどんなエラーなのか。
何の反応もないのか。これも説明してください。

あと、コードを編集した後、VBAウィンドウのメニューの[デバッグ]-[****のコンパイル]をクリックしてから、上書き保存するようにしてください。コンパイルするとコードに構文間違いがあると指摘してくれます。

この回答への補足

遅い時間に考えていただきありがとうございます。

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

補足日時:2012/09/11 23:51
    • good
    • 0

> 該当フォーム上の単価ランクのプロパティシートの更新後処理の欄に教えていただいた


> 式をいれてみましたが、うまくいきませんでした。

ひょっとすると更新後処理の欄に直接コードを記述したのかな。

更新後処理にイベントプロシージャとして関連づけるには、下記の手順で。

更新後処理のドロップダウンリストから [イベント プロシージャ] を選択。
右端のビルドボタン[...]をクリックする。
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

この回答への補足

懇切丁寧なご説明ありがとうございます。超初心者の私には大変ありがたいです。
イベントプロシージャなるものの存在もわかり一歩前進できました。
それで結果ですが申し訳ないですが、うまくいきませんでした。
それで昨日、今日と私なりに試したことを報告しますので、どこが悪かったか
指摘していかだけませんでしょうか。
一つ目ですが、どんな値が入っているか調べようと思い、
テキストボックスを作成し、そのコントロールソースに直接
 = 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 となってしまい
うまくいきませんでした。

補足日時:2012/09/11 20:56
    • good
    • 0

> 単価マスターはフィールドとして単価ランク(主キー)と単価(通貨型)があります。


> 消費者マスターのレコードをフォームを使って編集する際に単価ランクをキーに
> 単価マスターから単価を引っ張ってきて 料金 というフィールドに代入して画面に表示し、

フォーム上の 単価ランク の 更新後処理のマクロかイベントプロシージャで、DLookupで該当する単価を取得して、料金フィールドに代入すればいいでしょう。

イベントプロシージャのコード例

Me.料金=DLookup("料金","単価マスター","単価ランク=" & Me.単価ランク)

単価ランク は数値型の場合


> レコードの更新の際に 更新日 というフィールドに当日日付を自動的に代入したいのですが

フォームの更新前処理で、更新日にフィールドに Date() を代入します。

Me.更新日 = Date()

この回答への補足

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

補足日時:2012/09/09 22:23
    • good
    • 0

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

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