• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Access2010 帳票サブフォームで)

Access2010での帳票サブフォームの制御方法について

このQ&Aのポイント
  • Access2010で帳票サブフォームを使用している際に、メインフォームとサブフォームのフォーカス位置を判断する方法について教えてください。
  • また、帳票サブフォームのレコードソースが0件の場合、フッタ内のテキストボックスのプロパティやメソッドを使用する方法についても教えてください。
  • 以上の問題を解決する方法を教えてください。

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

  • ベストアンサー
  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.3

「掲示板ユーザーかくあるべし」とのm3_makiさんの対応に敬意を表し、 『参考になった』に1票投じさせて戴きました。 さて、「1」についての【別解】になりますが、 > サブで入力している時のみ実行するようIFで分岐を入れたいの > ですができますでしょうか? とのことであれば、FormオブジェクトのActiveControlを使用するのが、 直感的な形でご希望の動作が実現できるかと思います。 ポイントは、  【サブで入力中なら、メインのActiveControlはサブフォームになる】 ということです。 なお、以下は、  ・Enterイベントを発生させるコントロールの名前は「テキスト0」  ・サブフォームコントロールの名前は「埋め込み0」  ・「テキスト0」「埋め込み0」は、ともに、それぞれのフォームに   直接埋め込まれている(タブページ内ではない) という前提でのサンプルコードとなります。 Private Sub テキスト0_Enter() On Error GoTo エラー処理   Dim Frm As Form, Ctl As Control   '「テキスト0」を設置したフォーム(=Me)の親フォーム(=Parent)を取得   Set Frm = Me.Parent   '親フォームで現在フォーカスを持っているコントロール(=ActiveControl)を取得   Set Ctl = Frm.ActiveControl   '同コントロールが「埋め込み0」なら「サブで作業中」と判断   If (Ctl.Name = "埋め込み0") Then     MsgBox "サブから"   Else     MsgBox "メインから"   End If 終了処理:   '念のため、明示的にメモリを解放   Set Ctl = Nothing   Set Frm = Nothing   Exit Sub エラー処理:   Select Case Err.Number     Case 2474  'ActiveControlが不在の場合(Open時など)       '対応不要     Case 2452  '当該フォームをデータベースウィンドウからOpen       MsgBox "メインなし"     Case Else       MsgBox Err.Number & ":" & Err.Description, vbCritical, "テキスト0 Enter"   End Select   Resume 終了処理 End Sub ・・・以上です。 「2」については、残念ながらこちらでは再現がとれなかったため、対処法は 浮かびませんでした(汗)

tetsusi
質問者

お礼

ありがとうございます 「ParentのActiveControl」とは盲点でした これでサブフォーム内でタブ開始位置0でも 自由にEnterイベント組めますね

その他の回答 (3)

  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.4

No.3です。 > これでサブフォーム内でタブ開始位置0でも > 自由にEnterイベント組めますね ・・・ひとつ重要な見落としに気づきました(汗) 前回提示のコードで、「Err.Number=2474」時の対応を コメントだけにしていましたが、これだと、フォームを開いた 直後には「Enter」の処理が実行されません。 同イベント、或いは親フォームのOpen/Loadイベントで 親フォームのVisibleプロパティをTrueにしてみたりも しましたが、それだけではActiveControlは不在の扱いと なってしまうようです。 ですので、フォームを開いた(ほぼ)直後から、「Enter」時の 処理を実行させるには、  1)親フォームのOpen/Loadのどちらかのイベントで、   同フォームのTimerIntervalに適当な値を設定  2)上記フォームのTimerイベントで、   ・TimerIntervalに「0」を設定   ・サブフォームをRequery(→Enterイベントの強制発生) という処理が追加で必要となります。 大変失礼致しました(汗) '親フォームのLoadイベント Private Sub Form_Load()   'ActiveControlの発生を待つ   Me.TimerInterval = 100 End Sub '親フォームのTimerイベント Private Sub Form_Timer()   '反復実行回避のため「0」に再設定   Me.TimerInterval = 0   'サブフォームのRequeryなどで、Enterイベントを誘発   '(Requeryでは重い場合は、「サブフォーム内の適当な   ' コントロールへのSetFocus&Enterイベント組込の   ' コントロールへのSetFocus」でもOk)   埋め込み0.Requery End Sub

  • m3_maki
  • ベストアンサー率64% (296/460)
回答No.2

1.サブフォームのフォーカスについて。 サブフォームにフォーカスが無いときには コントロールで Enterイベント 自体を発生させないようにすればよいでしょう。 問題の、サブフォーム上のコントロール名を 「商品名」 サブフォーム名を 「受注サブ」 とした場合の例で説明します。 「商品名」 の 「フォーカス取得時」 を 空欄にしておきます。 親フォームの、「受注サブ」 のイベント( 「フォーカス取得時」 「フォーカス喪失時」 の2つしかありません) で 「フォーカス取得時」 に 問題のコントロールの「フォーカス取得時プロパティ」 を 「[イベント プロシージャ]」 「フォーカス取得時」 に 問題のコントロールの「フォーカス取得時プロパティ」 を 空欄にします。 Private Sub 受注サブ_Enter() Me.受注サブ.Form.商品名.OnEnter = "[イベント プロシージャ]" End Sub Private Sub 受注サブ_Exit(Cancel As Integer) Me.受注サブ.Form.商品名.OnEnter = "" End Sub

tetsusi
質問者

お礼

ありがとうございます。 メインフォームの時点から仕込んでおく、というやり方ですね

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.1

1)フラグで制御するしかないかも 共通で参照できる変数(グローバル変数)を使って、メイン側では 変数名 = True Me.サブフォームコントロール.Form.Requery 変数名 = False としたら、サブ側では、 If 変数名 = False Then   ' 本来のやりたい処理 End If とか ※ 変数名 = True とするタイミングは、いろいろと考える必要あり。(Filter 等とか) ただ、リンク親/子フィールドが設定されていたりしたら メインのレコード移動時では、既にサブ側の表示切り換えは終わっているようなので、 変数名 = True とするタイミングは、なさそうですが・・・ なお、操作面でチョッと・・・になりますが以下では? (上記フラグ操作はいらなくなります) サブフォーム内の詳細部分にコマンドボタンを配置します。 タブストップ:はい、またタブ移動順を先頭にします。(配置場所はどこでも) このコマンドボタンの「透明」を「はい」とします。 Requery 等の後では、このコマンドボタンにフォーカスが移るので、 従来の Enter 処理には影響がないかと思います。(未検証) ただ、どこにフォーカスがあるかわからなくなるので・・・・・ 2)エラーを無視する様に On Error Resume Next を記述してみるとか・・・・ エラーを処理したいのであれば、 そのエラー番号でレコード数が0件なら何もしない様に記述してみるとか また、レコード数が0件なら何もしない様な記述にしてみるとか なお、0件の時の動きについて、以下が参考になる時があるかも フォームでレコード件数0が表示されない http://hatenachips.blog34.fc2.com/blog-entry-173.html

tetsusi
質問者

お礼

ありがとうございます。 2)の方ですが、動作的には 「レコード0件でも動く」が理想なんです… なぜか再現しない人もいるようですし 条件による2010自体の不具合なのかなぁと思っています

関連するQ&A