こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Access vba 教えてください。 初心者です

以下のような
テーブルT_ソフトリスト、テーブルT_ソフト
フォームF_入力
があったときに、フォームの使用者のコンボボックスに入力をしたときに、
T_ソフトから使用者を探して、ソフトリストIDを取得し、そのソフトリストIDを元にT_ソフトソフトのソフト名をフォームのコンボボックスに表示させるようにしたいのですが、
どの様なソースコードを書けばよいでしょうか?



「T_ソフトリスト」←テーブル
==================================
ID  | ソフト名 |
──────────────
1   | A | 
2  | B | 
3  | C | 
4  | D | 
5  | E | 
==================================

「T_ソフト」←テーブル
==================================
ID |ソフトリストID | 使用者 |
───────────────────
1 |  4     | 佐藤  |
2 |  2     | 鈴木  |
3 |  5     | 斉藤  |
4 |  1     | 佐藤  |
5 |  3     | 田中  |
==================================

「F_入力」←フォーム
==================================
使用者  [コンボボックス]←Combo_UserType
ソフト名 [コンボボックス]←Combo_User
==================================

投稿日時 - 2011-01-25 21:55:06

QNo.6474929

困ってます

質問者が選んだベストアンサー

遅くなりました。

(1) Combo_UserTypeの設定
集合タイプ   テーブル/クエリ
値集合ソース  T_使用者
列数      2
列幅      0cm,2cm
連結列     1
リスト幅    3cm


(2) フォームのコード

'######ここから########

Private Sub Combo_UserType_AfterUpdate()

'MsgBox Me!Combo_UserType.Column(0)
Me!Combo_User.RowSource = ""
Me!Combo_User.Requery
Me!Combo_User.Value = ""

'変数宣言
Dim db As Database
Dim rs1 As Recordset
Dim rs2 As Recordset
Dim varSoft As String

'オブジェクト設定
Set db = CurrentDb
Set rs1 = db.OpenRecordset("T_ソフトリスト", dbOpenDynaset)
Set rs2 = db.OpenRecordset("T_ソフト", dbOpenDynaset)

'検索開始
If rs2.RecordCount > 0 Then
rs2.MoveFirst
Do Until rs2.EOF
'データが見つかった時の処理
If CLng(Me!Combo_UserType.Column(0)) = CLng(rs2![使用者]) Then
varSoft = DLookup("[ソフト名]", "T_ソフトリスト", "[ID] = " & rs2![ソフトリストID])
Combo_User_NotInList varSoft, acDataErrAdded
End If
rs2.MoveNext
Loop
End If

rs1.Close: Set rs1 = Nothing
rs2.Close: Set rs2 = Nothing
db.Close: Set db = Nothing
End Sub


Private Sub Combo_User_NotInList(NewData As String, Response As Integer)
If Me!Combo_User.RowSource = "" Then
Combo_User.RowSource = NewData
Else
Combo_User.RowSource = Combo_User.RowSource & ";" & NewData
End If
Response = acDataErrAdded
End Sub

'######ここまで######

Combo_UserTypeの更新後では、いくつか変更しました。

(1)
「'データが見つかった時の処理」のコメント以下の2行。
もし、If文の中に入らないようであれば、
If CLng(Me.Combo_UserType.Column(0)) = CLng(rs2![使用者]) Then
のように、両方、あるいはどちらか一方をCLngでキャストしてみて
ください。たぶん、それで入ると思います。

(2)
varSoft = DLookup("[ソフト名]", "T_ソフトリスト", "[ID] = " & rs2![ソフトリストID])
にしましたが、もとの
varSoft = DLookup("[ソフト名]", "T_ソフトリスト", "[ID] = " & rs2![ソフトリストID] & "")
でもデータは取れると思います。

(3)
Me.Combo_UserType.Column(0)
のようにして、コンボボックスでは名前を表示し、
非表示にしているIDをColumn(0)でコンボボックスの
列のインデックスで指定してIDを取得するように
しました。

(4)
最初に抜けていたオブジェクトの後処理を最後に
追加しました。


たぶん、KtoTtoAさんが言われたキャストはCLng
による型変換だろうと思います。。

投稿日時 - 2011-01-27 11:38:47

お礼

回答有り難うございます。
当方の不手際で、列幅を修正するのを忘れていました。申し訳ございませんm(__)m
これを修正したところ思ったとおりの動作致しました。
何度も丁寧な解説、ご指導ありがとうございました。

投稿日時 - 2011-01-31 11:25:39

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(19)

ANo.19

>■初心者のよくある疑問・間違いや誤解
http://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub04_200.html
>マクロを「書いてみた」「動かした」「ダメでした」。

>よく、WebのExcelVBA関連の掲示板などで、
>初心者の方が他の質問の回答などを参考にして
>マクロを作って動かしてみたものの、
>エラーになったり期待する結果でなかったりして、
>「なぜでしょうか」と質問を上げてくることがあります。
>そのマクロが自分で書いたものでも、
>Webサイトで見つけたものを変更したものでも、
>「マクロの記録」で作られたものであっても同じです。
>(記録したマクロは、最低限同じ環境で起動させないと同じ動作はしないばかりか、
>コードの記録パターンにある程度限りがあるので、
>そのままでも動かないケースもあるようです。)

ということでコラムがあります。
VBAでもマクロでも同じです、回答をいかに有効に使うか。

回答はデタラメを教えているわけありません。
が、少なくとも「動かす前に」内容を確認してから、
同じことを自分の環境に実装する。
回答がどうであれ、
何がどうなっているか、を自分で考える過程も大事です。

投稿日時 - 2011-01-31 07:04:49

お礼

ご指導、ご忠告有難うございます。

今回の質問の件は解決致しました。
ご忠告頂いたとおり、今後も自分で考え要点を整理しながら勉強していきたいと思います。

投稿日時 - 2011-01-31 11:24:17

ANo.18

掲示板上はお互いが手探りで作っていく場でないでしょう。質疑応答、という域超えてます。

質問者は回答の要所だけに集中して自分の聞きたいことを進めたら良いです。

掲示板でコードを聞いたところで、どのくらい同じ環境状態かわかったものでない。そっくりそのまま稼動するとは思わない方が良いし、コピーするだけのやり方は上達遅い。掲示板の模範コードを期待できるのは中身が大丈夫と判断できるときでしょう。

今後のため
作業の進め方、これは見直しした方が良いです。こんな調子で進めたら今後も時間をロスします。

前述のように、整理してみること。要点つかんでますか?。


『エクセルでお仕事』
のサイトの
VBAコラムをみること。

投稿日時 - 2011-01-31 00:21:06

ANo.17

Debug.Print "ソフトリストID=" & rs2![ソフトリストID]
とか
Debug.Print "strSql=" & strSql
を怪しげな変数を記述した後に加えて、イミディエイトウィンドウに
出てくる結果を検討されては?

また長くなってきていますので整理するうえでも現状をもう一度アップされては?

チャンと経緯を追ってのレスではありませんけど・・

投稿日時 - 2011-01-30 15:11:02

ANo.16

少し確認のため。
(1)
Combo_Userは間違いなくコンボボックスですね。
リストボックスではないですね。
何故かというと、Selected(1)というプロパティ
がコンパイルで引っかからないのはリストボックス以外に
考えられないからです。

(2)
Accessのバージョンは何ですか。


(3)
提案のコードで、

If Nz(Combo_UserType) <> "" Then
If (strSql = "") Then


End Iff
End If

をコメントアウトして、、strSqlだけをコメント
アウトしにままにするとどうですか。

(3)
No10での、

If CLng(Me!Combo_UserType.Column(0)) = CLng(rs2![使用者]) Then
varSoft = DLookup("[ソフト名]", "T_ソフトリスト", "[ID] = " & rs2![ソフトリストID])

CLngで型変換してもデータが表示されないということですね。


(4)
提示したコードに何か付け足したりして実行した、
ということではないですね。

投稿日時 - 2011-01-29 21:18:58

ANo.15

字数いっぱいだったので、つづきです。

提案のコードで、

Me!Combo_User.Column(1).Selected = True
Me!Combo_User.Value = Me!Combo_User.ItemData(1)

設定したのは、Combo_Userに表示される
データの数、たとえば表示されるソフト名を
一つにしたかったのか、あるいはsreSqlで取り込まれる
他のフィールドをソフト名だけにしたいので、
上記の設定をコード中にしたのか、いずれか
だと思いますが、どちらでしょうか。

それと、Selectedについてはコードをコンパイル
して、コンパイルが通るか確認してください。

投稿日時 - 2011-01-28 01:39:03

補足

回答有り難うございます。

>「このフォームまたはレポートで指定されて
>いる'(ソフト名)…'は存在しません。」
この件については、コードを貼り間違えていたようで、もう一度貼り直したら出来ました。失礼致しました。

Combo_Userの値集合タイプもコメントを頂いたように設定いたしました。コンパイル、実行が出来るようになったのですが、Combo_Userのコンボボックスに値が入らず、使用者を入力してもソフト名は空欄のコンボボックスが表示されてしまいます。
また、私が提案したコードでも同様の結果となってしまいました。

提案したコードのSelectedについてはコンパイルは通りました。以下2行については、参考にしたソースコードに記述されていたので、よく調べずに意味もなく使ってしまっていました。申し訳ございません。
Me!Combo_User.Column(1).Selected = True
Me!Combo_User.Value = Me!Combo_User.ItemData(1)

投稿日時 - 2011-01-28 09:12:40

ANo.14

【エラーについて】

>「このフォームまたはレポートで指定されて
>いる'(ソフト名)…'は存在しません。」

エラーの位置は
varSoft = DLookup("[ソフト名]", "T_ソフトリスト", "[ID] = " & rs2![ソフトリストID])
のところですか。ここならば一応If文の中に入ったということですが。

varSoft = DLookup("[ソフト名]", "T_ソフトリスト", "[ID] = " & rs2![ソフトリストID])

varSoft = DLookup("[ソフト名]", "T_ソフトリスト", "[ID] = " & rs2![ソフトリストID] & "")
のように末尾に & "" を追加し、変更しても出ますか。

あるいは、デバッグ出来ない表示のみの場合も
あるかもしれませんが、いずれにしても、
コード中のテーブル名やフィールド名に間違いがないか、
あるいは、IDなどがテーブルでは全角文字になっていないか
確認してみてください。また、コードの張り間違いが
ないか確認してみてください。当然ながらコンパイル
をしてみてください。

それと、No10の Combo_Userの設定については変更はありません。
としてのは、Combo_Userの値集合タイプは値リストとした
ことに変更はない、と言う意味です。これも確認してください。

原因をかならず突きとめる必要があります。

【提案のコードについて】
この方法は、まさにコンボボックスの連動で、
No2(これは訂正する必要があるためNo13で対応してください)
とNo13で述べたコンボボックスの値集合ソースを後から
指定しているだけのものです。したがって、SQLL文は
同じSQL文をつかいます。
そこでstrSqlを、

strSql = "SELECT T_ソフトリスト.ソフト名 "
strSql = strSql & "FROM (T_ソフト INNER JOIN T_ソフトリスト ON T_ソフト.ソフトリストID = T_ソフトリスト.ID) INNER JOIN T_使用者 ON T_ソフト.使用者 = T_使用者.ID "
strSql = strSql & "WHERE (((T_ソフト.使用者)=[Forms]![F_入力]![Combo_UserType]));"

に置き換えてください。SQL文が長いのでstrSqlは
文を区切りながらstrSqlに取り込みます。
なお、各strSqlの""中の文の末尾は途中まで
半角開けてあることに留意してください。

【提案のコードについて】その2

Combo_User.RowSourceType = "Table/Query"
Combo_User.RowSource = strSql
Combo_User.Selected(1) = True
Combo_User.Value = Combo_User.ItemData(1)
Me!Combo_User.Requery

まず、

Me!Combo_User.RowSourceType = "Table/Query"
Me!Combo_User.RowSource = strSql
Me!Combo_User.Selected(1) = True
Me!Combo_User.Value = Combo_User.ItemData(1)

のように、Meキーワードをつけてください。
本来は、この部分は、上記のstrSqlのSLECTのところで
SELECT T_ソフトリスト.ソフト名
のように取得するデータを絞っているのでソフト名
だけが出てきます。したがって、

Me!Combo_User.RowSourceType = "Table/Query"
Me!Combo_User.RowSource = strSql
Me!Combo_User.Requery

だけで、いいはずです。それから、

Combo_User.Selected(1) = True
Combo_User.Value = Combo_User.ItemData(1)

この部分についてですが、リストボックスには
複数選択のときに使用するSelectedプロパティ
はありますが、コンボボックスにはないはずですが。
バージョンが違うと追加されたのですかね。
また、
Me!Combo_User.Value = Me!Combo_User.ItemData(1)
はデータが複数ある場合にItemData(1)と設定すると
Combo_Userに二番目のデータがすぐ表示される、
というこです。つまり、ソフト名が複数あると
二番目のソフトがすぐ表示されます。

投稿日時 - 2011-01-28 01:32:42

ANo.13

No10の Combo_Userの設定については変更はありません。
なお、Combo_UserTypeの表示で列幅を

0cm;2cm

に設定していますが、

2cm;2cm

にして、使用者IDが見える状態にしても
検索結果には影響はないので、そのように
したい場合は列幅を変更してみてください。



コンボボックの連動の場合について、変更があります。
(1)
Combo_Userの値集合ソースに設定するSQL文を以下に
します。以下をコピーしてCombo_Userの値集合ソース
に貼り付けます。
また、このSQL文を新しいクエリの
SQLビューに貼り付け、デザインビューにしてテーブル間の
結合線、抽出条件、などを確認してみてください。
またこのクエリを実行してパラメータのフォームに
数値を入れるとソフト名が表示されます。


SELECT T_ソフトリスト.ソフト名
FROM (T_ソフト INNER JOIN T_ソフトリスト ON T_ソフト.ソフトリストID = T_ソフトリスト.ID) INNER JOIN T_使用者 ON T_ソフト.使用者 = T_使用者.ID
WHERE (((T_ソフト.使用者)=[Forms]![F_入力]![Combo_UserType]));

(2)
Combo_UserTypeの値集合ソースはT_使用者です。

(3)
フォームのコードは以下のままで、変更はありません。

Private Sub Combo_UserType_AfterUpdate()
Me!Combo_User.Requery
End Sub

Private Sub Combo_UserType_Change()
Me!Combo_User.Value = ""
Me!Combo_User.Requery
End Sub



コンボの連動は将来使うことが出てくる可能性が
高いので、この際に中身を観察してみてください。


わからないことがあれば補足してください。

投稿日時 - 2011-01-27 18:14:05

補足

コメントが遅くなり申し訳ございません。
多数のコメント、丁寧な解説有り難うございます。

NO.10でコメントを頂いた様に書いてみたのですが、
「このフォームまたはレポートで指定されている'(ソフト名)…'は存在しません。」
と出てしまいました。


コンボの連動についてはご指導頂いたとおりやってみました。
今後に活かすことができそうな便利な物なので使いこなせるように勉強したいと思います。


本題の質問の方ですが、自分でもソースコードを考えて作ってみたのですが、これではソフト名が全て出てしまいうまくいきませんでした。
新たな質問になってしまいますが、SELECT文でフォームで使用者を入力し、ソフト名を取得することは出来るでしょうか?

お願い致します。

Private Sub Combo_UserType_AfterUpdate()
Dim strSql As String
Dim strSql2 As String

Combo_UserType.SetFocus

If Nz(Combo_UserType) <> "" Then
If (strSql = "") Then
strSql = "SELECT T_ソフトリスト.ID, T_ソフトリスト.ソフト名, T_ソフト.使用者 ,T_ソフト.ソフトリストID FROM T_ソフト, T_ソフトリスト WHERE T_ソフト.使用者 = " & Combo_UserType & ";"
End If
End If


Combo_User.RowSourceType = "Table/Query"
Combo_User.RowSource = strSql
Combo_User.Selected(1) = True
Combo_User.Value = Combo_User.ItemData(1)
Me!Combo_User.Requery
End Sub

投稿日時 - 2011-01-27 21:23:08

ANo.12

解決へ向かっているようで、そうでないなら、当初の疑問が残っているならはっきりしましょう。

いっぱい書かれてもわからないとかレベル高すぎるとか。まだ試行錯誤しているとなると、コンボボックスの使い方から確認した方がいいのでは?。

コンボの表示ネタはどこで定義するか、表示列の制御は、とか基本的なところ。
コードみたままやれば、やりたいことは実現でしょうが、KNOW-HOW、テクニック、得るものが少ないのはもったいない。
どちらかと言えばこちらのが後から役に立つものです。

最悪なのは、結果が出たから質問締める。結果が出たが自分では何もできない、そこで、また同じような質問をする。その繰り返し。
ステップアップできてないことでしょうね。

ここらで、整理してみては?

投稿日時 - 2011-01-27 15:54:49

補足

回答有り難うございます。

試行錯誤と言うのは、自分でも考えてソースコードを書いてみていたので「試行錯誤」という言葉を使わせていただきました。誤解を招くような言い方をしてしまい、申し訳ございません。

頂いたコメントのご指摘、ご指導を元に自分でも考えて勉強させて頂いています。

投稿日時 - 2011-01-27 21:22:31

ANo.11

コンボボックスを連動させる例では、
Q使用者をT使用者に変更し、Combo_User
の値集合ソースのT_ソフトとT使用者の
結合線をT_ソフトの使用者とT_使用者の
IDに設定します。

投稿日時 - 2011-01-27 12:07:16

ANo.9

自己解決できる方向に進んでいますか?。

作ってもらうのを待っていませんか?。



>どの様なソースコードを書けばよいでしょうか?

解決でしょうか?。


参考で。
http://www.accessclub.jp/
http://www.mahoutsukaino.com/

投稿日時 - 2011-01-27 00:02:29

補足

ご指摘有難うございます。

アドバイスを参考に自分でも試行錯誤しながら考えていますが、まだ解決しておりません。

コメントを頂いたHPも参考に頑張ってみます。

投稿日時 - 2011-01-27 10:17:47

ANo.8

ちょっと微調整してみます。お待ちを。

投稿日時 - 2011-01-26 21:15:29

補足

お手数おかけして申し訳ないですm(__)m
よろしくお願いします。

投稿日時 - 2011-01-26 22:37:30

ANo.7

【1】もし・・

>使用者は実際には別のテーブルで用意していて、
>数値型となっています。

ということは、T_ソフトの使用者は使用者IDの
ような数値型で、T_使用者のようなテーブルが
別にあるといことでしょうか。

Combo_UserTypeで使うQ使用者は実際にはT
_ソフトの使用者のフィールドをグループ化
して名寄せをし、名前を取り出し、使用者一覧
の代わりにしています。

こういう、経緯なので最終的に

(1) Combo_UserTypeでは値集合ソースを
T_使用者にし、Combo_UserTypeでは使用者名を
選択する機構にしますが、実際には使用者に
割り当てられた使用者IDをもとにT_ソフトの
使用者IDを検索し、同じ使用者IDを持つレコード
から順次ソフト名を取り出し、Combo_Userに
ソフト名を表示する、ということにします。

(2)したがって、T_使用者なる実際のテーブル名と
実際の使用者IDはどのような名称か、また
使用者は使用者でいいのか、そのあたりを聞かせて
ください。


【2】 キャスト
キャストと言う言葉が出てきたのでドッッッッキリ
したのですが、もし・・その二 が想像したもので
ないことを祈って、まずは 【1】もし・・
についてどうなのか、聞かせてください。

投稿日時 - 2011-01-26 18:17:39

補足

回答有り難うございます。

「ということは、T_ソフトの使用者は使用者IDの
ような数値型で、T_使用者のようなテーブルが
別にあるといことでしょうか。」
とおっしゃる通りT_使用者というテーブルがあり、下記のようになっています。

「T_使用者」←テーブル名
ID | 名前 |
──────────
1 | 田中  |
2 | 佐藤  |
3 | 鈴木  |
4 | 斉藤  |

名前:テキスト型


このようになっているので、実際には使用者を変数に入れて取得すると1や4といった数字が返ってくるようになっています。
(1)についてはコメントを頂いたとおりになっています。
これだと何か問題があるでしょうか?(・・;)

投稿日時 - 2011-01-26 19:40:41

ANo.6

ネットで探しているなら
『コンボボックス 連動 連携』
こんなキーワードで事例があると思います。


利用者を必ず先に選択でしょうか?。

利用者を決めたときのソフトは1つに絞られますか、複数ありますか?。


利用者を変えたら都度絞り込むため、利用者コンボの更新後処理でソフト側のデータを準備、となります。表示のもとになるソースを都度変えます。

ソフト側が1つならDLOOKUP関数も有効です。

投稿日時 - 2011-01-26 09:55:16

補足

回答有り難うございます。

>利用者を必ず先に選択でしょうか?。
必ず先に選択します。

>利用者を決めたときのソフトは1つに絞られますか、複数ありますか?。
ソフトは複数になります。

投稿日時 - 2011-01-26 16:14:09

ANo.5

No3の(3)フォームのCombo_Userの設定
のところで、クエリのSQL文を貼り付けたとき、
ずれていました。

SELECT T_ソフトリスト.ソフト名
FROM (T_ソフト INNER JOIN Q使用者 ON T_ソフト.使用者 = Q使用者.使用者) INNER JOIN T_ソフトリスト ON T_ソフト.ソフトリストID = T_ソフトリスト.ID
WHERE (((Q使用者.使用者)=[Forms]![F_入力]![Combo_UserType]));

上記をはりつけてください。

投稿日時 - 2011-01-26 09:47:42

ANo.4

ついでなので、No3の最後に述べて方法を載せて
おきます。

【3】方法その三 (1)のバリエーション
どちらかと言えば、このほうがメイン。

(1) Combo_UserTypeの設定
値集合タイプ   テーブル/クエリ
値集合ソース   Q使用者
列数       1
列幅       2


(2)
以下のコードをフォームのコード表に貼り付け、
保存してください。


'#####ここから#####

Private Sub Combo_UserType_AfterUpdate()

'Combo_Userの初期化
Me!Combo_User.RowSource = ""
Me!Combo_User.Requery
Me!Combo_User.Value = ""


'変数宣言
Dim db As Database
Dim rs1 As Recordset
Dim rs2 As Recordset
Dim varSoft As String

'オブジェクト設定
Set db = CurrentDb
Set rs1 = db.OpenRecordset("T_ソフトリスト", dbOpenDynaset)
Set rs2 = db.OpenRecordset("T_ソフト", dbOpenDynaset)

'検索開始
If rs2.RecordCount > 0 Then
rs2.MoveFirst
Do Until rs2.EOF
'データが見つかった時の処理
If Me!Combo_UserType.Text = rs2![使用者] Then
varSoft = DLookup("[ソフト名]", "T_ソフトリスト", "[ID] = " & rs2![ソフトリストID] & "")
Combo_User_NotInList varSoft, acDataErrAdded
End If
rs2.MoveNext
Loop
End If
End Sub



'コンボボックスにデータを追加するプロシージャ
'AccessのバージョンによってはAddItemが使えるが
'バージョンがいろいろあるのでベタに作成
Private Sub Combo_User_NotInList(NewData As String, Response As Integer)
If Me!Combo_User.RowSource = "" Then
Combo_User.RowSource = NewData
Else
Combo_User.RowSource = Combo_User.RowSource & ";" & NewData
End If
Response = acDataErrAdded
End Sub

'#####ここまで######


以上です。

投稿日時 - 2011-01-26 09:24:46

補足

多数の回答有り難うございます。

No4のやり方でやりたいと思います。
このソースコード通り書いてみたのですが、デバッグをしたときに
>If Me!Combo_UserType.Text = rs2![使用者] Then
このIf文の中に入らないのですが、それはCombo_UserTypeの型と使用者の型とが一致していないからなのでしょうか?
現在、使用者は実際には別のテーブルで用意していて、数値型となっています。
Combo_UserTypeはテキスト型となっています。

キャストのようなものをすれば良いのでしょうか?

投稿日時 - 2011-01-26 16:11:35

ANo.3

【2】方法その二
二つのコンボボックスの値集合ソースにデータを設定し、
二つのコンボボックスを連動させる方法です。
(1)とは違い、コンボボックスのプロパティで「値集合タイプ」
は「テーブル/クエリ」です。

(1) クエリの作成
以下のSQL文を新しいクエリのSQLビューに貼り付け、
「Q使用者」という名前で保存してください。

SELECT T_ソフト.使用者
FROM T_ソフト
GROUP BY T_ソフト.使用者;

(2)フォームのCombo_UserTypeの設定
値集合タイプ テーブル/クエリ
値集合ソース Q使用者
列数     1
列幅     2cm


(3)フォームのCombo_Userの設定
値集合タイプ  テーブル/クエリ
値集合ソース  以下のSQL文を貼り付ける

SELECT T_ソフトリスト.ソフト名
FROM (T_ソフト INNER JOIN Q使用者 ON T_ソフト.使用者 = Q使用者.使用者) INNER JOIN T_ソフ

トリスト ON T_ソフト.ソフトリストID = T_ソフトリスト.ID
WHERE (((Q使用者.使用者)=[Forms]![F_入力]![Combo_UserType]));

列数    1
列幅    2cm


(3)フォームのコードの設定
以下のコードをフォームのコード表に貼り付け、保存してください。



Private Sub Combo_UserType_AfterUpdate()
Me.Combo_User.Requery
End Sub


Private Sub Combo_UserType_Change()
Me!Combo_User.Value = ""
Me!Combo_User.Requery
End Sub



以上、二つの方法です。分からないところがあれば
補足してください。


なお、(1)の方法で、質問に
>フォームの使用者のコンボボックスに入力をしたときに
とあるので、あくまでもコンボボックスに書き込んだ
場合としています。
(1)の場合、コンボボックスのCombo_UserTypeには、
(2)と同じようにコンボボックスにあらかじめ
データをセットしておいて、そこから選び出す
ことも簡単にできます。
そのように変更したいのであれば、補足してください。
少しの変更で済みます。

投稿日時 - 2011-01-26 09:03:46

ANo.2

二つの方法を紹介します。少し入り組んでいますが、
じっくり検討してください。

量が多いので二つに分けます。

【1】方法その一
質問の内容そのままに、二つのコンボボックスに
何も設定しない、言わばテキストボックスのような
使い方。ただ、コントロールがコンボボックス
というだけのものです。

DAOを使っているので、コード表の参照設定から、
Microsoft DAO xx Object Library にチェックが
入っているか確認してください。xxは3.6のような
数字です。なお、Microsoft ActiveX Objects Library xx
にチェックが入っていたらチェックをはずしてください。

Combo_Userのプロパティで「値集合タイプ」を「値リスト」
にしてください。

Combo_UserTypeの更新後処理で設定します。
以下のコードをすべてフォームのコード表に
貼り付け、保存してください。


'#####ここから#####

Private Sub Combo_UserType_AfterUpdate()
'変数宣言
Dim db As Database
Dim rs1 As Recordset
Dim rs2 As Recordset
Dim varSoft As String

'オブジェクト設定
Set db = CurrentDb
Set rs1 = db.OpenRecordset("T_ソフトリスト", dbOpenDynaset)
Set rs2 = db.OpenRecordset("T_ソフト", dbOpenDynaset)

'検索開始
If rs2.RecordCount > 0 Then
rs2.MoveFirst
Do Until rs2.EOF
'データが見つかった時の処理
If Me!Combo_UserType.Text = rs2![使用者] Then
varSoft = DLookup("[ソフト名]", "T_ソフトリスト", "[ID] = " & rs2![ソフトリストID] & "")
Combo_User_NotInList varSoft, acDataErrAdded
End If
rs2.MoveNext
Loop
End If
End Sub


'Combo_Userの初期化
Private Sub Combo_UserType_Change()
Me!Combo_User.RowSource = ""
Me!Combo_User.Requery
Me!Combo_User.Value = ""
End Sub



'コンボボックスにデータを追加するプロシージャ
'AccessのバージョンによってはAddItemが使えるが
'バージョンがいろいろあるのでベタに作成
Private Sub Combo_User_NotInList(NewData As String, Response As Integer)
If Me!Combo_User.RowSource = "" Then
Combo_User.RowSource = NewData
Else
Combo_User.RowSource = Combo_User.RowSource & ";" & NewData
End If
Response = acDataErrAdded
End Sub

'#####ここまで######



方法その一はここまでです。
続く

投稿日時 - 2011-01-26 08:55:46

ANo.1

クエリやVBAのどこまで知っているか、わからないですが・・・。

ID |ソフトリストID | 使用者 |取得
───────────────────
1 |  4     | 佐藤  |D
2 |  2     | 鈴木  |B
3 |  5     | 斉藤  |E
4 |  1     | 佐藤  |A
5 |  3     | 田中  |C
===================

選択クエリ使えば、上記の状態ができるかと思います。

これで5行から「鈴木」を選んだときは、「B」も決定されている、
という感じで考えてみたらどうでしょう。

投稿日時 - 2011-01-25 23:05:23

補足

回答ありがとうございます。
1週間ほど前からネットを元に色々調べながらやっている初心者です…。

ご指摘いただいた様な方法で使用者コンボボックスに入力した場合、それを元にソフト名コンボボックスに入るのでしょうか?

説明不足でしたが、あくまで使用者を入力した後に、ソフト名を絞り込んで表示するようにしたいのですが…

投稿日時 - 2011-01-26 08:47:47

あなたにオススメの質問