プロが教えるわが家の防犯対策術!

よろしくお願いします。
おそらく非常に基本的なことだと思いますが、ご指導をお願いいたします。

テーブルでidと氏名はすでに入力されています。他にフィールドがたくさんあり、フォームを使って入力したいのです。次のようにしたいのですが行き詰っています。ご指導お願いします。

やりたいこと:「フォームで氏名のボックスをドロップ式(リスト式?)にして、三角マークをクリックすると氏名が表示され、そこで氏名を選んでレコード移動をし、他のフィールドにデータ入力をしたい。」

よろしくお願いいたします。

A 回答 (3件)

すみません。


えっと、ある程度理解できる前提で貼り付けてますので、説明は省いてました。

Private Sub Ctl選択肢_AfterUpdate()
' コントロールの値と一致するレコードを検索する
Dim rs As Object

Set rs = Me.Recordset.Clone
rs.FindFirst "[氏名] = '" & Me![Ctl選択肢] & "'"
If Not rs.EOF Then Me.Bookmark = rs.Bookmark
Set rs = Nothing

End Sub

フォームに既存のレコード表示コントロールが配置されている前提です。現在氏名に使ってるコントロールでもよいのですが、コントロール名はフィールド名と重ならないように変更してください。
そこから、コントロールのコントロールソースを削除して、VBAの方を以下の2箇所変更してください。
> rs.FindFirst "[氏名] = '" & Me![Ctl選択肢] & "'"
[氏名]の部分は、フォームのレコードソースの氏名に当たるフィールド名に変更してください。[Ctl選択肢]は、氏名を選択するコンボボックスまたはリストボックスのフォーム上のコントロール名です。
コンボボックスまたはリストボックスは、[氏名]に当たるフィールドの値を取得するように設定ください。

後、気になっているのですがコンボボックスを使用するって・・・検索結果なしだと新規レコードに自動的に飛ぶってルーチン不要なのかな?
下手を打つと、違うデータの上に上書きしちゃったって無いです?
    • good
    • 0

フォームにコンボボックスを作ります。


ツールでコンボボックスをフォームに配置するとウィザードが開きテーブルまたはクエリの値をコンボボックスに表示するを選びid・氏名等があるテーブルを指定し順次進め必要なフィールドは全てコンボボックスに表示するようにして作ります。(ここまでは出来ているのですよね)
例えば作ったコンボボックス名をCmb1としてidに保存するとしてコンボボックスの列をid・氏名・住所・電話番号としてフォームの氏名・住所・電話番号の各コントロールにコンボボックスで選択されたレコードの値を代入するようにします。
コンボボックスのフィールドの並びがid・氏名・住所・電話番号とした場合。コンボボックスのプロパティを開きイベントの更新後処理にコードビルダで

Private Sub Cmb1_AfterUpdate()
氏名 = Cmb1.Column(1)   '←この部分を記述します
住所 = Cmb1.Column(2)   '←
電話番号 = Cmb1.Column(3) '←
End Sub
上記のように記述します。そしてフォームを保存して出来上がりです。
フォームを開きコンボボックスでidを選択するとそのレコードの値を氏名・住所・電話番号の各コントロールに表示します。
これが一番簡単な方法です。
ただしフォームのidを選択して代入したいフィールドを全て値集合ソースとしてコンボボックスに表示するようにしないと出来ないのでフォーム上の代入するコントロールが多いとコンボの幅が長くなってしまいます。短くするために見せなくて良いところは幅0の列にすれば表示上見えなくなります。
例えばid・氏名・住所・電話番号とコンボで表示する場合は列数 4 で列幅2cm;2cm;2cm;2cm リスト幅8cm の様になっているのでこれを列数4で列幅2cm;2cm;0cm;0cm リスト幅4cmの様にするとid・氏名のコンボの表示になりますが0cmの幅で住所・電話番号の値を持っているので同様な処理が出来ます。
氏名 = Cmb1.Column(1)の(1)の数字ですがコンボボックスのフィールドはid・氏名・住所・電話番号と並んでいても0・1・2・3という数字で取得するので氏名は2番目ですが1のところの値を取得するということです。

試してみてください。

この回答への補足

ご回答ありがとうございます。お礼が遅くなってごめんなさい。初心者とはいえ理解しがたく、今勉強しながらご指導内容を把握しようとしています。あらためて御礼申し上げます。

補足日時:2005/12/16 15:15
    • good
    • 0
この回答へのお礼

お礼が大変、大変遅くなりました。大変参考になりました。またこれからも勉強してご指導内容をすぐ理解できるレベルに達するようにがんばりたいと思います。ありがとうございました。

お礼日時:2005/12/20 11:27

えっと、例えばのサンプルとして見て下さい。



リストボックスのコントロールソースなしで作成後、更新後処理に

Private Sub Ctl選択肢_AfterUpdate()
' コントロールの値と一致するレコードを検索する
Dim rs As Object

Set rs = Me.Recordset.Clone
rs.FindFirst "[氏名] = '" & Me![Ctl選択肢] & "'"
If Not rs.EOF Then Me.Bookmark = rs.Bookmark
Set rs = Nothing

End Sub

と記述してやれば、レコードの移動します。
えっと、かなり昔に作成したものなので、なぜ、一回Cloneを使用して移動を指定しているのか忘れました。

この回答への補足

ご回答ありがとうございます。
アクセス初心者でVBAになるとまだよくわかりません。
ご指導内容の理解不足かと思いますがお許しください。下記のようにやってみましたが、できませんでした。
コンボボックス(ウィザードOFF)⇒プロパティ⇒イベント⇒更新後処理⇒コードビルダ へ「Pribate sub・・・End Sub」まですべて貼りつけてみました。

まったく無反応なのです。続けてご指導お願いいたします。アクセスはXPです。よろしくお願いいたします。

補足日時:2005/12/12 14:45
    • good
    • 0

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