2016-04-13 3 views
0

私の質問は、次のテーブルとフォームに関連しています。 image3とimage4は同じ形式で、Table_2(image2)からデータをロードします。 Table_Setting(image1)は、MainFormのサブフォーム(image3およびimage4)に表示する属性列を定義するために使用します。つまり、サブフォームの列が表示されるかどうかは、Table_Setting(image1)のユーザーによって定義されます。たとえば、Table_Settingによると、MainFormのBookTypeが "novel"の場合、SubFormはAuthor、Publisher、BookNameを表示する必要があります。 BookTypeが「テキストブック」の場合、Publisher、PublishYearのみが表示されます。
ハードコーディングなしで他のテーブルからVBAセットフォームの列の可視性にアクセスする

画像1:
enter image description here

画像2:
enter image description here

画像3:
enter image description here

のimage4:
enter image description here

Iは、以下のコードは、サブフォームの列が可視であるか否かを設定することができる知っています。しかしこれはハードコードバージョンです。ユーザーがTable_Settingテーブルを更新する場合、十分な柔軟性がありません。

Private Sub Form_Load() 
    Select Case Forms![SubForm]!BookType 
     Case "novel" 
      Me.BookType.Visible = True 
      Me.Author.Visible = True 
      Me.Publisher.Visible = True 
      Me.BookName.Visible = True 
      Me.PublishYear.Visible = False 
     Case "research" 
      Me.BookType.Visible = True 
      Me.Author.Visible = False 
      Me.Publisher.Visible = False 
      Me.BookName.Visible = False 
      Me.PublishYear.Visible = True   
     Case "text book"  
      Me.BookType.Visible = True 
      Me.Author.Visible = Falss 
      Me.Publisher.Visible = True 
      Me.BookName.Visible = False 
      Me.PublishYear.Visible = True     
    End Select 
End Sub 

私の質問:
私のquesitonがある:それは自動的にサブフォーム内の各列のハードコードする必要はありませんしながら、単にTable_Settingテーブルに従って、列の可視性を設定するには、いくつかのコードを書くことは可能でしょうか?そのため、ユーザーはTable_Settingテーブルのみを読み出すことで、表示する列を簡単に変更できます。どうもありがとう。

アップデート1:
私はMainFormを中に以下のコードを実行します。

Private Sub Form_Load() 

    Dim RST As Recordset 
    Dim strBookType As String 
    Dim strSQL As String 

    strBookType = Me.BookType 

    ' Set visible controls 
    strSQL = "SELECT Attribute FROM Table_Setting WHERE BookType = '" & strBookType & "'" 
    Set RST = CurrentDb.OpenRecordset(strSQL) 
    If Not RST.BOF Then 
     While Not RST.EOF 
      Me!Table_2_DataSheet.Form.Controls(RST!Attribute).Visible = True 'Table_2_DataSheet is the subform name 
      RST.MoveNext 
     Wend 
    End If 
    RST.Close 

    ' Set invisible controls 
    strSQL = "SELECT DISTINCT(Attribute) FROM Table_Setting WHERE Attribute NOT IN (SELECT Attribute FROM Table_Setting WHERE BookType='" & strBookType & "')" 
    Set RST = CurrentDb.OpenRecordset(strSQL) 
    If Not RST.BOF Then 
     While Not RST.EOF 
      Me!Table_2_DataSheet.Form.Controls(RST!Attribute).Visible = False 'Table_2_DataSheet is the subform name 
      RST.MoveNext 
     Wend 
    End If 
    RST.Close 

    Set RST = Nothing 

End Sub 



アップデート2:
私はサブフォーム内の以下のコードを実行します。

Private Sub Form_Load() 

    Dim RST As Recordset 
    Dim strBookType As String 
    Dim strSQL As String 

    strBookType = Me.Parent.BookType 

    ' Set visible controls 
    strSQL = "SELECT Attribute FROM Table_Setting WHERE BookType = '" & strBookType & "'" 
    Set RST = CurrentDb.OpenRecordset(strSQL) 
    If Not RST.BOF Then 
     While Not RST.EOF 
      Me.Controls(RST!Attribute).Visible = True 
      RST.MoveNext 
     Wend 
    End If 
    RST.Close 

    ' Set invisible controls 
    strSQL = "SELECT DISTINCT(Attribute) FROM Table_Setting WHERE Attribute NOT IN (SELECT Attribute FROM Table_Setting WHERE BookType='" & strBookType & "')" 
    Set RST = CurrentDb.OpenRecordset(strSQL) 
    If Not RST.BOF Then 
     While Not RST.EOF 
      Me.Controls(RST!Attribute).Visible = False 
      RST.MoveNext 
     Wend 
    End If 
    RST.Close 

    Set RST = Nothing 

End Sub 

答えて

1

次のアプローチを試してみてください

Private Sub Form_Load() 

    Dim RST As Recordset 
    Dim strBookType As String 
    Dim strSQL as string 
    Dim ctrl As Control 

    strBookType = Forms![SubForm]!BookType 

    ' Set visible controls 
    strSQL = "SELECT Attribute FROM Table_Setting WHERE BookType='" & strBookType & "'" 
    Set RST = CurrentDb.OpenRecordset(strSQL) 
    If Not RST.BOF Then 
     While Not RST.EOF 
      Set ctrl = Me.Controls(RST!Attribute) 
      ctrl.ColumnHidden = False 
      RST.MoveNext 
     Wend 
    End If 
    RST.Close 

    ' Set invisible controls 
    strSQL = "SELECT DISTINCT(Attribute) FROM Table_Setting WHERE Attribute NOT IN (SELECT Attribute FROM Table_Setting WHERE BookType='" & strBookType & "')" 
    Set RST = CurrentDb.OpenRecordset(strSQL) 
    If Not RST.BOF Then 
     While Not RST.EOF 
      Set ctrl = Me.Controls(RST!Attribute) 
      ctrl.ColumnHidden = True 
      RST.MoveNext 
     Wend 
    End If 
    RST.Close 

    Set RST = Nothing 


End Sub 

アイデアは、それらのループに、属性を取得するために、そして使用して属性の名前を持つフォーム上に表示かどうかのコントロールを設定することですMe.Controls(attribute).ColumnHidden


編集:

一目見たところでは、データシートの列を非表示にしようとしていることに気付きませんでした。このためにVisibleプロパティを使用することはできません。ColumnHiddenを使用する必要があります。私は自分のコードに感動のアイデアを提供するために応じて

+0

おかげで多くのことを適応しました。あなたや誰かが提供できる場合、私は、私は私の質問、udpate1とアップデート2の底にコードを入れているあなたのアプローチを試してみましたが、MainFomとサブフォームの両方にコードを置くが、サブフォームはまだ(すべてのエラーメッセージなし)すべての列をロードし、appreicateヒント。再度、感謝します。 – Will

+0

それは動作します!コードは本当に素晴らしいです!どうもありがとう! – Will

関連する問題