Microsoft Access 掲示板

VBAで抽出して登録するまでのコードをご教示ください。

4 コメント
views
4 フォロー

図のようにフォーム「F_成績入力」とテーブル「T_生徒テーブル」・「T_成績管理テーブル」
があります。

やりたい事としては、

「F_成績入力」の生徒.txtにT_生徒テーブルの生徒番号を入力して、「抽出」ボタンをおすと、
ラベル「性別」「年齢」「学校名」が表示されて、
国語.txtと数学.txtと英語.txtに数字を入力し、入力完了後「登録」を押すと、
「T_成績管理テーブル」に生徒番号・学校名と入力した国語・英語・数学のデータを書きに行くという処理をしたいと思っています。

CMD_抽出とCMD_登録にはどのようなVBAのコードを書けばよろしいのでしょうか。
ご教示して頂けると助かります。

画像1

塾長
作成: 2022/01/26 (水) 16:43:58
通報 ...
1
りんご 2022/01/26 (水) 23:02:31 c564b@0e907

どのようなVBAのコードを書けばよろしいのでしょうか。

 抽出するコード、登録するコード、例えば、こんな感じになるのかも。最近触ってないのでちょっと怪しいですが。
 ただし、フォームのレコードソースを設定したり、クエリの抽出条件にテキストボックスを設定したり、諸々足りていないと動かないので色々ググって下さい。

Public Sub 抽出ボタン()
    Me.Requery
End Sub
Public Sub 登録ボタン()
    DoCmd.GoToRecord acDataForm,”フォームの名前”,acNewRecord
    Me.国語 Me.テキストボックス国語の点数
    Me.数学 Me.テキストボックス数学の点数
    Me.英語 Me.テキストボックス英語の点数
    DoCmd.GoToRecord acDataForm,”フォームの名前”,acNext
End Sub

もしくは

Public Sub 登録ボタン()
    DoCmd.OpenQuery “追加クエリの名前”
End Sub

 それはさておき、データベースがちゃんとデータベースである為に、Excelの何倍も手間暇をかけて登録する事になるって知っていますか?
 取り敢えず、主キーの設定が必要です。例えば、生徒とテスト名と教科が決まると、点数が決まるから、生徒とテスト名と教科を主キーとするなど。
 Excelのような通し番号は存在しません。ケースバイケースで並び順は変わります。
 そういえば、縦横自由に登録出来るデータベースは無理です。国語、数学、英語の点数を横方向に14,15,16とするのはNGなので、縦方向に登録しましょう。

教科点数
国語14
数学15
(新規)

 国語の点数を入力したら、登録ボタンを押して登録。数学の点数を入力したら、登録ボタンを押して登録。英語の点数を入力したら、登録ボタンを押す。エラーが発生、英語が教科として事前登録されていません。英語の点数入力を破棄して、教科として事前登録する為に…
 

2
りんご 2022/01/26 (水) 23:24:15 c564b@0e907 >> 1

一部修正。

Public Sub 登録ボタン()
    DoCmd.GoToRecord acDataForm,”フォームの名前”,acNewRecord
    Me.教科 = Me.テキストボックス教科
    Me.点数 = Me.テキストボックス点数
    DoCmd.GoToRecord acDataForm,”フォームの名前”,acNext
End Sub
3

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の入門サイトなどで学習してください。

4
塾長 2022/02/01 (火) 08:34:42 c04e3@ba492

みなさんいろいろアドバイスありがとうございます。がんばってみます。