電子書籍の厳選無料作品が豊富!

Access2003 WinXP です。
フォームにサブフォームを置き、サブフォームのソースオブジェクトにクエリを参照しているデータシート形式のフォームを設定しています。
フォームに絞込み条件を選択するオプションボタン、表示するフィールドを選択するオプションボタンを配置し、
サブフォームへ表示するコマンドボタンを置いています。
この設定を選択した後コマンドボタンを押すと、クエリの中身を書き換えています。
で、実行すると、表示しない設定のフィールドには「Name?」という値が入ったフィールドがしっかり表示されてしまいます。
ソースオブジェクトにクエリ自体を設定すれば回避出来ますが、表示されたデータをダブルクリックするとその1レコードを表示する画面を更に開きたいと思っていますので、サブフォームにデータシート形式のフォームをセットするのがダブルクリックイベントを取得出来て良いかと思っています。
分かりにくい説明ですみません。
何か解決法を分かる方いらっしゃいましたら、お願いします。

A 回答 (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 は、詳細部分にあるものになります。

動かなかったら、ドンドン修正してください。
    • good
    • 0
この回答へのお礼

回答ありがとうございます!
ColumnHidden で制御出来るのですねーv
頂いたコードで動かして、でもオプションボタンによっては複数のフィールド全部を一括した意味の物もあったりしましたので
自分なりにアレンジして動くようになりました!
Excelへ出力もする事になり、見た目隠れてるだけでExcelに出ちゃったら困るなぁと出力してみたら、大丈夫でした。
やりたい事が実現出来ました。ありがとうございました!

お礼日時:2009/12/04 14:09

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