図のようにフォーム「F_成績入力」とテーブル「T_生徒テーブル」・「T_成績管理テーブル」
があります。
やりたい事としては、
「F_成績入力」の生徒.txtにT_生徒テーブルの生徒番号を入力して、「抽出」ボタンをおすと、
ラベル「性別」「年齢」「学校名」が表示されて、
国語.txtと数学.txtと英語.txtに数字を入力し、入力完了後「登録」を押すと、
「T_成績管理テーブル」に生徒番号・学校名と入力した国語・英語・数学のデータを書きに行くという処理をしたいと思っています。
CMD_抽出とCMD_登録にはどのようなVBAのコードを書けばよろしいのでしょうか。
ご教示して頂けると助かります。
抽出するコード、登録するコード、例えば、こんな感じになるのかも。最近触ってないのでちょっと怪しいですが。
ただし、フォームのレコードソースを設定したり、クエリの抽出条件にテキストボックスを設定したり、諸々足りていないと動かないので色々ググって下さい。
もしくは
それはさておき、データベースがちゃんとデータベースである為に、Excelの何倍も手間暇をかけて登録する事になるって知っていますか?
取り敢えず、主キーの設定が必要です。例えば、生徒とテスト名と教科が決まると、点数が決まるから、生徒とテスト名と教科を主キーとするなど。
Excelのような通し番号は存在しません。ケースバイケースで並び順は変わります。
そういえば、縦横自由に登録出来るデータベースは無理です。国語、数学、英語の点数を横方向に14,15,16とするのはNGなので、縦方向に登録しましょう。
国語の点数を入力したら、登録ボタンを押して登録。数学の点数を入力したら、登録ボタンを押して登録。英語の点数を入力したら、登録ボタンを押す。エラーが発生、英語が教科として事前登録されていません。英語の点数入力を破棄して、教科として事前登録する為に…
一部修正。
VBAを使わずともアクセスの基本機能でできることです。
まずは基本機能を習得したうえで、それではできないことをVBAでするという設計にした方がいいでしょう。
その前にテーブルの設計におかしな部分がありますので、
下記のような設計としてください。
T_生徒テーブル
フィールド
生徒番号 主キー
名前
年齢
性別
学校名
T_成績管理テーブル
生徒番号
日付
国語
数学
英語
現状のフォームをもとに修正するなら下記の手順になります。
フォームのレコードソースを[T_成績管理テーブル]にします。
生徒番号のテキストボックスは右クリックして[コントロールの種類の変更]→[コンボボックス]でコンボボックスに変換します。
プロパティを下記のように設定します。
名前 cb生徒番号
コントロールソース 生徒番号
値集合タイプ テーブル/クエリ
値集合ソース T_生徒テーブル
連結列 1
列数 5
列幅 1cm;3cm;0cm;0cm;0cm
リスト幅 4cm
性別、年齢、学校名などのラベルは削除して、
テキストボックスを4つ配置して、コントロールソースをそれぞれ下記のように設定します。
=[cb生徒番号].Column(1)
=[cb生徒番号].Column(2)
=[cb生徒番号].Column(3)
=[cb生徒番号].Column(4)
これで、各テキストボックスから生徒番号を選択すると対応する名前、年齢、性別、学校名が表示されます。
国語、数学、英語のテキストボックスのコントロールソースも設定しておきます。
以上で、
最後のテキストボックス(英語)まで入力してEnterキーを押せば、
VBAなしに[T_成績管理テーブル]に登録されます。
りんごさんからも指摘がありますが、
本来は科目は縦に並ぶようにテーブル設計にすべきです。
そのような設計を「テーブルの正規化」といいます。
正規化されていないとデータベースの機能を活かせないので、正規化すべきですが、それを説明しだすと長くなるので、WEB検索して調べてみてください。
正規化の実例 - もう一度学ぶMS-Access
あと、Accessの基本機能、特に連結フォームについてもAccessの入門サイトなどで学習してください。
みなさんいろいろアドバイスありがとうございます。がんばってみます。