- ベストアンサー
Access:サブフォームのクエリ表示でフィールドを絞り込む方法
- Access2003 WinXPで、フォームにサブフォームを設定し、サブフォームのソースオブジェクトにクエリを参照するデータシート形式のフォームを配置しています。絞込み条件を選択するオプションボタンと表示するフィールドを選択するオプションボタンを配置し、コマンドボタンでクエリを書き換えています。しかし、表示しない設定のフィールドには「Name?」という値が表示されてしまいます。ダブルクリックイベントを取得するためには、サブフォームにデータシート形式のフォームをセットすることが必要です。
- Access2003 WinXPで、サブフォームを使用したデータシート形式のフォームを作成しています。絞込み条件を選択するオプションボタンと表示するフィールドを選択するオプションボタンを配置し、コマンドボタンでクエリを書き換えています。しかし、表示しない設定のフィールドには「Name?」という値が表示されてしまいます。ダブルクリックイベントを取得するためには、サブフォームにデータシート形式のフォームをセットすることが必要です。
- Access2003のWinXP環境で、サブフォームのソースオブジェクトにクエリを参照するデータシート形式のフォームを作成しています。絞込み条件を選択するオプションボタンと表示するフィールドを選択するオプションボタンを配置し、コマンドボタンでクエリを書き換えています。しかし、表示しない設定のフィールドには「Name?」という値が表示されてしまいます。ダブルクリックイベントを取得するためには、サブフォームにデータシート形式のフォームをセットする必要があります。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
> データシート形式のフォームを フォームでデータシート形式で表示する際には、テキストボックス名が項目となるようですので、 ベースのフォームを作る際にはフォームウィザードを使用し、表形式で作成すると、 テキストボックス名=フィールド名にしてくれます。 作る時には、全てのフィールドを表示するクエリから行います。 親フォームに配置したサブフォームコントロール名を「FSUB」と仮定します。 この「FSUB」に、自分(データシート形式のフォーム)が表示されているということにします。 データシート形式になると、制御はサブフォームコントロールのものとして扱います。 制御の中の ColumnHidden を使用します。 以下が処理例となります) ' 指定された名前が、レコードのフィールド名にあるか ' あれば False / なければ True Private Function SetColumnVisible(sName As String) As Boolean Dim fld As Field SetColumnVisible = True For Each fld In Me.RecordsetClone.Fields If (fld.Name = sName) Then SetColumnVisible = False Exit For End If Next End Function ' フォーム読み込み時 Private Sub Form_Load() Dim ctl As Control For Each ctl In Me.Section(acDetail).Controls Me.Parent.FSUB.Controls(ctl.Name).ColumnHidden _ = SetColumnVisible(ctl.Name) Next End Sub ※ フォームの「読み込み時」に、 詳細部分のコントロール名で、レコードのフィールド名にあるかチェックし、設定します。 Hidden と言っても、幅が0になるだけなので、 消えたと思った項目位置付近をいじると、ひょこひょこと出てきます。 ※ Me.Parent.FSUB の記述は、自分の親のサブフォームコントロール名 としていますが、 Forms("親フォーム名").FSUB でも Forms!親フォーム名.FSUB でも ※ テキストボックス名 <> コントロールソース名 なら SetColumnVisible(ctl.Name) を SetColumnVisible(ctl.ControlSource) とすれば 対応できますが、データシートに表示される項目名は、テキストボックスの名前になります。 ※ 表形式で作成したものでなければ、詳細部分にラベルが存在することがあるので、 処理対象のテキストボックスを識別するための工夫はしてみてください。 プロパティの タグ を使用するとか、、、 例えば、 連結しているテキストボックスを全部選択してから、タグ部分に REC と文字を入れて これで判別すると、 Private Sub Form_Load() Dim ctl As Control For Each ctl In Me.Controls If (ctl.Tag = "REC") Then Me.Parent.FSUB.Controls(ctl.Name).ColumnHidden _ = SetColumnVisible(ctl.Name) End If Next End Sub 判別する範囲を、フォーム全体(In Me.Controls)に広げても対応できます。 前の書き方 In Me.Section(acDetail).Controls は、詳細部分にあるものになります。 動かなかったら、ドンドン修正してください。
お礼
回答ありがとうございます! ColumnHidden で制御出来るのですねーv 頂いたコードで動かして、でもオプションボタンによっては複数のフィールド全部を一括した意味の物もあったりしましたので 自分なりにアレンジして動くようになりました! Excelへ出力もする事になり、見た目隠れてるだけでExcelに出ちゃったら困るなぁと出力してみたら、大丈夫でした。 やりたい事が実現出来ました。ありがとうございました!