Access (VBA)

Access VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Home : Access 2016)
タブコントロールの中のサブフォームに応じてタブを非表示化したい
投稿日時: 20/12/08 22:05:40
投稿者: oner

現在SQL ServerとACCESS2016を使ってあるツールを作成しています。
そこでとある問題にぶつかりましたので皆さんのお知恵をお借りしたく。
 
フォームにタブコントロールを設置
タブコントロール内にはサブフォームを設置
 
タブ0にはSql Serverから取得した一覧(台帳)を表示
その他のタブにはタブ0で選択された際にパススルークエリを実行し取得件数を取得
件数0件のタブは非表示にしたい。
 
メインフォーム:Main
 TAB1.0
  サブフォーム1:Sub
   レコード移動時、TAB1.1に表示する為のパススルークエリ生成
   抽出件数が0件の場合TAB1.Pages(1).Visible = False にしたい
 TAB1.1
  サブフォーム1で選択されたKEYよりTableから取得されたレコード表示しているサブフォーム
 
 
TAB1.Pages(1).Visibleの指定方法が悪いだけだと思うのですが
お知恵をお貸しください

回答
投稿日時: 20/12/09 09:37:03
投稿者: Suzu

引用:
タブ0にはSql Serverから取得した一覧(台帳)を表示
その他のタブにはタブ0で選択された際にパススルークエリを実行し取得件数を取得
件数0件のタブは非表示にしたい。
 
メインフォーム:Main
 TAB1.0
  サブフォーム1:Sub
   レコード移動時、TAB1.1に表示する為のパススルークエリ生成
   抽出件数が0件の場合TAB1.Pages(1).Visible = False にしたい
 TAB1.1
  サブフォーム1で選択されたKEYよりTableから取得されたレコード表示しているサブフォーム
 
 
TAB1.Pages(1).Visible

 
説明に際し、名称の整合性が取れておらず判り辛いです。
 
メインフォーム に
 『タブコントロール』 【TAB1】 があり
  『ページコントロール』 【ページ1】 (ページインデックス 0)には、
    『サブフォームコントロール』 【サブフォーム1】がある
     (これは、ページコントロール埋め込みであり、ページを変えれば表示されない
     ※ サブフォームコントロールを メインフォーム内に配置し、
      その後タブコントロール内に移動すれば、タブコントロールのページを変更しても
      サブフォームコントロールは表示される様にできる。)
 
  『ページコントロール』 【ページ2】 (ページインデックス 1)には、
    『サブフォームコントロール』 【サブフォームX】がある
 
 
【TAB1】内の【ページ1】内に表示されるサブフォームのレコード移動時に
      【ページ2】以降のページを非表示 にしたい と言う事でしょうか?
 
ページインデックス1 である【ページ2】を非表示にしたいのであれば
提示されている様に、Me.TAB1.Pages(1).Visible =False で良いです。
 
非表示になるページがある一方、
表示をしなければならないページが出てくるのでは? その処理は入っていますよね?
 
そういう意味でないなら、
どうしたいのに、どうなっている 等、
希望と動作の違いが判るように、できるのであればコードと共にご説明ください。
 
 
 
今回の内容とは直接は関係ないですが、
タブコントロールのメンバーである ページ1 のサブフォーム1 の 内容により
 同じタブコントロール内のメンバーの表示非表示 を変える と言うのは UI的に判りづらくはありませんか?
 
 
私なら、
1. メインフォーム内に サブフォーム(またはリストボックス)を配置する様にし、
   タブコントロール内のページコレクションの Visible を制御する。
 
別案
2. メインフォーム内に サブフォーム(またはリストボックス)を配置する様にし、
  タブコントロール内に配置したページ標題を変えると共に
    そのページコントロールのサブフォームコントロールのソースオブジェクトを変更する
 
 
ただ。。タブコントロールなので、表示できるのは、1ページ だけ。
ページの 移動時 に ページ内の
    ・サブフォームコントロールのソースオブジェクトを変える
    ・サブフォームコントロールのソースオブジェクトのレコードソースを変える
   のどちらかで済むなら、
      サブフォームコントロールは各ページそれぞれ1個づつ埋め込むのではなく共通化してしまいます
       (前述の ※ の部分)

投稿日時: 20/12/09 11:18:06
投稿者: oner

説明へたくそで申し訳ありません
 
>【TAB1】内の【ページ1】内に表示されるサブフォームのレコード移動時に
>      【ページ2】以降のページを非表示 にしたい と言う事でしょうか?
 
その通りです
 
>ページインデックス1 である【ページ2】を非表示にしたいのであれば
>提示されている様に、Me.TAB1.Pages(1).Visible =False で良いです。
 
私もそう思うのですが
実行すると
指定した式で参照されている"TAB1"フィールドが見つかりません。
となります。
 
ちなみにメインフォームのオープン時に同プロパティー変更すると非表示されます
 
UI的な問題は確かにあるのですが、現在の目的では一覧を一行ずつ確認(しかも一覧はできるだけ多くのレコードを表示したい)
選択内容に応じた副データがあるかの確認が必要でして
一覧内で副データ有無のチェックを含めて一覧にできれば解消する部分もあるのすが
こちらの元データの保管方法にも問題があり一覧表示に時間ががかってしまうことがあります。
元々、一覧のデータ一行ずつ確認をしなければならないので副データがあるもののみ副データが記載されたタブを表示すれば楽になるのでは?と考えました

回答
投稿日時: 20/12/09 12:10:51
投稿者: Suzu

引用:
Me.TAB1.Pages(1).Visible =False
 実行すると
指定した式で参照されている"TAB1"フィールドが見つかりません。
となります。
 
ちなみにメインフォームのオープン時に同プロパティー変更すると非表示されます

(この様な情報がないと、回答者は推測に頼る事になるので、
 質問者/回答者 お互いに 無駄なやりとりが増えるだけです。先に出す様にしてください。)
 
 
そのコードは、どのクラスモジュールに書かれていますか?
 
「Me」は、その 「クラス」を示すオブジェクトになります。
 
【TAB1】が、メインフォームに配置してあるのであり
メインフォームのクラスモジュールから、Me.TAB1 は成り立ちます。
 
対し、
サブフォームの クラスモジュール に Me.TAB1 としても
サブフォーム に、TAB1 は存在しませんから
「コントロール(フィールド)は見つかりません」旨の表示になっているのではありませんか?
 
 
サブフォーム側から、
メインフォーム上のコントロールを参照するには
  Me.Parent.テキストボックス.Value = 2
 の様に Parent を使用します。
 
 
 
引用:
元々、一覧のデータ一行ずつ確認をしなければならないので副データがあるもののみ副データが記載されたタブを表示すれば楽になるのでは?と考えました

 
 
タブの必要性自体のご説明が無いので、良く判りませんが、
同一階層の操作に対してなら、Page 構造で良いでしょうが、
   Page0 の内容で Page1〜 が変わるのは、個人的にはしっくりきません。
 
 
データシート構造にすれば、親-子 だけでなく、親-子-孫 も行けます。
サブデータシートを追加する
https://support.microsoft.com/ja-jp/office/%E3%82%B5%E3%83%96%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B7%E3%83%BC%E3%83%88%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B-900d1d30-5ea2-4e47-80a7-ddcb87a53d14
   (その下も行けるかもしれませんが、わかりません)
 
副データが無ければ 「+」は表示されなかったんじゃないかな。。(すみません。確認していません)
 
私なら
単票フォームのヘッダーに 絞込みの為の 選択肢を選択させる コンボ/リスト/グループ 等を配置し
サブフォームコントロールのソースオブジェクトを先のデータシートとして
レコードソースをヘッダーの選択肢により絞り込む 様な構造を検討するでしょうか。
 
あるいは、全く別フォームを呼び出す形にするかですかね。

投稿日時: 20/12/09 14:12:26
投稿者: oner

解説を聞けば当たり前といえば当たり前でした。
me.Parent.tab.visible = false
でできました。
 
説明下手にお付き合い且つご教授ありがとうございました。