- ベストアンサー
アクセスのフォームでクエリを実行する方法とは?
- アクセスのフォームでボタンをクリックすると、詳細部分にクエリの結果を表示させることは可能ですか?
- 表示された文字をクリックすると、クエリの抽出条件がテキストボックスに入力され、その条件でクエリが実行されます。
- テーブル形式ではなく、フォームの形式でクエリの結果を表示することができます。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
サブフォーム形式にした方が、考え方がすっきりすると思います。 前回の http://oshiete1.goo.ne.jp/qa5488799.html の回答も合わせ書いてみます。 前回の帳票部分をフォーム「F_0」とします。 これからボタンで起動しようとしているフォームを「F_1」「F_2」「F_3」と仮定します。 各「F1」「F_2」「F_3」のレコードソースには、それなりのクエリが設定されているものとします。 メインのフォームを「F1」とし、サブフォームコントロール名を「FSUB」とすると、 前回分の回答は、フォーム「F1」「F_0」で以下の様になります。 動作検証していないので、動かないとかあったら、ドンドン修正してください。 以下例) ・フォーム「F1」:このフォームは非連結フォームとなります(単票形式) ' 表示フィルターの設定 Private Sub SetFilter() Dim sWhere As String Dim sAndOr As String sAndOr = " AND " sWhere = "" If (Not IsNull(Me.txt部署)) Then sWhere = sWhere & sAndOr & "([部署] = " & Me.txt部署 & ")" End If ' If (Not IsNull(Me.txt担当者名)) Then ' sWhere = sWhere & sAndOr & "([担当者名] = '" & Me.txt担当者名 & "')" ' End If ' If (Not IsNull(Me.txt品名)) Then ' sWhere = sWhere & sAndOr & "([品名] = '" & Me.txt品名 & "')" ' End If With Me.FSUB.Form If (Len(sWhere) > 0) Then .Filter = Mid(sWhere, Len(sAndOr) + 1) .FilterOn = True Else .FilterOn = False .Filter = "" End If End With End Sub ' 初期状態 条件のクリア Private Sub Form_Load() Call btn00_Click End Sub ' 条件クリアのボタンが押されたら Private Sub btn00_Click() Me.txt部署 = Null Me.txt担当者名 = Null Me.txt品名 = Null Me.FSUB.SourceObject = "F_0" ' 初期のサブフォーム設定 Call SetFilter End Sub ' ヘッダー部に配置したテキストボックスの更新後処理 Private Sub txt部署_AfterUpdate() Call SetFilter End Sub Private Sub txt担当者名_AfterUpdate() ' Call SetFilter End Sub Private Sub txt品名_AfterUpdate() ' Call SetFilter End Sub ・フォーム「F_0」 マウスでクリックされたら Private Sub 部署_Click() With Me.Parent .txt部署.SetFocus .txt部署.Text = Me.部署 End With End Sub Private Sub 担当者名_Click() With Me.Parent .txt担当者名.SetFocus .txt担当者名.Text = Me.担当者名 End With End Sub Private Sub 品名_Click() With Me.Parent .txt品名.SetFocus .txt品名.Text = Me.品名 End With End Sub 追加機能で、フォーム「F1」の各ボタンがクリックされたら、 フォーム「F1」での記述で、サブフォームを切り替えます。 Private Sub ボタン1_Click() Me.FSUB.SourceObject = "F_1" End Sub Private Sub ボタン2_Click() Me.FSUB.SourceObject = "F_2" End Sub Private Sub ボタン3_Click() Me.FSUB.SourceObject = "F_3" End Sub 具体的なデータサンプルがあれば、動作サンプルを提供できるかもしれません。
その他の回答 (3)
- 30246kiku
- ベストアンサー率73% (370/504)
#4です。 誤解釈していたかもしれません。 メインからサブ側への設定でしょうか。 サブからメイン側への設定でしょうか。 #4は、サブからメイン側として考えてました。 (今日はこれにて)
お礼
お疲れ様です。 今日試してみた所うまくいきました。 私の間違いで、以前回答頂いた内容と間違っていました。 Private Sub 担当者名_Click() With Me.Parent Me.担当者名.SetFocus Me.担当者名.Text = Me.担当者名 End With End Sub となっていたからうまくいかなたったのでしょうか Meを削除したらうまくいきました。 迷惑かけます。ありがとうございました。
補足
おはようございます。 会社では、"教えて!goo"は見ることはできるのですが、質問する事はできなくなっているので、会社で色々試してみて、また返事させて頂きます。ありがとうございます。
- 30246kiku
- ベストアンサー率73% (370/504)
#3です 記述内容からみて、おかしそうなところはないような感じですが。 以下をやる前にはファイルのコピーは取っておいてください。 VBE画面の方でのコンパイル(メニューのデバッグの1番上)や、 最適化(Officeボタンの管理の)をしてみてどうなりますか。 また、新規 accdb を作成し、前のものから全てをインポートしてみて、どうなりますか。 (たしか2007でしたよね) でも解決しないとなると、私の手には負えないものと思います。 補足) 検索条件として代入する先がコンボボックスということですが、コンボボックスの設定はどのようになっていますか。 サンプルで示したもので説明してみると、 Private Sub 設備ID_Click() With Me.Parent .txt設備ID.SetFocus .txt設備ID.Text = Me.設備ID End With End Sub Private Sub 設備名_Click() Call 設備ID_Click End Sub というところがあったと思いますが、代入先「txt設備ID」をコンボボックスにして、 値集合ソースが、2列の SELECT 設備ID, 設備名 FROM T設備; で、列幅を 0cm;4cm の様に1列目を表示しないようになっている時には、 .txt設備ID.Text = Me.設備ID 部分は .txt設備ID.Text = Me.設備名 のように、表示されている部分のものを代入する必要があります。 コンボボックスが1列のみであれば、テキストボックスと同じ扱いで良いと思います。
- 30246kiku
- ベストアンサー率73% (370/504)
#2です > テキストボックスの部分をコンボボックスにすると、コンボボックスで選択した際にエラーになってしまいます。(Withがありません)この場合はどの様にしたらよいでしょうか すみません。 どの部分のテキストボックスを、どのような設定のコンボボックスに変更されたのでしょうか。 詳しく説明していただけませんか?
補足
お世話になります。 Private Sub 担当者名_Click() With Me.Parent .担当者名.SetFocus .担当者名.Text = Me.担当者名 End With End Sub これをフォームF_2の詳細部のテキストボックス"担当者名"のクリック時に登録しました。 F1のコンボボックスの名前を"担当者名"としました。 そして、F1でサブフォームにF_2を表示させた時にサブフォームの担当者名をクリックすると、"End With が必要です"となってしまいます。 すいません。テキストボックスでもコンボボックスでも同じでした。 フォームF_2に登録するというのが間違いでしょうか? お手数かけます。
お礼
いつも親切に回答頂き誠にありがとうございます。 初心者な質問ですいませんが、テキストボックスの部分をコンボボックスにすると、コンボボックスで選択した際にエラーになってしまいます。(Withがありません)この場合はどの様にしたらよいでしょうか?