Microsoft Access 掲示板

テーブル変更後、読み込まなくなりました。

36 コメント
views
4 フォロー

お世話になっております。
T_依頼の[依頼者][依頼理由_1][依頼理由_2][依頼理由_3]の表示コントロールを
コンボボックスからテキストボックスに変更した直後から、それまで読み込まれていた
これら4つのフィールドが読み込まなくなりました(ブランクになってしまいます)
表示コントロールの変更が引き金となっていると思うのですが、、、。
ご教示ください!

'##########################
'### 過去IDの読込を行う ###
'##########################

Private Sub btn過去ID読込_Click()  '「btn過去ID読込」をクリックした時
    Call loadForm                  '読込を呼び出し
End Sub

Private Sub loadForm()  '読込処理
    If IsNull(Me.txt依頼ID.Value) Then Exit Sub  '「txt依頼ID」が空なら

    Me.txt依頼日.Value = Null              '「txt依頼日」をクリア
    Me.cmb依頼者.Value = Null              '「cmb依頼者」をクリア
    Me.cmbWNo.Value = Null                 '「cmbWNo」をクリア
    Me.txt品名.Value = Null                '「txt品名」をクリア
    Me.cmb希望処置.Value = Null            '「cmb希望処置」をクリア
    Me.txtロット番号.Value = Null          '「txtロット番号」をクリア
    Me.cmbロット枝.Value = Null            '「cmbロット枝」をクリア
    Me.txt巻き長さ.Value = Null            '「txt巻き長さ」をクリア
    Me.cmb依頼理由1.Value = Null           '「cmb依頼理由1」をクリア
    Me.cmb依頼理由2.Value = Null           '「cmb依頼理由2」をクリア
    Me.cmb依頼理由3.Value = Null           '「cmb依頼理由3」をクリア
    Me.txt補足説明.Value = Null            '「txt補足説明」をクリア
    Me.txt検品フィードバック.Value = Null  '「txt検品フィードバック」をクリア
    
    On Error GoTo ErrorHandler
    
    Dim strSQL As String
    strSQL = _
     "SELECT [依頼日], [依頼者], [W_No], [品名], [希望処置], [ロット番号], [ロット枝], [巻き長さ], [依頼理由_1], [依頼理由_2], [依頼理由_3], [補足説明], [検品フィードバック] " & _
     "FROM T_依頼 " & _
     "WHERE 依頼ID = '" & Me.txt依頼ID.Value & "';"  'SQLを作成
     
    Dim daoDb As dao.Database
    Set daoDb = CurrentDb
    
    Dim daoRs As dao.Recordset
    Set daoRs = daoDb.OpenRecordset(strSQL)
    
    If daoRs.BOF = True And daoRs.EOF = True Then
      MsgBox "対象レコードがありません。", vbInformation, "確認"
      GoTo Finally  'レコードが無ければ終了
    End If
    
    Me.txt依頼日.Value = daoRs![依頼日]  '抽出したレコードをテキストボックスへ
    Me.cmb依頼者.Value = daoRs![依頼者]
    Me.cmbWNo.Value = daoRs![W_No]
    Me.txt品名.Value = daoRs![品名]
    Me.cmb希望処置.Value = daoRs![希望処置]
    Me.txtロット番号.Value = daoRs![ロット番号]
    Me.cmbロット枝.Value = daoRs![ロット枝]
    Me.txt巻き長さ.Value = daoRs![巻き長さ]
    Me.cmb依頼理由1.Value = daoRs![依頼理由_1]
    Me.cmb依頼理由2.Value = daoRs![依頼理由_2]
    Me.cmb依頼理由3.Value = daoRs![依頼理由_3]
    Me.txt補足説明.Value = daoRs![補足説明]
    Me.txt検品フィードバック.Value = daoRs![検品フィードバック]
    
    Me.btn追加.Enabled = False    '「btn追加」を使用不可に
    Me.btn更新.Enabled = True     '「btn更新」を使用可能に
    Me.btn削除.Enabled = True     '「btn削除」を使用可能に
    Me.txt依頼ID.Enabled = False  '「txt依頼ID」を使用不可に
    GoTo Finally
    
ErrorHandler:  'エラートラップ
    MsgBox "Error #: " & Err.Number & vbNewLine & vbNewLine & _
      Err.Description, vbCritical, "エラー"
      
Finally:
    If Not daoRs Is Nothing Then
      daoRs.Close
      Set daoRs = Nothing
    End If
    If Not daoDb Is Nothing Then
      daoDb.Close
      Set daoDb = Nothing
    End If
End Sub

'######################################
'### 読込終了ボタンをクリックした時 ###
'######################################

Private Sub btn読込終了_Click()
    Call initializeForm
    Call Form_Current
End Sub

'##############################
'### レコード移動時のID採番 ###
'##############################

Private Sub Form_Current()
    Const prefix As String = "C"  '「color」の頭文字 "C"
    
    Dim maxID As String
    maxID = DMax("依頼ID", "T_依頼")  '最終IDを取り出す
    
    Dim lastNum As Long
    lastNum = Replace(maxID, prefix, "")  '最終IDから頭文字"C"を除き、数値型へ代入する
    
    Dim newID As String
    newID = prefix & Format(lastNum + 1, "0000000")  '+1して桁を揃えて頭文字"C"と結合
    
    Me.txt依頼ID.DefaultValue = "'" & newID & "'"  '既定値へ代入
End Sub

'######################################################
'### フォームを開いた時に適用する初期化プロシージャ ###
'######################################################

Private Sub Form_Load()
    Call initializeForm  'フォームを開いたら「初期化プロシージャ」を呼び出す
End Sub

'########################################################################
'### 次ロットボタンをクリックした時に適用する初期化とID採番のプロシージャ ###
'########################################################################

Private Sub btn次ロット_Click()  '「btn次ロット」をクリックした時
    
    Me.txtロット番号.Value = Null  '7項目を初期化
    Me.cmbロット枝.Value = Null
    Me.txt巻き長さ.Value = Null
    Me.cmb依頼理由1.Value = Null
    Me.cmb依頼理由2.Value = Null
    Me.cmb依頼理由3.Value = Null
    Me.txt補足説明.Value = Null
    
    Const prefix As String = "C"  '「color」の頭文字 "C"
    
    Dim maxID As String
    maxID = DMax("依頼ID", "T_依頼")  '最終IDを取り出す
    
    Dim lastNum As Long
    lastNum = Replace(maxID, prefix, "")  '最終IDから頭文字"C"を除き、数値型へ代入する
    
    Dim newID As String
    newID = prefix & Format(lastNum + 1, "0000000")  '+1して桁を揃えて頭文字"C"と結合
    
    Me.txt依頼ID.DefaultValue = "'" & newID & "'"  '既定値へ代入
End Sub

'##########################
'### 初期化プロシージャ ###
'##########################

Private Sub initializeForm()       '初期化

    Me.txt依頼日.Value = Null              '「txt依頼日」をクリア
    Me.cmb依頼者.Value = Null              '「cmb依頼者」をクリア
    Me.cmbWNo.Value = Null                 '「cmbWNo」をクリア
    Me.txt品名.Value = Null                '「txt品名」をクリア
    Me.cmb希望処置.Value = Null            '「cmb希望処置」をクリア
    Me.txtロット番号.Value = Null          '「txtロット番号」をクリア
    Me.cmbロット枝.Value = Null            '「cmbロット枝」をクリア
    Me.txt巻き長さ.Value = Null            '「txt巻き長さ」をクリア
    Me.cmb依頼理由1.Value = Null           '「cmb依頼理由1」をクリア
    Me.cmb依頼理由2.Value = Null           '「cmb依頼理由2」をクリア
    Me.cmb依頼理由3.Value = Null           '「cmb依頼理由3」をクリア
    Me.txt補足説明.Value = Null            '「txt補足説明」をクリア
    Me.txt検品フィードバック.Value = Null  '「txt検品フィードバック」をクリア
    Me.btn追加.Enabled = True              '「btn追加」を使用可能に
    Me.btn更新.Enabled = False             '「btn更新」を使用不可に
    Me.btn削除.Enabled = False             '「btn削除」を使用不可に
    Me.txt依頼ID.Enabled = True            '「txt依頼ID」を使用可能に
End Sub

'###############################
'### txt品名に対する入力補助 ###
'###############################

Private Sub cmbWNo_AfterUpdate()       '「cmbW_No」の更新後処理
    txt品名.Value = cmbWNo.Column(2)   '「txt品名」に2列目を表示。編集不可で設定中
End Sub

'##############################################
'### T_依頼にレコードを入力するプロシージャ ###
'##############################################

Private Sub btn追加_Click()  '「btn追加」をクリックした時

    If IsNull(Me.txt依頼日.Value) _
        Or IsNull(Me.cmb依頼者.Value) _
        Or IsNull(Me.cmbWNo.Value) _
        Or IsNull(Me.cmb希望処置.Value) _
        Or IsNull(Me.txtロット番号.Value) _
        Or IsNull(Me.txt巻き長さ.Value) _
        Or IsNull(Me.cmb依頼理由1.Value) Then   '入力チェック
        MsgBox "必要項目が入力されていません", vbInformation, "確認"
        Exit Sub
    End If
    
    Dim db As dao.Database   'データベースへの参照を代入する変数を宣言する
    Dim rs As dao.Recordset  'レコードセットへの参照を代入する変数を宣言する
    
    Set db = CurrentDb()     '現在のデータベースに接続する
    
    Set rs = CurrentDb.OpenRecordset("T_依頼", dbOpenDynaset)  '「T_依頼」への参照を変数rsに代入する
    
    With rs                                     '「T_依頼」にレコードを入力する
        .AddNew                                 'レコードを入力する
        .Fields("依頼ID") = Me!txt依頼ID
        .Fields("依頼日") = Me!txt依頼日
        .Fields("依頼者") = Me!cmb依頼者.Column(2)
        .Fields("W_No") = Me!cmbWNo.Column(7)
        .Fields("品名") = Me!txt品名
        .Fields("希望処置") = Me!cmb希望処置
        .Fields("ロット番号") = Me!txtロット番号
        .Fields("ロット枝") = Me!cmbロット枝
        .Fields("巻き長さ") = Me!txt巻き長さ
        .Fields("依頼理由_1") = Me!cmb依頼理由1.Column(1)
        .Fields("依頼理由_2") = Me!cmb依頼理由2.Column(1)
        .Fields("依頼理由_3") = Me!cmb依頼理由3.Column(1)
        .Fields("補足説明") = Me!txt補足説明
        .Update                                   'レコードを更新する
    End With
    
    rs.Close  'レコードセットを閉じる
    
    Me.txtロット番号.Value = Null   '「btn追加」をクリックしたら7項目を初期化(連続作業に対応するため)
    Me.cmbロット枝.Value = Null
    Me.txt巻き長さ.Value = Null
    Me.cmb依頼理由1.Value = Null
    Me.cmb依頼理由2.Value = Null
    Me.cmb依頼理由3.Value = Null
    Me.txt補足説明.Value = Null
    
    MsgBox "追加しました", vbInformation, "完了"
    
End Sub

'#######################################################
'### テーブル変更のSQLを実行するFunctionプロシージャ ###
'#######################################################

Public Function tryExecute(strSQL As String) As String  'SQLを実行してメッセージを返す関数
    On Error GoTo ErrorHandler
    
    Dim daoDb As dao.Database
    Set daoDb = CurrentDb  '接続
    
    daoDb.Execute strSQL   '実行
    
    tryExecute = ""   '成功の場合は空の文字列が入る
    
    GoTo Finally      '正常に終了したら接続解除へジャンプ
    
ErrorHandler:   'エラー処理
    tryExecute = "Error #: " & Err.Number & vbNewLine & vbNewLine & Err.Description  'エラーの場合はエラーメッセージが入る
  
Finally:   '接続解除
    If Not daoDb Is Nothing Then
      daoDb.Close
      Set daoDb = Nothing
    End If
End Function

'############################
'### UPDATE文の作成と実行 ###
'############################

Private Sub btn更新_Click()   '「btn更新」のクリックイベントプロシージャ

    Dim strSQL As String
    strSQL = _
      "UPDATE T_依頼 " & _
      "SET " & _
        "[依頼者] = '" & Me.cmb依頼者.Value & "', " & _
        "[W_No] = '" & Me.cmbWNo.Value & "', " & _
        "[品名] = '" & Me.txt品名.Value & "', " & _
        "[希望処置] = '" & Me.cmb希望処置.Value & "', " & _
        "[ロット番号] = '" & Me.txtロット番号.Value & "', " & _
        "[ロット枝] = '" & Me.cmbロット枝.Value & "', " & _
        "[巻き長さ] = '" & Me.txt巻き長さ.Value & "', " & _
        "[依頼理由_1] = '" & Me.cmb依頼理由1.Value & "', " & _
        "[依頼理由_2] = '" & Me.cmb依頼理由2.Value & "', " & _
        "[依頼理由_3] = '" & Me.cmb依頼理由3.Value & "', " & _
        "[補足説明] = '" & Me.txt補足説明.Value & "', " & _
        "[検品フィードバック] = '" & Me.txt検品フィードバック & " ' " & _
      "WHERE 依頼ID = '" & Me.txt依頼ID.Value & "';"            'UPDATE文の作成
      
      Dim errMsg As String
      errMsg = tryExecute(strSQL)  'SQLを実行してメッセージを受け取る
      
      If errMsg <> "" Then                    'メッセージが空ではない(エラーがあった)場合
        MsgBox errMsg, vbCritical, "エラー"   '受け取ったエラーメッセージを出力
        Exit Sub   '終了
      End If
      
      Call loadForm                                  '再度読み込み処理を呼び出す
      MsgBox "更新しました", vbInformation, "完了"   '完了メッセージを出力
End Sub
wazawaza
作成: 2022/05/25 (水) 10:07:11
通報 ...
  • 最新
  •  
12
りんご 2022/05/26 (木) 19:21:41 c564b@0e907

 いっその事こと、コンボボックスをテキストボックスに変更するのでは無く、新しいテキストボックスを作ってコードを変更するのは?txt依頼者、txt依頼理由1、txt依頼理由2、txt依頼理由3

13
wazawaza 2022/05/26 (木) 19:36:35

りんごさん
幾つか前に書いた検索コードをうまく利用して
新たに追加したテキストボックスも
検索できるようにできますか?
これが出来れば今回の問題は解決できます。

14
りんご 2022/05/26 (木) 22:19:33 c564b@0e907

>> 13
なんとも言えないけれど

txt依頼理由1:            1

txt検索文字列:                
ここに、表示されている値、例えば、表面不良一般を入力すると駄目で、格納されている値、例えば、(ID番号)1だと検索出来るという感じになると思います。

15

 コマンドボタンを追加したのち、上記を試しましたが
 変化は生じませんでした。

このボタンをクリックしても、何も表示されないということですか。
非常に不可解な現象ですね。

もし、よろしければ、右カラムにあるファイル送信フォームからそのフォームを含むファイルを送ってもらえますか。
テーブルに社外秘のデータがあるなら、データは削除しておいてください。

そうすれば、原因が特定できるかもしれません。

16
wazawaza 2022/05/27 (金) 16:03:05

hatenaさん、りんごさん
解決の糸口が見えて来ました。
問題のコンボボックスの列幅、先頭列の幅を
0cm → 0.1cmにしたところ、読込にて
三列目の値リストが表示されました。

ただし、コンボボックスで選択した後に、
ボックス内に表示されるのが意図しない
先頭列の値です。
ここで三列目の値が表示されれば、
問題は全てクリアできそうです。

そこで、下記サイトを参考に
集合値ソースで操作しようと試みましたが、
読込で表示されない元の状態に戻ってしまいました。

リンク

コンボボックスで選択後に
集合値ソースT_着色作業者の三列目を表示させ、
且つ読込でも表示させるにはどうしたら良いですか?

17
りんご 2022/05/27 (金) 16:28:56 c564b@0e907

                     🔽

先頭列の幅を0cm → 0.1cmにしたところ、…

依頼者りんご🔽

ただし、コンボボックスで選択した後に、…

                   1🔽

コンボボックスをドロップダウン選択した後にも、下記のようになって欲しいという事でしょうか
依頼者りんご🔽

18
wazawaza 2022/05/27 (金) 16:53:16

先頭列の幅を0cm → 0.1cmにしたところ、
先頭列が表示されて

C01🔽

となったのを、三列目を表示させた

ossann🔽

にしたいのです。

19
りんご 2022/05/27 (金) 17:23:59 c564b@0e907

先頭列の幅を0cmに戻すと、Private Sub loadForm() の結果、何も表示されなくなる、という事でよかったですか?また、連結列を1から3に変更するとPrivate Sub loadForm()の内、コンボボックスに代入する所でエラーになる感じで合ってますか?

20
wazawaza 2022/05/27 (金) 17:40:13

りんごさん、解決しました!
仰るとおり、頭列の幅を0cmに戻すと、
Private Sub loadForm() で
読み込まなくなります。

で、『連結列』です!
表示したかった列数
例えば依頼者だったら三列目ですので
連結列0 → 連結列3 にしたら
コンボボックス更新後も三列目
読込後も三列目になりました。

ほか、依頼理由1〜3も同様な操作を
行ったところ、無事に解決いたしました。

色々騒がせた結果、こんな所に原因が
あったとは、目から鱗です。

21
りんご 2022/05/27 (金) 18:15:58 c564b@0e907

>> 13
>> 20

検索できるようにできますか?これが出来れば今回の問題は解決できます。

 正直、どうなっているのかよくわかりませんでした。検索できるようになっていればいいのですが。
>> 15

もし、よろしければ、右カラムにあるファイル送信フォームからそのフォームを含むファイルを送ってもらえますか。

 hatenaさんのありがたい提案なので、1度見てもらっていた方がいいと思います。

22
wazawaza 2022/05/27 (金) 19:06:47

りんごさん
上手くお伝え出来なかったこと、お許しください!
検索は無事に出来るようになりました。

hatenaさん、社外秘は加工、またはフィールドを削除して
お送りします。

23

ossannさん、ファイル受け取りました。
今、忙しいので、手が空いたら中身を確認させていただきます。

24
wazawaza 2022/05/28 (土) 12:25:57

hatenaさん、
お手数をおかけします。
よろしくお願いします!

25

やっとファイルの中身を見ることができました。
で、原因が判明しました。

T_依頼の[依頼者][依頼理由_1][依頼理由_2][依頼理由_3]の表示コントロールを
コンボボックスからテキストボックスに変更した直後から、

これを私は、フォーム上のコンボボックスをテキストボックスに変更したと勘違いしていました。
テーブルのフィールドプロパティで表示コントロールをコンボボックスからテキストボックスに変更したんですね。

で、やりとりに行き違いが生じていました。

で、問題点は、表示コントロールをコンボボックスからテキストボックスに変更したときに、フィールドデータも変更したしまったことですね。

前にもいったように表示コントロールをコンボボックスにした場合、表示されている値と格納されている値が異なる場合があります。
テキストボックスに変換すると格納されている値が表示されますが、それを表示されている値に変更してしまったのが、そもそも間違いです。これを変更してはいけません。

あと、テーブル設計でも、各テーブルに主キーが設定されていません。これもちゃんと主キーを設定する必要があります。

いろいろ修正箇所が生じそうなので、一つずつ説明していくと面倒そうなので、いまから、手直ししたものを作成してそれアップします。
いまから作業しますので少しお待ちください。

26
hatena 2022/05/29 (日) 16:55:03 修正

下記テーブルのフィールドに主キーを設定する。

テーブルフィールド
T_依頼依頼ID
T_着色作業者主キー
T_理由理由ID

T_依頼 の下記のフィールドをリンクしているテーブルの主キーの値に変更する。

依頼者 
W_No
依頼理由1
依頼理由2
依頼理由2

修正後、「W_No」フィールドのデータ型は「数値型」に変更しておいてください。

送付していただいたサンプルテーブルの場合の修正例
画像1

こうすれば、現状の入力フォームで「過去ID読込」ボタンをクリックするとご希望の表示になります。

画像1

もし、表示コントロールの修正前のファイルがあるのなら、表示コントロールを変更するだけにして、データを修正しないようにすれば、上記のような手間は不要です。

27
hatena 2022/05/29 (日) 17:09:46 修正

で、『連結列』です!
表示したかった列数
例えば依頼者だったら三列目ですので
連結列0 → 連結列3 にしたら
コンボボックス更新後も三列目
読込後も三列目になりました。

ほか、依頼理由1〜3も同様な操作を
行ったところ、無事に解決いたしました。

この解決法はデータベースの設計としては間違いです。
連結列は 1 のままにしておいてください。
データベースではほかのテーブルを参照するフィールドはリンク先のテーブルの主キーフィールドを参照する必要があります。

ここで、主キーの値を表示させると、無意味な値になり内容がわかりづらいので、修正前のような表示にしたいですよね。

テーブルのルックアップで表示コントロールをコンボボックスにするとこれが簡単にできるので便利なんですが、データベースの設計について理解できていないと今回のような間違いをしがちです。

初心者のうちはルックアップを使わずにクエリを使って主キー以外のフィールドも表示させるようにするといいでしょう。
このようなクエリをオートルックアップクエリと言ってAccessの必須機能ですので確実にマスターしておくことをお勧めします。

「Access オートルックアップクエリ」をキーワードにWEB検索すると解説ページが多数見つかるのでそのなかからわかりやすそうなサイトで勉強してみてください。

検索用フォームでは、このクエリをレコードソースにすると主キーフィールド以外の列の値で検索することも可能になります。

28

オートルックアップクエリの設計例

画像1

画像の T_理由、T_理由_1、T_理由_2 は1つの同じテーブルです。T_理由 をテーブルの追加で3回追加すると、別名がついて追加されます。

上記のクエリのSQL

SELECT
    T_依頼.依頼ID,
    T_依頼.依頼日,
    T_着色作業者.作業者姓,
    [ORDER FILE].[ワークNO],
    T_依頼.品名,
    T_依頼.希望処置,
    T_依頼.[ロット番号],
    T_依頼.[ロット枝],
    T_依頼.巻き長さ,
    T_理由.理由,
    T_理由_1.理由,
    T_理由_2.理由,
    T_依頼.補足説明,
    T_依頼.検品フィードバック
FROM
    (
        (
            (
                (
                    T_依頼
                    INNER JOIN T_理由 ON T_依頼.依頼理由_1 = T_理由.理由ID
                )
                INNER JOIN T_理由 AS T_理由_1 ON T_依頼.依頼理由_2 = T_理由_1.理由ID
            )
            INNER JOIN T_理由 AS T_理由_2 ON T_依頼.依頼理由_3 = T_理由_2.理由ID
        )
        INNER JOIN T_着色作業者 ON T_依頼.依頼者 = T_着色作業者.主キー
    )
    INNER JOIN ORDER FILE ON T_依頼.W_No = ORDER FILE.ID;
29

「Q_依頼履歴」をオートルックアップクエリに修正
検索用のフォーム「F_依頼履歴一覧」の検索フィールドコンボボックス、詳細セクションのテキストボックスのコントロールソースの修正

修正前サンプルファイル
修正後サンプルファイル

変更前と比べてどこが違うか確認してください。

オリジナルをなるべく尊重して最低限の修正しかしてません。
テーブルのフィールド設計が不適切なものがあります。
例えば「T_着色作業者」の「主キー」と「作業者ID」、「主キー」フィールドを主キーにしましたが、「作業者ID」を主キーにしたほうがいいかもしれません。
なぜ、このような2つのフィールドがあるのか、こちらからは意図が分かりません。
主キーの役割を理解したうえで検討してみてください。

30
りんご 2022/05/29 (日) 22:29:48 c564b@0e907

コンボボックスに代入しているのに表示されない。
コンボ1:          🔽
コンボ2:          🔽
コンボ3:          🔽
コマンド1

Private Sub コマンド1_Click()
Me.コンボ1.Value = 1
Me.コンボ2.Value = ”ほにゃらら“
Me.コンボ2.Value = ”ほにゃらら“
End Sub

ドロップダウン選択時、連結列が表示されるように変更。
コンボ1:          1🔽
コンボ2:          1🔽
コンボ3:1          🔽

再チャレンジ
コンボ1:          🔽
コンボ2:          🔽
コンボ3:          🔽
コマンド1

Private Sub コマンド1_Click()
Me.コンボ1.Value = 1
Me.コンボ2.Value = ”ほにゃらら“
Me.コンボ2.Value = ”ほにゃらら“
End Sub

コンボ1:          1🔽
コンボ2:            🔽エラー:型が違います。
コンボ3:ほにゃらら🔽
数値型には数値型を代入するように変更。

31
hatena 2022/05/29 (日) 23:39:25 修正

表示したかった列数
例えば依頼者だったら三列目ですので
連結列0 → 連結列3 にしたら
コンボボックス更新後も三列目
読込後も三列目になりました。

上の回答で、この設定は間違いといいましたが、なぜ、まちがいか説明しておきます。

コンボボックスの値集合ソースは下記のようなテーブルになってます。

T_着色作業者

主キー作業者ID作業者姓作業者名作業者姓フリガナ作業者名フリガナ
C011234日本太郎ニホンタロウ
C025678東京一郎トウキョウイチロウ

ここで、連結列を3にすると、フィールドには3列目の作業者姓が格納されます。
2行目を選択すれば、「東京」が格納されます。
列幅の設定で3列目が表示されるようになってますので、表示値と格納値が同じになります。
これで、いいように思うかもしれませんが、姓は重複する可能性があります。

例えば、値集合ソースが下記のようなデータの場合、

主キー作業者ID作業者姓作業者名作業者姓フリガナ作業者名フリガナ
C011234日本太郎ニホンタロウ
C025678東京一郎トウキョウイチロウ
C035679東京トウキョウススム

3行目を選択すると「東京」が格納されます。
あとから、この「東京」からどの作業者か特定しようとしても、2行目の作業者なのか、3行目の作業者なのか判別がつきません。

連結列3の設定の cmb依頼者 で3行目を選択してから、下記を実行してみてください。

Debug.Print "格納値: " Me!cmb依頼者.Value
Debug.Print "1列目の値: " & Me!cmb依頼者.Column(0)
Debug.Print "2列目の値: " & Me!cmb依頼者.Column(1)
Debug.Print "3列目の値: " & Me!cmb依頼者.Column(2)
Debug.Print "4列目の値: " & Me!cmb依頼者.Column(3)

格納値: 東京
1列目の値: C02
2列目の値: 5678
3列目の値: 東京
4列目の値: 一郎

というように2行目の作業者がイミディエイトに表示されると思います。重複がある場合、一番上の行が選択されたことになりますので。

つまり、連結列にするフィールドは重複のないユニークなフィールドにする必要があるのです。つまり、主キーフィールドにするというのがデータベース設計の原則です。この値集合ソースなら 連結列 1 です。

32

追加ボタンのクリックイベント Private Sub btn追加_Click() 内の下記のコードも修正する必要があります。

    With rs                                     '「T_依頼」にレコードを入力する
        .AddNew                                 'レコードを入力する
        .Fields("依頼ID") = Me!txt依頼ID
        .Fields("依頼日") = Me!txt依頼日
        .Fields("依頼者") = Me!cmb依頼者.Column(2)
        .Fields("W_No") = Me!cmbWNo.Column(7)
        .Fields("品名") = Me!txt品名
        .Fields("希望処置") = Me!cmb希望処置
        .Fields("ロット番号") = Me!txtロット番号
        .Fields("ロット枝") = Me!cmbロット枝
        .Fields("巻き長さ") = Me!txt巻き長さ
        .Fields("依頼理由_1") = Me!cmb依頼理由1.Column(1)
        .Fields("依頼理由_2") = Me!cmb依頼理由2.Column(1)
        .Fields("依頼理由_3") = Me!cmb依頼理由3.Column(1)
        .Fields("補足説明") = Me!txt補足説明
        .Update                                   'レコードを更新する
    End With

1列目以外を代入しているのは、格納値(.Value)を代入するようにしてください。

    With rs                                     '「T_依頼」にレコードを入力する
        .AddNew                                 'レコードを入力する
        .Fields("依頼ID") = Me!txt依頼ID.Value
        .Fields("依頼日") = Me!txt依頼日.Value
        .Fields("依頼者") = Me!cmb依頼者.Value
        .Fields("W_No") = Me!cmbWNo.Value
        .Fields("品名") = Me!txt品名.Value
        .Fields("希望処置") = Me!cmb希望処置.Value
        .Fields("ロット番号") = Me!txtロット番号.Value
        .Fields("ロット枝") = Me!cmbロット枝.Value
        .Fields("巻き長さ") = Me!txt巻き長さ.Value
        .Fields("依頼理由_1") = Me!cmb依頼理由1.Value
        .Fields("依頼理由_2") = Me!cmb依頼理由2.Value
        .Fields("依頼理由_3") = Me!cmb依頼理由3.Value
        .Fields("補足説明") = Me!txt補足説明.Value
        .Update                                   'レコードを更新する
    End With

.Value は省略することかは可能です。 Me!cmb依頼者.ValueMe!cmb依頼者 は同じ意味になります。

33
wazawaza 2022/05/30 (月) 15:16:37

hatenaさん、ありがとうございます!
ご指摘の通り、各部を見直したところ
見事に希望通りになりました!
本当にありがとうございました!

実は、このデータベースとほぼ同じ内容の
ものを、初心者向けの本で一度作ったの
ですが、初心者向けということもあり、
主キーを含め、一から丁寧に解説されて
いて、とてもスムーズに完成しました。
しかし、私の作ろうとしたものは
50人以上4部門で使うDBでして、
本の作例が個人使用に見合ったものだった
ために、一から作り直すことになり、
今回に至りました。

前にも書いたかもしれませんが、
今回参考にした本はVBAに特化した
内容で、初心者向けのそれとは違い
設計とかを割愛したものだったので、
つい主キーを設定し紐付けするのを
忘れた次第です。

ご指摘を受けて、ハッとしました。
最初に作った時の事がよみがえりました。

誠にありがとうございました!

しかし、新たな問題が発生しました。
テーブルにorder fileというローカルな
テーブルがありますが、これを
勤務先の同名のリンクテーブルに差替えると
例の依頼フォーム下部にあるbtn追加ほか
3つのボタンが、消えてしまう現象が
起こってしまったのです。

考えられる事はございますか?

一難去ってまた一難です。

34
りんご 2022/05/30 (月) 17:59:06 c564b@0e907

 ググッただけですが、ヘッダーの縦方向を狭くするといいのかも。取り敢えず、10cmまで狭くしてみてどうなりますか?もし解決しなければ新しい質問として別に立てるといいでしょう。

つい主キーを設定し紐付けするのを忘れた次第
 
 主キーの他にも、リレーションシップを忘れていませんか?その他に、特別な理由が無ければ、VBAコードをもっと削ってAccessの標準機能に置き換えたほうがいいと思います。

35
wazawaza 2022/05/31 (火) 10:27:35

りんごさん、ありがとうございます!
勤務先の方に診てもらいました。
無茶苦茶な内容で、
なるべくして成ったとの事でした。

時間に追われて、早く仕上げたく
基本的な内容が割愛されている
難しい本を見よう見真似で
無理矢理こじつけた内容だった
と思います。

急がば回れで、組み直してみます。

hatenaさん、
色々とありがとうございました。
お陰で大事な基礎を飛ばしていた事に
気付く事ができました。

長くなったので、締めたいと思います。
みなさん、ありがとうございました!

36

締められましたが、最後にアドバイスを。

Accessはまがりなりにもデータベースソフトですのでテーブル設計等の基礎は大事です。
それができていないと、今回のようトラブルになります。

テーブルの設計に関しては、「正規化」をキーワードに調べてみるといいでしょう。

あと、りんごさんも指摘されてますが、リレーションシップについても理解して設定しておくべきです。

リレーションシップを設定した場合の利点 - hatena chips

また、Accessの基本機能でたいていのことはできますので、安易にVBAにせずに、まずは基本機能で作成して、足らない部分をVBAで補うという設計を推奨します。

今回、非連結で設定していますが、連結フォームでVBAをほぼ使わずに同様のことは可能です。基本機能についての学習もされることを推奨します。