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

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

A 回答 (10件)

フォームの追加許可が 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 プロパティを参照しているので、フォーカスが戻っていないとエラーが出てしまうので)

また外してましたら、すみませんけど補足でご連絡ください。

この回答への補足

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

補足日時:2002/02/20 08:59
    • good
    • 0

一つ忘れてました。



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

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

お礼日時:2002/02/20 15:18

またまたお役に立てず、すみません。



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

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

お礼日時:2002/02/20 15:00

外しまくって、すみません。


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

この回答への補足

度々お世話になります。間違った抽出条件を入れた時、フォームヘッダー以外、詳細の欄内は何も表示されなくなります。次の抽出条件を入れようと思い、間違った抽出条件を消そうとすると、エラーが出ます。エラーの出るプロシージャは下のとおりです。

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

活動内容抽出も、同じようにエラーが出ます。本当に度々お手数をおかけして申し訳ございませんがご指導よろしくお願いします。

補足日時:2002/02/19 08:53
    • good
    • 0

こんにちは。



>選択クエリで、個人名簿の代表者チェックボックスがonになっている人を、
>住所フィールドの値に関係なく抽出できるように出来るのでしょうか?

その通りです。
LEFT JOINにしたら [T_個人名簿].[住所ID] の中に[T_住所一覧].[住所]
と一致するデータがなくても抽出できると思います。

--------------------------------------------------------------
FROM T_住所一覧 LEFT JOIN
(T_グループ名 INNER JOIN T_個人名簿
ON [T_グループ名].[グループID]=[T_個人名簿].[グループID])
ON [T_住所一覧].[住所]=[T_個人名簿].[住所ID]
    • good
    • 0
この回答へのお礼

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

お礼日時:2002/02/18 11:27

○クエリーの件


一つだけ確認ですが、T_個人名簿テーブルの[住所ID] と結合している T_住所一覧テーブルのフィールドは [住所] フィールド([住所ID] フィールドでなく)で間違いありませんでしょうか。
とすれば、maro200さんがおっしゃるように、SQLを見たところではクエリーに特に問題はないようですので、やはりテーブルのデータの問題でしょうか?

○データ抽出時のエラーの件
もしかしたらフォームの AllowAdditions(追加の許可)プロパティを False(いいえ)に設定されているでしょうか?
もしそうですと、レコード数がゼロ(該当データが無い)の場合、フィルターをかけようとするとこんなエラーが出ると思います。(とすれば、クエリーの問題が解決しても、たとえば名前の抽出にまちがって“ん”なんて入れてしまうと、エラーが出てしまいます。)

これが原因なら、最も簡単な解決方法は、(再下段に常に空の行が表示されてしまいますが)フォームの追加の許可をはいにすることです。(レコード数がゼロになっても、新規レコードに移動できる。)
データの追加を禁止したければ、各テキストボックスの Enabled(使用可能)、Locked(編集ロック) プロパティで、工夫してみてください。

どうしても空の行を表示させずにエラーを回避したければ、
(1)レコード数がゼロになった場合に、分岐処理で工夫する。
レコード数のチェックは、Dcount関数(こちらの方が考え方がわかりやすい)か、Me.RecordsetClone.RecordCount(すっきりしているし処理も高速だけど、初心者には考え方が多少難しい)でできるかと思います。
(2)エラー処理で対応する。
VBAがマクロより優れていることの一つは、エラー処理が可能ということです。
On Error ステートメントの HELP がヒントです。

どちらにしてもその後の処理も工夫が必要ですので、それなりに複雑になります。なれていないとけっこう難しいかと思いますので、必要でしたら補足でコメントを要求してください。

もし原因が、上記の問題とは違うようでしたら、フォームのモジュールを示していただけませんでしょうか。

○追伸
追加アドバイスが必要な場合、月曜以降になってしまうかもしれませんが、ご容赦ください。

この回答への補足

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

補足日時:2002/02/18 12:04
    • good
    • 0

>住所フィールドに、コンボボックスに無いデータ(例えば勤務先)などを入力している人が選択クエリから漏れていたみたいです。



LEFT JOINを使って全員抽出できればよいのでしょうか?
よく状況がわからないので回答になってないですね。
すいません。。。

この回答への補足

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

補足日時:2002/02/15 09:27
    • good
    • 0

maro200です。


SQL文を見ただけでは問題なさそうな気がします。

>イベントのタイミングが悪いだけかもしれません。

例えば、フォームのイベント"開くとき"で
”使用可能”=いいえになっているテキストボックスに
フォーカスを移動させたり、textに値を入れたりすると
「実行時エラー'2185':コントロールがフォーカスを取得していない時に、コントロールのプロパティまたはメソッドを参照することはできません。」
のエラーがでます。

なので、データ抽出している方法が悪いのかもしれません。
使用不可になっている項目を参照しようとしていたりするのかも?

この回答への補足

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

補足日時:2002/02/14 16:44
    • good
    • 0

エラーメッセージから察すると、フォーカスを持っていないテキストボックスの 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ビューを貼り付けてもらうのが一番簡単)を示していただけるとわかりやすいのですが・・・。

この回答への補足

たびたびお世話になります。エラーメッセージの件ですが、変更時イベントは間違ってないみたいなのですが。クエリで抽出できてるものについては問題なく抽出できますから、クエリの時点での問題でしょうか?クエリの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];

本当にお手数をおかけしますが、よろしくお願いします。

補足日時:2002/02/14 16:02
    • good
    • 0

こんにちは。


よくわからないのですが、それはデータベースのエラー
じゃないようなきがするのですが、

>「実行時エラー'2185':コントロールがフォーカスを取得していない時に、コントロールのプロパティまたはメソッドを参照することはできません。」

というのは、フォームがアクティブになっていないのに
フォーム上のコントロールにフォーカスを移動させたりすると
よく出るエラーです。

イベントのタイミングが悪いだけかもしれません。

この回答への補足

せっかくアドバイスいただいたのに、本当に超ビギナーで申し訳ないのですが、

>イベントのタイミングが悪いだけかもしれません。

つまり、どういう事でしょうか???コンピュータが付いて行っていないと言うことですか?
それと、クエリで上手く抽出できないのはなぜなのでしょうか?さっぱりわかりません。。。どなたか助けてください。

補足日時:2002/02/14 13:10
    • good
    • 0

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

関連するカテゴリからQ&Aを探す