アプリ版:「スタンプのみでお礼する」機能のリリースについて

コンボボックスでの検索が出来なくて困っています。

テーブル:職員名簿
  氏・名・職員No・生年月日・所属部署・・・etc.

↑のテーブルを元に入力フォームを作りました(単表形式)。
で、名簿の訂正や変更を行う時の為に検索でレコードを出したいです。

コンボボックス1:氏
コンボボックス2:名
を作って検索出来るようにしたのですが、氏・名 両方が当てはまるレコードを出したいのに、片方ずつの検索しか出来ません。

いろいろ調べてみて「コンボボックスの連携」というのをすると出来るようなのですが(?)、やり方がわかりません。
超初心者なので1から教えていただけるとうれしいです。

氏・名からの検索でレコードが出せれば良いのでもっと他に簡単に出来る方法があればそれでも良いです。

よろしくお願いします。

A 回答 (9件)

> グループ化、並べ替えはどのようにしたら良いですか?


とりあえず・・・
> 検索用コンボボックス(氏)は、
> 名前:コンボ18
値集合ソース:SELECT T職員名簿.氏 FROM T職員名簿 GROUP BY T職員名簿.氏 ORDER BY T職員名簿.氏;
> 検索用コンボボックス(名)は、
> 名前:コンボ20
値集合ソース:SELECT T職員名簿.名 FROM T職員名簿 GROUP BY T職員名簿.名 ORDER BY T職員名簿.名;
として、
それぞれ、書式タブの列数「1」、書式タブの列幅「削除して空白」、書式タブのリスト幅「自動」としてください

現在の状態から、簡単に検索可能かの体験を行うなら、「データ」タブの「連結列」を「1」から「2」へ変更してみてください
(前述の場合、列数1つしかないので2にした場合1に戻してね^^;)
    • good
    • 0
この回答へのお礼

Dxak様

で、で、出来ました~~~~(泣)
うれしすぎる!!!!
なが~い間、ほんとにホントにありがとうございました。

お礼日時:2007/03/30 18:48

すみません、回答が途中ですね><



> 入力用コンボボックス(氏)は、
>  名前:Ctl氏
>  コントロールソース:氏
> 入力用コンボボックス(名)は、
>  名前:Ctl名
>  コントロールソース:名
> コントロールの名前を変更したら、モジュールも変えないといけない
> ですか?

えっと、このモジュールに関しては、変更しなくて良いです^^;
> Set rs = Me.Recordset.Clone
の中の「氏」「名」と
(コンボボックスに使用しているコントロールソースと同一のもの)
フォーム上のコントロールを区別して、レコードソースのフィールド名を故意に参照するために、名前を変えましたので^^;
> rs.FindFirst usFind
の部分で、検索するので問題は、無いはずだったんですが・・・動かないって話しだったんで、まさかと><
    • good
    • 0

ごめんなさい、気が付くのが遅かったです><



> 「[氏]Like'75'」は見つかりませんでした。
の話しと、
> 値集合ソース:SELECT T職員名簿.職員NO, T職員名簿.氏 FROM T職員名簿;
> 値集合ソース:SELECT T職員名簿.職員NO, T職員名簿.名 FROM T職員名簿;
で、検索できない理由が理解できました^^;

コンボボックス上に表示されているデータは、「氏」「名」なのですが、実際入ってるデータは「職員NO」を格納してあります

で、如何直そうか?考えるのですが・・・
いろいろパターンがあります

一番、良いのは、集合ソースの「職員NO」を削除して、「氏」「名」でグループ化、並べ替えと言うのが良さそうですが・・・

この回答への補足

Dxak様

>一番、良いのは、集合ソースの「職員NO」を削除して、「氏」「名」でグループ化、並べ替えと言うのが良さそうですが・・・

グループ化、並べ替えはどのようにしたら良いですか?

補足日時:2007/03/26 18:15
    • good
    • 0

多分、モジュール以外のところの問題を考えないと駄目みたいですね;;



> 一致するレコードを発見できなかった場合の条件をつけると、実際に
> あるレコードの氏名を入力しても「発見できなかった」となってしま
> います。

メッセージを出しているという事は、モジュールの部分は動いているみたいですね^^;
これは、「氏」「名」を両方検索した場合、検索できなかったという事でしょうか?「氏」「名」の片方を検索した場合、検索できますか?

> 'コントロールの値と一致するレコードを検索する
> ↑このあたりの条件を抜くと検索用コンボボックスと入力用画面と
> が連動していないような感じをうけるのですが、気のせいでしょう
> か?

「連動」と言うのが、どういうことなのでしょうか?
入力用画面(フォーム)と検索用画面(フォーム)が別ってことでしょうか?
フォームを別にしてあるのであれば、
> Set rs = Me.Recordset.Clone
> Me.Bookmark = rs.Bookmark

Set rs = Froms("入力用フォームの名前").Recordset.Clone
Froms("入力用フォームの名前").Bookmark = rs.Bookmark
に変更してみてください
(片方づつなら、検索可能であったのであれば、違うとは思うのですが)

検索用コンボボックスと入力用テキストボックスは別のものを使用してください
検索用コンボボックスは「コントロールソース」を設定せず(非連結コンボボックス)に、「値集合ソース」は設定してください
検索用コンボボックスを変えると、入力用テキストが変更されるようだと、レコードセットと連動されてるので、テーブルの内容が変ってしまうのですが・・・

で、確証はないのですが・・・
> 使用しているAccessは2000です。
の場合、フォーム上のコントロールの名前に「Ctl」を付けて、レコードセットのフィールドの名前と、フォームのコントロールの名前を違う名前で、設定してもらえますか?

私の
「Ctl」コントロールの場合の名前の先頭、
「Fld」フィールドの場合の名前の先頭、
「Tbl」テーブルの名前の先頭、
等の名前の付け方の癖は、Acc2000の時の漢字で始まる名前の場合、挙動が思うように動かないことがあると言うことがあったり、フィールド名とコントロール名が同一のものを使用していると、参照が思うように行っていなかったことがあったために付いた癖で、そのときの名残で現在も、そうしてあるだけなんですが・・・

あと、
> 氏のフィールド名=氏
> 名のフィールド名=名
は、テキスト型で良いのですよね^^;

この回答への補足

Dxak様

できません・・・(泣)。こんなに親切に教えていただいているのに・・・。何か根本的に私のやり方が間違っているのでしょうか(>_<)?

>「氏」「名」を両方検索した場合、検索できなかったという事でしょうか?「氏」「名」の片方を検索した場合、検索できますか?

片方を検索した場合にも検索できません。
例えば職員NO.75 のスズキを検索用コンボボックスに入力すると下記のようなコメントが出ます。
「[氏]Like'75'」は見つかりませんでした。

>入力用画面(フォーム)と検索用画面(フォーム)が別ってことでしょうか?

入力用フォームのフォームヘッダーに検索用コンボボックスを作っています。

>検索用コンボボックスと入力用テキストボックスは別のものを使用してください

別のものを使用しています。
検索用コンボボックス(氏)は、
 名前:コンボ18
 コントロールソース:設定していません。
 値集合ソース:SELECT T職員名簿.職員NO, T職員名簿.氏 FROM T職員名簿;
検索用コンボボックス(名)は、
 名前:コンボ20
 コントロールソース:設定していません。
 値集合ソース:SELECT T職員名簿.職員NO, T職員名簿.名 FROM T職員名簿;

>フォーム上のコントロールの名前に「Ctl」を付けて、レコードセットのフィールドの名前と、フォームのコントロールの名前を違う名前で、設定してもらえますか?

「フォーム上のコントロールの名前」は入力用コンボボックスの名前のことですよね?
入力用コンボボックス(氏)は、
 名前:Ctl氏
 コントロールソース:氏
入力用コンボボックス(名)は、
 名前:Ctl名
 コントロールソース:名

コントロールの名前を変更したら、モジュールも変えないといけないですか?


> 氏のフィールド名=氏
> 名のフィールド名=名
は、テキスト型で良いのですよね^^;

はい、テキスト型です。

補足日時:2007/03/19 21:49
    • good
    • 0

基本的な所で私の勘違いなのでしょうか^^;


「=」を「Like」に変更
発見できなかった場合の条件表示

Option Compare Database

Private Sub コンボ18_AfterUpdate()
usRecFind
End Sub

Private Sub コンボ20_AfterUpdate()
usRecFind
End Sub

Private Sub usRecFind()
Dim rs As Object
Dim usFind As String

usFind = ""
' 氏の検索条件追加
If Not IsNull(Me![コンボ18]) Then
usFind = "[氏] Like '" & Me![コンボ18] & "'"
End If
' 名の検索条件追加?
If Not IsNull(Me![コンボ20]) Then
usFind = IIf(usFind = "", "", usFind & " And ") & _
"[名] Like '" & Me![コンボ20] & "'"
End If
' 検索開始
If usFind <> "" Then
Set rs = Me.Recordset.Clone
rs.FindFirst usFind
If rs.NoMatch Then
MsgBox "「" & usFind & "」は見つかりませんでした。", vbOKOnly
Else
Me.Bookmark = rs.Bookmark
End If
End If
End Sub

で、動作確認したのですが・・・
「=」を「Like」に変更を変更しなくても動くのですが、「?」「*」等を使うと検索しないみたいなので「Like」に変更
で、後、気になったのが、変更後違うコントロールにカーソルを移動させてますか?
検索を開始する条件が「AfterUpdate」なので、入力後、カーソルの移動をさせないと、検索を開始しませんが・・・
あと、Accのバージョンいくつになります?

この回答への補足

Dxak様
=をLikeに変更しましたが、やはり変わりません。
>変更後違うコントロールにカーソルを移動させてますか?
というのは検索用コンボボックスに検索したい名前を入力後カーソルを移動させているか?ということですよね?・・でしたら、カーソルは移動させています。
一致するレコードを発見できなかった場合の条件をつけると、実際にあるレコードの氏名を入力しても「発見できなかった」となってしまいます。
最初にあった
'コントロールの値と一致するレコードを検索する
↑このあたりの条件を抜くと検索用コンボボックスと入力用画面とが連動していないような感じをうけるのですが、気のせいでしょうか?
使用しているAccessは2000です。

補足日時:2007/03/14 16:18
    • good
    • 0

>> rs.FindFirst "[職員NO] = " & Str(Nz(Me![コンボ18], 0))


>> ・・・
>> rs.FindFirst "[職員NO] = " & Str(Nz(Me![コンボ20], 0))
と、あったので最初は[職員NO]の検索コントロールを作成してあって、訂正未済で、記載してあると判断して条件に追加したのですが・・・

> 職員NOのコントロール名はどこを見ればわかるのでしょうか?
検索条件を設定するコンボボックスか?テキストボックスか?のコントロールの名前のことです

検索条件を設定するコントロール(テキストボックス、コンボボックス等)をクリックして、逆クリック-プロパティで、コントロールに関してのプロパティが出てきます
そこに、「名前」と言うプロパティが存在しますので、それが「コントロール名」になります

> ' 職員Noの検索条件追加
> If Not IsNull(Me![職員NO]) Then
> usFind = "[職員NO] = " & Str(Me![職員NO])
> End If
この部分は、職員NOを検索条件にする場合に設定しているだけで、すべて削除しても、氏、名の検索は、行います
とりあえずは、'を頭につけて、動作するか?確認してみてください
条件として考える場合は、また考えましょう^^;
上記例は、[職員NO]が数値を取り扱う時の例ですので、[職員NO]を文字で設定してある場合
> usFind = "[職員NO] = " & Str(Me![職員NO])

usFind = "[職員NO] = '" & Str(Me![職員NO]) & "'"
等に変更して記述ください

この回答への補足

Dxak様
職員NOは検索条件に設定していません。
ので、
> ' 職員Noの検索条件追加
> If Not IsNull(Me![職員NO]) Then
> usFind = "[職員NO] = " & Str(Me![職員NO])
> End If
部分は削除しました。
が、やはり検索はできません・・・。

補足日時:2007/03/10 16:58
    • good
    • 0

> rs.FindFirst "[職員NO] = " & Str(Nz(Me![コンボ18], 0))


> ・・・
> rs.FindFirst "[職員NO] = " & Str(Nz(Me![コンボ20], 0))
この2箇所ですね。検索の条件設定しているの・・・
検索のためのモジュールをまとめて・・・

Private Sub コンボ18_AfterUpdate()
usRecFind
End Sub

Private Sub コンボ20_AfterUpdate()
usRecFind
End Sub

Private Sub usRecFind()
Dim rs As Object
Dim usFind As String

usFind = ""
' 職員Noの検索条件追加?
If Not IsNull(Me![職員NOのコントロール名?]) Then
usFind = "[職員NO] = " & Str(Me![職員NOのコントロール名?])
EndIF
' 氏の検索条件追加?
If Not IsNull(Me![コンボ18]) Then
usFind = IIf(usFind = "","",usFind & " And ") & _
"[氏のフィールド名?] = '" & Me![コンボ18] & "'"
EndIF
' 名の検索条件追加?
If Not IsNull(Me![コンボ20]) Then
usFind = IIf(usFind = "","",usFind & " And ") & _
"[名のフィールド名?] = '" & Me![コンボ20] & "'"
EndIF
' 検索開始
IF usFind <> "" Then
Set rs = Me.Recordset.Clone
rs.FindFirst usFind
If Not rs.EOF Then Me.Bookmark = rs.Bookmark
EndIf
End Sub

で、モジュールの動作確認してませんが・・・
[~?]で記述しているところは、それぞれの名前に記述しなおしてみてくださいね

この回答への補足

Dxak様、度々すいません。
以下のようにしたのですが、検索できません。
何か間違ってますか?
ちなみに
氏のフィールド名=氏
名のフィールド名=名
です。
職員NOのコントロール名はどこを見ればわかるのでしょうか?

Option Compare Database

Private Sub コンボ18_AfterUpdate()
usRecFind
End Sub

Private Sub コンボ20_AfterUpdate()
usRecFind
End Sub

Private Sub usRecFind()
Dim rs As Object
Dim usFind As String

usFind = ""
' 職員Noの検索条件追加
If Not IsNull(Me![職員NO]) Then
usFind = "[職員NO] = " & Str(Me![職員NO])
End If
' 氏の検索条件追加
If Not IsNull(Me![コンボ18]) Then
usFind = IIf(usFind = "", "", usFind & " And ") & _
"[氏] = '" & Me![コンボ18] & "'"
End If
' 名の検索条件追加?
If Not IsNull(Me![コンボ20]) Then
usFind = IIf(usFind = "", "", usFind & " And ") & _
"[名] = '" & Me![コンボ20] & "'"
End If
' 検索開始
If usFind <> "" Then
Set rs = Me.Recordset.Clone
rs.FindFirst usFind
If Not rs.EOF Then Me.Bookmark = rs.Bookmark
End If
End Sub

何度もすいませんが回答よろしくお願いします。

補足日時:2007/03/06 23:58
    • good
    • 0

「コンボボックスの連携」と言うのは、抽出条件の設定を簡素化するためのユーザインターフェイスの話で、抽出するほうの話とは、おそらく別物です



例えばで、抽出したい条件を整理していきましょう
名前が混同すると、判らなくなるので、
テーブルの氏、名を、Fld氏、Fld名として
抽出条件になっているコンボボックスの氏、名を、Ctl氏_条件、Ctl名_条件として、整理していきます
・「Ctl氏_条件」、「Ctl名_条件」が両方とも設定されている場合
 「Fld氏 = Ctl氏_条件」かつ「Fld名 = Ctl名_条件」の物を抽出
・「Ctl氏_条件」、「Ctl名_条件」が両方とも空白の場合
 すべてのレコードを表示
・「Ctl氏_条件」だけ設定されているの場合
 「Fld氏 = Ctl氏_条件」の物を抽出
・「Ctl名_条件」だけ設定されているの場合
 「Fld名 = Ctl名_条件」の物を抽出
と、条件を設定していき、これを、Accessの条件として書き直すと
・[Fld氏] = Forms![フォーム名]![Ctl氏_条件] And [Fld名] = Forms![フォーム名]![Ctl名_条件]
・[Fld氏] = Forms![フォーム名]![Ctl氏_条件] And IsNull(Forms![フォーム名]![Ctl名_条件])
・IsNull(Forms![フォーム名]![Ctl氏_条件]) And [Fld名] = Forms![フォーム名]![Ctl名_条件]
・IsNull(Forms![フォーム名]![Ctl氏_条件]) And IsNull(Forms![フォーム名]![Ctl名_条件])
と、なりSQL文にする場合
Where ~ ;の間に、
[Fld氏] = Forms![フォーム名]![Ctl氏_条件] And [Fld名] = Forms![フォーム名]![Ctl名_条件]
Or
[Fld氏] = Forms![フォーム名]![Ctl氏_条件] And IsNull(Forms![フォーム名]![Ctl名_条件])
Or
IsNull(Forms![フォーム名]![Ctl氏_条件]) And [Fld名] = Forms![フォーム名]![Ctl名_条件]
Or
IsNull(Forms![フォーム名]![Ctl氏_条件]) And IsNull(Forms![フォーム名]![Ctl名_条件])
を追加
フィルターで行う場合も、そのまま上記条件の内容を書き込めば、条件として、設立してきます
ただし、Fld氏、Fld名に空白のデータが存在するとか別途、条件が発生する場合、もう少し条件を変更していかなくてはなりません

この回答への補足

Dxak様、回答ありがとうございます。
が、私には高度すぎて・・・?
以下のところを変えればいいのでしょうか?

Option Compare Database

Private Sub コンボ18_AfterUpdate()
' コントロールの値と一致するレコードを検索する
Dim rs As Object

Set rs = Me.Recordset.Clone
rs.FindFirst "[職員NO] = " & Str(Nz(Me![コンボ18], 0))
If Not rs.EOF Then Me.Bookmark = rs.Bookmark
End Sub

Private Sub コンボ20_AfterUpdate()
' コントロールの値と一致するレコードを検索する
Dim rs As Object

Set rs = Me.Recordset.Clone
rs.FindFirst "[職員NO] = " & Str(Nz(Me![コンボ20], 0))
If Not rs.EOF Then Me.Bookmark = rs.Bookmark
End Sub

補足日時:2007/03/04 17:15
    • good
    • 0

> コンボボックス1:氏


> コンボボックス2:名
> を作って検索出来るようにしたのですが、氏・名 両方が当てはまるレコードを出したいのに、片方ずつの検索しか出来ません。

どうやって抽出をしているんですか?
クエリを使っているのなら、抽出条件欄の同じ行に入れてやれば、大丈夫だと思いますけど?
(Or 条件ではなく、And 条件)

この回答への補足

Gin_F様、回答ありがとうございます。
クエリは使用しておりません。

フォームヘッダーにコンボボックスを作り
「コンボボックスで選択した値に対応するレコードをフォームで検索する」
として、テーブルの氏を選択しています。
同様に名も作りました。

補足日時:2007/03/04 17:19
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


このQ&Aを見た人がよく見るQ&A