質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.92%

Access ある値に紐づいた別の値を、コンボボックスに記入する方法

解決済

回答 2

投稿

  • 評価 0
  • クリップ 0
  • VIEW 1,161

score 34

実現したいこと

Access(2007-2016)で勤怠管理DBを作成しています。

フォームのコンボボックスにVBAで値を入力させようとしているのですが、「実行時エラー2113 このフィールドに入力した値が正しくありません」と表示され、うまく入力できません。ある値に紐づいた別の値を、コンボボックスに記入する方法を教えていただきたいです。

以下、詳細になります。

テーブルとリレーション

〇使用テーブルは7つで、このようにリレーションを組んでいます。以下に、今回使用するテーブル3つを記載します。
イメージ説明

1.勤怠テーブル----------------
勤怠管理No:オートナンバー
社員ID:数値
出社日:日付
出社時間:日付/時刻
退社時間:日付/時刻

勤怠管理No    社員ID    出社日    出社時間    退社時間
1    1    2020/07/02        
2    2    2020/07/02        
3    3    2020/07/02        
4    1    2020/07/03        
5    2    2020/07/03        
6    3    2020/07/03        
7    4    2020/07/03        
8    5    2020/07/03        
9    3    2020/07/07        

2.稼働テーブル------------------
稼働管理No:オートナンバー
勤怠管理No:数値
受注No:数値
タスクID:数値
稼働時間:数値

稼働管理No    勤怠管理No    受注No    タスクID    稼働時間
1    1    1    3    4
2    1    1    2    5
3    1    3    5    2
4    2    1    2    3
5    2    2    1    3
6    3    3    5    2
7    4    3    4    10
8    5    3    4    6
9    5    1    3    7
10    6    1    2    8
11    7    2    5    9
12    7    3    4    4
13    8    3    4    3
14    9    3    5    4

3.社員テーブル------------------
社員ID:オートナンバー
社員名:短いテキスト
時給:数値

社員ID    社員名    時給
1    一郎    100
2    二郎    200
3    三郎    300
4    四郎    400
5    五郎    500

詳細

サブフォーム付きのフォームで、従業員が日々の勤怠情報(氏名、出社日、出社時間、退社時間)と、その稼働内容を入力するフォーム「F_勤怠」を作成しています。今回サブフォームについては無視してください。

イメージ説明

ログインフォームでユーザー名とパスワードを入力すると、「ユーザー名」を保持したまま勤怠管理用のフォーム「F_勤怠」が開くようになっています。

※ログイン用フォームのテキストボックス「Login_UserName」に「一郎」と打ち込みログインした時、「F_勤怠」のテキストボックス「User_name」(赤マル部分)に「一郎」と記入される。
イメージ説明

ログインボタンクリック時

'勤怠管理用のメニューを開く
DoCmd.OpenForm "F_勤怠"   

 '社員名を「F_勤怠」の「User_name」欄に自動で表示
Forms![F_勤怠]![User_name] = Me.Login_UserName.Value 

同様にして、「F_勤怠」のコンボボックス「社員ID」にも社員名を自動入力したいのですが、コンボボックス「社員ID」には社員IDを入力する必要があるため、社員名を入力できません。

コンボボックス「社員ID」の詳細-------------
コントロールソース:社員ID
値集合ソース:社員テーブル
連結列1
列数2
列幅0cm,3cm
ーーーーーーーーーーーーーーーーーーーーーーー

3.社員テーブル(再掲)------------------
社員ID:オートナンバー
社員名:短いテキスト
時給:数値

社員ID    社員名    時給
1    一郎    100
2    二郎    200
3    三郎    300
4    四郎    400
5    五郎    500

テキストボックス「User_name」に記入されている社員名をもとに、それに紐づいた社員IDをコンボボックス「社員ID」に入力するにはどのようにすれば良いのでしょうか。

初歩的な質問かもしれませんが、お力をお貸しいただけると助かります。

  • クリップを取り消します

  • 質問の評価を上げたことを取り消します

  • 質問の評価を下げたことを取り消します

回答 2

checkベストアンサー

+1

非連結フォーム前提での回答でしたので、コード修正しました。

F_勤怠 が新規データ入力用フォームなら、

'勤怠管理用のメニューを開く
DoCmd.OpenForm "F_勤怠", DataMode:=acFormAdd '新規入力用で開く  

With Forms![F_勤怠]
    !User_name.Value = Me.Login_UserName.Value
    !社員ID.DefaultValue = DLookup("社員ID", "社員テーブル", "社員名='" & !User_name.Value & "'")
End With

既存レコードの修正用なら、

'勤怠管理用のメニューを開く
DoCmd.OpenForm "F_勤怠", WhereCondition:="社員ID=" & DLookup("社員ID", "社員テーブル", "社員名='" & Me.Login_UserName.Value & "'")

With Forms![F_勤怠]
    !User_name.Value = Me.Login_UserName.Value
    !社員ID.DefaultValue = DLookup("社員ID", "社員テーブル", .Filter)
End With

コードの解説

新規データ入力用の場合は、OpenForm メソッドの引数で DataMode:=acFormAdd を指定して開くと、新規レコードのみ表示されるフォームになります。
Valueに代入すると不必要にレコードができてしまうので、DefaultValue(規定値)を設定するようにします。こうすると、新規レコードをどんどん追加していっても、自動で規定値として表示されます。

既存レコードの修正用の場合は、WhereCondition で対象社員を抽出するフィルターをかけてフォームを開きます。対象社員のレコードが表示されるので、社員ID にはすでに入力されています。
DefaultValue を設定しているのは、新規レコードへ移動した場合に、既定値として表示させるためです。

投稿

編集

hatena19

VBA総合1位

score 21643

  • sazi

    sazi

    2020/08/12 16:49

    それだとデータ確定してしまいませんか?
  • hatena19

    hatena19

    2020/08/12 16:59

    そうでした。非連結フォームのつもりでした。
    回答修正しました。

+1

画面の構成上、F_勤怠のレコードソースで指定しているテーブルの社員IDに値がセットされないと社員IDコンボボックスには社員名が表示されません。

フォームのTOPに表示されているものと同じ内容なので、表示項目自体を持たなければ良いのでは?
但し、レコード確定時にはレコード移動時イベント等で値のセットは必要だと思いますけど。

投稿

編集

sazi

SQL総合1位

score 21939

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる