• ベストアンサー

アクセス2000でデータ抽出時に・・・。

以前、質問No.203113で教えていただいたデータ抽出方法を応用して、別のデータベースでも同じようなものを作ったのですが、条件を入力して抽出できるものと出来ないものが出てきました。エラーとして「実行時エラー'2185':コントロールがフォーカスを取得していない時に、コントロールのプロパティまたはメソッドを参照することはできません。」と出ます。 テーブルには、T_グループ名、T_個人名簿、T_住所一覧があり、T_グループ名に付けたサブデータシートではT_個人名簿が正しく表示されているのに(グループ名でリンクしている)、T_グループ名とT_個人名簿から作ったクエリではデータが漏れています(T_個人名簿で代表者をチェックしてグループ名とその代表者がわかるように選択クエリを作っています)。このクエリをもとにフォームを作っているのですが、ここで表示されていないデータの抽出条件を入れると、上のようなエラーが出ます。クエリで表示されているものは上手く抽出できます。 このクエリをもとに作ったフォームだから、条件を入れても抽出できないのだろう、と言うことはわかるのですが、解決方法がわかりません。 ビギナーなので、どのように表現すればわかっていただけるのか・・・。わかりにくい内容ですが、どなたかご指導お願いします。

  • mk114
  • お礼率39% (21/53)

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

  • ベストアンサー
  • yoisho
  • ベストアンサー率64% (331/516)
回答No.8

フォームの追加許可が True なのに新規レコード行が表示されないのは、レコードソースのクエリーが、(たとえば集計をしているなどの理由で)データ更新不可になっているためかもしれません。 いずれにしても、レコード数がゼロで、新規レコードも表示されていない状態でフィルターをかけるとエラーが出てしまうと思います。 とりあえず思いつく方法をお示ししますので、試してみてください。 (良く考えれば、もっとスマートなやり方があるかもしれませんが、とりあえずご容赦ください。) Private Sub グループ名抽出_Change() If Me.RecordsetClone.RecordCount = 0 Then Me.FilterOn = False Me! グループ名抽出.SetFocus End If Me.Filter = "グループ名 Like '" & Me!グループ名抽出.Text & "*' and 活動内容 Like '*" & Me!活動内容抽出 & "*'" Me.FilterOn = True End Sub 以下はコードの解説です。 If Me Record~ もしフォームのレコード数がゼロなら、以下の行を実行。 Me.FilterOn = ~ フォームのフィルターを解除。 Me! グループ名~ 抽出条件を選んだコンボボックスにフォーカスを戻す。(フィルターでコンボボックスの Text プロパティを参照しているので、フォーカスが戻っていないとエラーが出てしまうので) また外してましたら、すみませんけど補足でご連絡ください。

mk114
質問者

補足

いろいろとお世話になります。早速やってみましたが、 「Me! グループ名抽出.SetFocus 」 この部分が構文エラーと表示されました。私にはよく解りません。。。 それで、私なりにちょっとやってみたのですが、フォームのプロパティのレコードセットの所を「ダイナセット」から「ダイナセット(矛盾を許す)」にしてみたら、間違った条件を入れたら新規レコードが表示され、エラーが出なくなりました。このまま使っていると何か不具合が起きたりするのでしょうか? ことばの意味を理解せずに「何となく・・・」でさわっているので今回みたいにコードの解説をしていただけると本当に勉強になります。よろしくお願いします。

その他の回答 (9)

  • yoisho
  • ベストアンサー率64% (331/516)
回答No.10

一つ忘れてました。 Me! グループ名抽出.SetFocus でエラーが出るのは、Me!の後ろに余分な半角スペースが入っているせいだと思います。 (ちゃんとテストしないでアドバイスを載せてしまうので、こんなミスが出ちゃうんですね。ごめんなさい。)

mk114
質問者

お礼

長らくお世話になりました。エラーにならずに表示できるように出来ました。活動内容抽出についても、応用して出来るようになりました。本当にお世話になりました。 それにしても、「Me!の後ろに余分な半角スペースが入っているせいだと・・・」これくらいのことは、教えていただかなくても自分で気づくことが出来るように早くなりたいものです。 本当にどうもありがとうございました。これに懲りずにまたお願いします。(*^_^*)/~~

  • yoisho
  • ベストアンサー率64% (331/516)
回答No.9

またまたお役に立てず、すみません。 >このまま使っていると~・・・ このフォームで、データの更新や追加を行っていないなら、まったく問題はありません。 もし行って入る場合は、(たぶん問題ないとは思いますが)クエリーを確認してみないと多少不安はあります。

mk114
質問者

お礼

お世話になります。 データの更新や追加を行っていないので、大丈夫なんだったらこのままでもいいかな~と思いつつ、もう一つ投稿していただいているので試してみます。

  • yoisho
  • ベストアンサー率64% (331/516)
回答No.7

外しまくって、すみません。 エラーが出るのは、フォームにフィルターをかけたときでしょうか? 間違った抽出条件を入れた直後でしょうか?それとも次の抽出条件を入れてからでしょうか? 間違った抽出条件を入れたときに、フォームには空欄の新規レコードが表示されていますでしょうか? もしさしつかえがなければ、エラーの出るプロシージャをお示しいただけませんでしょうか。

mk114
質問者

補足

度々お世話になります。間違った抽出条件を入れた時、フォームヘッダー以外、詳細の欄内は何も表示されなくなります。次の抽出条件を入れようと思い、間違った抽出条件を消そうとすると、エラーが出ます。エラーの出るプロシージャは下のとおりです。 Private Sub グループ名抽出_Change() Me.Filter = "グループ名 Like '" & Me!グループ名抽出.Text & "*' and 活動内容 Like '*" & Me!活動内容抽出 & "*'" Me.FilterOn = True End Sub Private Sub 活動内容抽出_Change() Me.Filter = "グループ名 Like '" & Me!グループ名抽出 & "*' and 活動内容 Like '*" & Me!活動内容抽出.Text & "*'" Me.FilterOn = True End Sub 活動内容抽出も、同じようにエラーが出ます。本当に度々お手数をおかけして申し訳ございませんがご指導よろしくお願いします。

  • maro200
  • ベストアンサー率45% (15/33)
回答No.6

こんにちは。 >選択クエリで、個人名簿の代表者チェックボックスがonになっている人を、 >住所フィールドの値に関係なく抽出できるように出来るのでしょうか? その通りです。 LEFT JOINにしたら [T_個人名簿].[住所ID] の中に[T_住所一覧].[住所] と一致するデータがなくても抽出できると思います。 -------------------------------------------------------------- FROM T_住所一覧 LEFT JOIN (T_グループ名 INNER JOIN T_個人名簿 ON [T_グループ名].[グループID]=[T_個人名簿].[グループID]) ON [T_住所一覧].[住所]=[T_個人名簿].[住所ID]

mk114
質問者

お礼

ありがとうございます。出来ました!でも、LEFT JOINではうまくいかず、RIGHT JOINにしてみたら出来ました。イマイチ理解できていないけれど、今回のクエリの件についてはクリアーできました。フォームに関しては、基になっているクエリの値なら表示できるので、(間違えた抽出条件を入れたらやっぱりエラーが出るが…)ひとまずOKです。 本当に何度もお世話になりありがとうございました。

  • yoisho
  • ベストアンサー率64% (331/516)
回答No.5

○クエリーの件 一つだけ確認ですが、T_個人名簿テーブルの[住所ID] と結合している T_住所一覧テーブルのフィールドは [住所] フィールド([住所ID] フィールドでなく)で間違いありませんでしょうか。 とすれば、maro200さんがおっしゃるように、SQLを見たところではクエリーに特に問題はないようですので、やはりテーブルのデータの問題でしょうか? ○データ抽出時のエラーの件 もしかしたらフォームの AllowAdditions(追加の許可)プロパティを False(いいえ)に設定されているでしょうか? もしそうですと、レコード数がゼロ(該当データが無い)の場合、フィルターをかけようとするとこんなエラーが出ると思います。(とすれば、クエリーの問題が解決しても、たとえば名前の抽出にまちがって“ん”なんて入れてしまうと、エラーが出てしまいます。) これが原因なら、最も簡単な解決方法は、(再下段に常に空の行が表示されてしまいますが)フォームの追加の許可をはいにすることです。(レコード数がゼロになっても、新規レコードに移動できる。) データの追加を禁止したければ、各テキストボックスの Enabled(使用可能)、Locked(編集ロック) プロパティで、工夫してみてください。 どうしても空の行を表示させずにエラーを回避したければ、 (1)レコード数がゼロになった場合に、分岐処理で工夫する。 レコード数のチェックは、Dcount関数(こちらの方が考え方がわかりやすい)か、Me.RecordsetClone.RecordCount(すっきりしているし処理も高速だけど、初心者には考え方が多少難しい)でできるかと思います。 (2)エラー処理で対応する。 VBAがマクロより優れていることの一つは、エラー処理が可能ということです。 On Error ステートメントの HELP がヒントです。 どちらにしてもその後の処理も工夫が必要ですので、それなりに複雑になります。なれていないとけっこう難しいかと思いますので、必要でしたら補足でコメントを要求してください。 もし原因が、上記の問題とは違うようでしたら、フォームのモジュールを示していただけませんでしょうか。 ○追伸 追加アドバイスが必要な場合、月曜以降になってしまうかもしれませんが、ご容赦ください。

mk114
質問者

補足

お世話になります。クエリの件については、maro200さんにお礼として伝えたとおりクリアーしました。データ抽出時のエラーの件については、未だ解決とは行っていません。アドバイスいただいた、フォームの追加許可は「はい」になっていますが、間違った条件を入れてしまえばエラーが出ます。 抽出条件にはコンボボックスを使って、T_グループ名の値を表示選択できるようにしています。フォームのデータは、困っていたクエリですが、クエリに抽出できていないグループ名を入れるとエラーになります。わかりにくいですが、これってクリアーする方法あるのでしょうか?ありましたらご指導お願いします。

  • maro200
  • ベストアンサー率45% (15/33)
回答No.4

>住所フィールドに、コンボボックスに無いデータ(例えば勤務先)などを入力している人が選択クエリから漏れていたみたいです。 LEFT JOINを使って全員抽出できればよいのでしょうか? よく状況がわからないので回答になってないですね。 すいません。。。

mk114
質問者

補足

お世話になります。LEFT JOINがよく解らなかったので、ヘルプで見てみたのですが、操作の使用例に「この例では、所属する社員がいない部署も含めたすべての部署を選択します。」とあったので、これが出来ればきっとできるんじゃないかと思いつつ、恥ずかしながら、やり方がはっきり解らないんです。T_住所一覧に今回漏れている勤務先や住所を含めてしまえばいいのかなぁとも思ったのですが、今後のことを考えて方法を勉強したいので、もう少しおつきあいいただいてご指導お願いできたらと思います。 選択クエリで、個人名簿の代表者チェックボックスがonになっている人を、住所フィールドの値に関係なく抽出できるように出来るのでしょうか?

  • maro200
  • ベストアンサー率45% (15/33)
回答No.3

maro200です。 SQL文を見ただけでは問題なさそうな気がします。 >イベントのタイミングが悪いだけかもしれません。 例えば、フォームのイベント"開くとき"で ”使用可能”=いいえになっているテキストボックスに フォーカスを移動させたり、textに値を入れたりすると 「実行時エラー'2185':コントロールがフォーカスを取得していない時に、コントロールのプロパティまたはメソッドを参照することはできません。」 のエラーがでます。 なので、データ抽出している方法が悪いのかもしれません。 使用不可になっている項目を参照しようとしていたりするのかも?

mk114
質問者

補足

お世話になります。今、テーブルのデータをもう一度見直していたのですが、T_個人名簿の住所フィールドは、T_住所一覧をルックアップウィザードで使っているのですが、住所フィールドに、コンボボックスに無いデータ(例えば勤務先)などを入力している人が選択クエリから漏れていたみたいです。これだけが原因かどうかは私にはわかりませんが、もしかしてこれが原因なのでしょうか?とりあえずこの状況を回避するにはどのようにすればいいですか? ご指導お願いします。

  • yoisho
  • ベストアンサー率64% (331/516)
回答No.2

エラーメッセージから察すると、フォーカスを持っていないテキストボックスの Textプロパティを取得しようとしているためかと思います。 前回のご質問(http://www.okweb.ne.jp/kotaeru.php3?q=203113)でお示ししたプロシージャで、もし、変更時イベントに該当する(つまり、抽出条件を入力中の)フィールド以外のフィールドに「.Text」が付いていたら、これを消してください。 (たとえば) Private Sub 住所抽出_Change() Me.Filter = "Kana Like '" & Me!かな抽出.Text & "*' and Juusho Like '*" & Me!住所抽出.Text & "*'" となってしまっていたら、この 「Me!かな抽出.Text」 の部分を 「Me!かな抽出」 と修正する。 (「.Text」が付くのは、変更中のテキストボックスだけです。詳しくは、Textプロパティを HELP で確認してください。) もし違う問題のようでしたら、補足要求願います。 クエリーについては、ご質問の内容だけではなんとも申し上げられませんので、もしさしつかえがなければ、SQL文(クエリーの SQLビューを貼り付けてもらうのが一番簡単)を示していただけるとわかりやすいのですが・・・。

mk114
質問者

補足

たびたびお世話になります。エラーメッセージの件ですが、変更時イベントは間違ってないみたいなのですが。クエリで抽出できてるものについては問題なく抽出できますから、クエリの時点での問題でしょうか?クエリのSQLビューを貼り付けますので、ご指導お願いします。 SELECT [T_グループ名].[グループID], [T_グループ名].[グループ名], [T_グループ名].[活動内容], [T_グループ名].[保険], [T_グループ名].[印刷], [T_個人名簿].[個人ID], [T_個人名簿].[氏名], [T_個人名簿].[フリガナ], [T_個人名簿].[出欠], [T_個人名簿].[代表者], [T_個人名簿].[活動保険], [T_住所一覧].[郵便番号], [T_個人名簿].[住所ID], [T_個人名簿].[番地], [T_個人名簿].[電話番号] FROM T_住所一覧 INNER JOIN (T_グループ名 INNER JOIN T_個人名簿 ON [T_グループ名].[グループID]=[T_個人名簿].[グループID]) ON [T_住所一覧].[住所]=[T_個人名簿].[住所ID] WHERE ((([T_個人名簿].[代表者])=True)) ORDER BY [T_グループ名].[グループID]; 本当にお手数をおかけしますが、よろしくお願いします。

  • maro200
  • ベストアンサー率45% (15/33)
回答No.1

こんにちは。 よくわからないのですが、それはデータベースのエラー じゃないようなきがするのですが、 >「実行時エラー'2185':コントロールがフォーカスを取得していない時に、コントロールのプロパティまたはメソッドを参照することはできません。」 というのは、フォームがアクティブになっていないのに フォーム上のコントロールにフォーカスを移動させたりすると よく出るエラーです。 イベントのタイミングが悪いだけかもしれません。

mk114
質問者

補足

せっかくアドバイスいただいたのに、本当に超ビギナーで申し訳ないのですが、 >イベントのタイミングが悪いだけかもしれません。 つまり、どういう事でしょうか???コンピュータが付いて行っていないと言うことですか? それと、クエリで上手く抽出できないのはなぜなのでしょうか?さっぱりわかりません。。。どなたか助けてください。

関連するQ&A

  • access2000のレポートについて。

    お世話になります。前に質問した件がまだ解決していないのに、また質問してすみません。 質問NO.217579の時のデータベースなのですが、T_グループ名の印刷フィールドのチェックボックスがonになっているものを選択クエリで作っています。そこにはT_個人名簿のグループIDが同じレコードも抽出されます。 このクエリをもとにレポートを作っているのですが、レポートの詳細にはクエリで表示された目的のグループIDに該当するすべてのデータが表示できました。でも、T_個人名簿の代表者フィールドのチェックボックスがonになっている人を、レポートのグループIDヘッダーにも表示させたいのです。 フィールドリストにない値って表示できないのでしょうか?どなたかご指導お願いします。

  • Accessデータ並べ替えをハイブリッドにしたい

    [使用しているツール] Access 2007 PROFFESSONAL [やっていること(現状)] 1つのテーブルで複数のクエリ(複数のフィールドの並べ替えが必要な為)と複数(クエリと同数)のフォームを作成して、フォームの数だけコマンドボタンを作成してフォームを一覧表示で開いています。 [やりたいこと] 1つのテーブルで「1つのクエリ」による複数のフィールド(名)を切替えて、「1つのフォーム」で表示(一覧)させたいと思っています。 例えば、テーブル名:顧客名簿(取引先、県名、商品名、入庫日)、クエリ名:顧客名簿クエリ、フォーム名:顧客名簿一覧としたとき、(取引先、県名、商品名、入庫日)をコンボボックス等で切り替えることで、指定したフィールド(名)で並び替えられたデータを「フォーム名:顧客名簿一覧」に表示させられないでしょう。 [考えたこと] コンボボックス(名前:コンボ1)を作成し値集合ソースに「”取引先”;”県名”・・・・。」と入力、クエリ「顧客名簿クエリ」の抽出条件欄にビルダを起動させて「・・・コンボ1」を指定、フォーム「顧客名簿一覧」のレコードソースにクエリ「顧客名簿クエリ」を選択しました。しかし、フォーム「顧客名簿一覧」を開いても、データは抽出できずデータなしの表示で先へ進めていません。 以上ですが、宜しくお願いします。

  • ACCESSで抽出したデータだけ印刷がしたいです

    アクセスでフォームを作りました。何人かの質問と同じなのですが、参考にしてみましたがやはり抽出したデータだけが印刷できずに困っています。抽出条件のフィールドの抽出条件に=[Forms]![メインフォーム名]![抽出条件のコントロール名]という他の方のアドバイスを参考にしてみましたがメインフォームが開けなくなってしまいました。アクセス初心者ですが何かアドバイス教えて下さい。お願いします。かなり切実です。

  • アクセスでクエリーによる抽出方法

    アクセスの超初心者です。 クエリーのデータをフォームのコンボボックス等のデータを選ぶことにより抽出したいのです。クエリーの抽出条件にフォームのコンボボックスを割り当てて抽出することはできるのですが、例えばクエリーデータは下記のようになっています。  A  B  石川  100 東京  200   沖縄  150 フォームのコンボボックスで石川を選べば  "石川" "100"と表示できますが、コンボボックスに”すべて”という項目をつけてその”すべて”をクリックするとクエリーが全表示になるようにしたいのです。(そのクエリーにはすべてという項目はない) 長くなりましたがおわかりいただけたでしょうか。よろしくお願いします。 また、クエリーを使わず別の抽出方法がありましたら教えてください。というのもいろいろな抽出条件をするのにそのつどクエリーを作らなければならないからです。よろしくお願いします。

  • ACCESSのクエリの抽出

    ACCESS2003を使っています。フォームのコンボボックスに入っているデータを見てクエリで抽出したいと思っています。 フォームのコンボボックスにデータが入っているときは、そのデータで抽出を行い、nullのときは抽出をやめてすべてのデータを表示させたいです。 抽出項目には、null値はありません。 クエリの抽出欄に下記の式を入れましたがうまくいきません。 IIf(IsNull([Forms]![フォーム名]![コンボボックス名])=true , Is Not Null , [Forms]![フォーム名]![コンボボックス名]) コンボボックスにデータが入っている場合は、抽出はうまくいくのですが、nullのときは、何も表示されません。 どこか式が違っているのでしょうか? よろしくお願いします。

  • AccessクエリでYes/No型データの抽出

    AccessクエリでYes/No型データの抽出条件について教えてください。 フォーム上のオプショングループにオプションボタン 1:Yes 2:No 3:両方 の3つを作成し、選択したオプション値によって抽出条件を変えたいのですが、 Choose([Forms]![オプショングループ名],-1,0,-1 Or 0)とすると3:両方を選択した際に、Yesのデータしか抽出できませんでした。 ただ、-1 Or 0 を -1 Or 1 としたら、両方抽出されました。 処理的には解決できたのでOKなのですが、理由がわからずちょっと気持ち悪いので。。。 よろしくお願いいたします。

  • accessで空白の時の抽出

    access2000を使っています。まだ初心者なので難しい事はできないのですが、クエリを使って絞り込み検索のフォームを作っています。 テーブル内のデータで空白のデータがあります。その際にクエリの抽出条件にlike iif(is null([forms]![formA]![テキスト100]),"*","*"&[forms]![formA]![テキスト100]&"*")としています。フォームのテキストが空白のときは全て抽出するという条件を満たす予定で設定したのですが、テーブル内のデータが空白の物が抽出できません。データが空白がない様にすればいいのでしょうが、クエリの条件で設定できないものでしょうか?データはテキスト型です。

  • Access2003でコンボボックスからデータを抽出したい

    自己啓発でAccess2003を勉強しています。 Access2003でコンボボックスで名前を選択して、データ(住所)を抽出したものをリストボックスに表示させたいのですがどこがまちがっているかわかりません。こんなことで3週間ぐらい悩んでいます。 回答またはアドバイスをお願いします。 もしくはもっと簡単なやりかたがあればお願いします。 (1)「氏名」、「住所」のテーブルを作成。テーブル名は「01データ」 (2)「氏名」、「住所」のクエリを作成。クエリ名は「クエリ1」 (3)フォームでコンボボックスとリストを作成。フォーム名は「印刷」 ⇒コンボボックスの名前は「検索」。 ⇒値集合ソースはSELECT [01データ].ID, [01データ].氏名 FROM 01データ; これで「氏名」が選択できた。 (4)クエリの「氏名」抽出条件にLike [forms]![印刷]![検索] (5)検索するマクロを作成。マクロ名「M検索」 アクションは 全レコードの表示 フィルタの実行 ⇒Where条件は[Forms]![印刷]![検索]=[クエリ1]![氏名] (6)マクロ「M検索」をコンボボックスのプロパティ「イベント」タブから変更時に設定する。 (7)フォーム「印刷」を開き、コンボボックスで氏名を選択すると『クエリ1!氏名』と表示されてしまいます。 (8)フォーム「印刷」のリストボックスは全レコードが表示されている。

  • アクセスでデーター抽出方法を教えて

    アクセスで、クエリー&サブフォームを使わず、テーブルのデータをフォーム上で抽出したいです。教えて下さい。(例)テーブル1:商品名A 商品番号2・・・・・、フォーム上で商品番号2と入力したら商品名Aだけを表示したい。

  • アクセス2000でデータ抽出できない

    アクセス2000でデータ抽出できない サブフォーム上でコンボリストを使用して入力し、その条件にあったものだけを別のコンボボックスに表示したい。 フォーム:[取引名][種別][資材名] ※全てコンボリスト 取引先を選択し、種別を選択し、その2つの条件を満たすものだけテーブルから抽出し、資材名のリストに表示したいのですが、どうしたらできるかわかりません。