2016-04-13 2 views
0

Meine Frage bezieht sich auf folgende Tabellen und Form. image3 und image4 sind die gleiche Form, die Daten aus Table_2 (image2) lädt. Mit Table_Setting (image1) wird definiert, welche Attributspalte im SubForm von MainForm (image3 und image4) sichtbar sein soll. Das heißt, ob die Spalten im Unterformular sichtbar sind, wird vom Benutzer in Table_Setting (image1) definiert. Laut Table_Setting sollte SubForm beispielsweise Author, Publisher, BookName anzeigen, wenn der BookType in MainForm "neu" ist. Wenn der BookType "Lehrbuch" ist, zeigen Sie nur Publisher, PublishYear an.
Zugriff VBA-Set Form Spalte Sichtbarkeit von anderen Tabelle ohne hart Codierung

image1:
enter image description here

image2:
enter image description here

image3:
enter image description here

image4:
enter image description here

Ich weiß, dass die folgenden Codes können festlegen, ob die Spalte in der SubForm sichtbar ist oder nicht. Aber das ist eine harte Codeversion. Es ist nicht flexibel genug, wenn der Benutzer die Table_Setting-Tabelle aktualisiert.

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 

Meine Frage:
Mein quesiton ist: ist es möglich, einige Codes zu schreiben, um automatisch die Spalte Sichtbarkeit einfach nach dem Table_Setting Tisch, während keine Notwendigkeit, harten Code für jede Spalte in SubForm eingestellt? So kann der Benutzer einfach die anzuzeigenden Spalten ändern, indem er nur die Table_Setting-Tabelle udiert. Danke vielmals.

Update1:
Ich betreibe die folgenden Codes in 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 



Update2:
Ich betreibe die folgenden Codes in SubForm.

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 

Antwort

1

sollten Sie versuchen, den folgenden Ansatz

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 

Die Idee ist, die Attribute abzurufen, auf sie zu Schleife und sichtbar oder nicht die Steuerelemente auf dem Formular festlegen den Namen des Attribut verwenden Me.Controls(attribute).ColumnHidden


Edit:

Auf den ersten Blick habe ich nicht bemerkt, dass Sie versuchen, Spalten in einem Datenblatt zu verstecken. Sie können die Visible Eigenschaft dafür nicht verwenden, Sie müssen 10 verwenden.Ich habe meinen Code entsprechend angepasst

+0

vielen Dank für die Bereitstellung der inspirierenden Idee. Ich versuchte Ihren Ansatz und die Codes in MainFom und SubForm, aber SubForm lädt immer noch alle Spalte (ohne Fehlermeldung), habe ich die Codes in der Unterseite meiner Frage, udpate1 und update2, appreate, wenn Sie oder jemand zur Verfügung stellen können Hinweise. Danke noch einmal. – Will

+0

es funktioniert !! Die Codes sind wirklich erstaunlich !! Danke vielmals! – Will

Verwandte Themen