Access (VBA)

Access VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 10 Pro : Access 2021)
コンボボックスに意図していない値が表示されてしまう
投稿日時: 23/11/28 14:23:16
投稿者: miyagi07

テーブルと連結されたサブフォーム(データシート)上にあるコンボボックスに、VBAでレコードセットを代入したいです。
レコードセットの中身は1列目が主キー(数字)で、2列目が文字列です。
取得したいのは主キーの方で、コンボボックスに表示させたいのは文字列になります。
 
ところが、フォームを開くと主キーの値が表示されてしまいます。
色々テストをしてみると、データシート上で列の順番を変更すると表示される値が変わってしまうようです。
何列か左に移動させると主キーの値に、右に移動させると文字列の値に表示が変わってしまいます。
コンボボックスから取得する値に問題はありません。
 
この不具合の解決法を知っていたら教えていただきたいです。
なお、データベースの最適化と別の新規ファイルにフォームをエクスポートするのは試しましたが、直りませんでした。
 
 
Sub cmb設定(ByVal Cn As ADODB.Connection, ByVal TgtForm As Form)
 
    Dim Rs As ADODB.Recordset
    Dim SQL As String
 
    Set Rs = New ADODB.Recordset
    Rs.CursorLocation = adUseClient
     
    SQL = "SELECT * FROM テーブル名 ORDER BY 主キー ASC"
    Rs.Open SQL, Cn, adOpenKeyset, adLockOptimistic
 
    With TgtForm.cmb
 
        .ColumnCount = 2
        .BoundColumn = 1
        .ColumnWidths = "0cm;2cm"
        .RowSourceType = "Table/Query"
        Set .Recordset = Rs
 
    End With
 
    Set Rs = Nothing: Close
 
End Sub

回答
投稿日時: 23/11/29 17:34:57
投稿者: Moko

引用:
SSQL = "SELECT * FROM テーブル名 ORDER BY 主キー ASC"

きちんとフィールドを指定してやればよろしいのでは?
SSQL = "SELECT 主キー, 文字列 FROM テーブル名 ORDER BY 主キー ASC"

    
   

投稿日時: 23/11/30 08:45:57
投稿者: miyagi07

Moko様
 
ご回答ありがとうございます。
試してみましたが残念ながら結果は変わりませんでした。

回答
投稿日時: 23/11/30 11:54:34
投稿者: hatena
投稿者のウェブサイトに移動

簡単なサンプルを作成してテストしてみましたが、正常に動作しました。
 
cmb設定を呼び出している部分のコードも提示してください。
 
あと、なぜADOのレコードセットを使用しているのでしょうか。
普通にRecordSourceプロパティにSQLを設定したらダメでしょうか。
 

Sub cmb設定(TgtForm As Form)
    Dim SQL As String
    SQL = "SELECT * FROM 商品マスター ORDER BY 商品番号 ASC"
    With TgtForm.cmb
        .ColumnCount = 2
        .BoundColumn = 1
        .ColumnWidths = "0cm;2cm"
        .RowSourceType = "Table/Query"
        .RowSource = SQL 
    End With 
End Sub

 
こちらの方がシンプルだしトラブルが少ないかと。
こちらの方で試してた結果もお知らせください。

投稿日時: 23/11/30 13:03:42
投稿者: miyagi07

hatena様
 
ADOを使用しているのは、コンボボックスに設定したいテーブルが別のaccdbファイル内にあるためです。
別ファイルだとSQLを直接セットする方法は使えないかと思っていたのですが、私の認識が間違っているのでしょうか。
呼び出し部分のコードを以下に記載します。
 
Private Sub Form_Open(Cancel As Integer)
 
    Dim DBCn As ADODB.Connection
 
    Set DBCn = New ADODB.Connection
 
    DBCn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" _
                        & "Data Source=" & DBPath & ";" _
                        & "Jet OLEDB:Database Password=" & DBPassword & ";"
 
    Call cmb設定(DBCn, Me.サブフォーム名.Form)
  Call cmb2設定(DBCn, Me.サブフォーム名.Form)
 
    Set DBCn = Nothing: Close
 
End Sub

回答
投稿日時: 23/11/30 13:37:27
投稿者: hatena
投稿者のウェブサイトに移動

miyagi07 さんの引用:

ADOを使用しているのは、コンボボックスに設定したいテーブルが別のaccdbファイル内にあるためです。
別ファイルだとSQLを直接セットする方法は使えないかと思っていたのですが、私の認識が間違っているのでしょうか。

SQLの場合はIn句を使って外部DBに接続できます。
 
IN 句 (Microsoft Access SQL) | Microsoft Learn https://learn.microsoft.com/ja-jp/office/vba/access/concepts/miscellaneous/in-clause-microsoft-access-sql
 
パスワード付きなら下記のような感じです。
 
SQL = "SELECT * FROM テーブル名 IN '' [MS Access; DATABASE=C:\他のDB.accdb;PWD=password;] ORDER BY 主キー ASC"
 
あるいはリンクテーブルを作成してそれを使ってもいいかと思います。
 
リンクテーブルを作成して、それをRowSourceに設定した場合はどうなるか確認してもらえますか。

投稿日時: 23/11/30 15:49:18
投稿者: miyagi07

hatena様
 
ご回答ありがとうございます。
In句を使ってSQLを直接セットしてみましたが、残念ながら不具合が直りませんでした。
後出しで大変申し訳ないのですが、リンクテーブルは極力使いたくない事情があります。
コンボボックスへのレコードセットの代入はいくつかのサイトを参考にしたのですが、そもそもADOのレコードセットはコンボボックスへの代入に向いていないのでしょうか?
 
また、コードをすべて検証してみたところ、Form_Loadイベントに記述していた「DoCmd.Maximize」を削除するとコンボボックスの不具合が解消することが分かりました。
ですが、フォームの最大化が必要で記述していたため、困っております。
「DoCmd.Maximize」はコンボボックスに影響を及ぼすコードなのでしょうか?

回答
投稿日時: 23/11/30 17:30:46
投稿者: hatena
投稿者のウェブサイトに移動

miyagi07 さんの引用:
後出しで大変申し訳ないのですが、リンクテーブルは極力使いたくない事情があります。

使いたくない事情があるのは分かりました。
原因の特定のためにとりありずリンクテーブルで試しても同様の不具合ができるかどうか確認してほしたかったのです。
 
こちらではその不具合を再現できないので、問題点の切り分けのためにいろいろ試してみてください。
 
miyagi07 さんの引用:

コンボボックスへのレコードセットの代入はいくつかのサイトを参考にしたのですが、そもそもADOのレコードセットはコンボボックスへの代入に向いていないのでしょうか?

IN句つかっても同じ症状がでるということは、ADOが原因ではないということですね。
 
miyagi07 さんの引用:

また、コードをすべて検証してみたところ、Form_Loadイベントに記述していた「DoCmd.Maximize」を削除するとコンボボックスの不具合が解消することが分かりました。
ですが、フォームの最大化が必要で記述していたため、困っております。
「DoCmd.Maximize」はコンボボックスに影響を及ぼすコードなのでしょうか?

 
サンプルに同様のコードを設定してみましたが、こちらでは再現できませんでした。
こちらでは再現できないし、そのような経験もないので私からはこれ以上のアドバイスは難しいです。
 
他の方の回答をお待ちください。

投稿日時: 23/12/01 08:55:46
投稿者: miyagi07

hatena様
 
リンクテーブルを作成してSQLをコンボボックスにセットしてみましたが、不具合は解消されませんでした。
原因究明にご協力いただき、本当にありがとうございました。
 
コンボボックスはサブフォームの中にあるのですが、色々試していると、メインフォームの「Form_Open」イベントからではなくサブフォームの「Form_Open」イベントからコンボボックスの設定を行うと不具合が解消されることに気がつきました。
「DoCmd.Maximize」がどちらのフォームに記述されていても問題なく使用できました。
ただ、メインフォームからでもサブフォームのコントロールの設定はできると思っていたので、不具合が解消された理由がよく分からず、このまま使用するのが不安です。
何かご存じの方がいらっしゃったら教えていただきたいです。

トピックに返信