私の質問は、次のテーブルとフォームに関連しています。 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セットフォームの列の可視性にアクセスする
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
おかげで多くのことを適応しました。あなたや誰かが提供できる場合、私は、私は私の質問、udpate1とアップデート2の底にコードを入れているあなたのアプローチを試してみましたが、MainFomとサブフォームの両方にコードを置くが、サブフォームはまだ(すべてのエラーメッセージなし)すべての列をロードし、appreicateヒント。再度、感謝します。 – Will
それは動作します!コードは本当に素晴らしいです!どうもありがとう! – Will