Steuerelemente formatieren via VBA

  • Access

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von INOPIAE.

    Steuerelemente formatieren via VBA

    Hallo Gemeinde,

    ich glaube ich sehe den Wald vor Lauter Bäumen nicht: In meiner Hardewareverwaltung(Access-DB) möchte ich die Schriftfarbe in allen Formularen auf Grau ändern, in Abhängigkeit zum Wert im KomboFeld Regalfach.
    Steht dort Zurückgeliefert, soll der Text aller Textfelder, Komboboxen, etc. des jeweiligen Forumlares grau sein. Dazu habe ich eine Sub geschrieben, die auch wenn sie aufgerufen wird, z.B. durch Buttonklick, funktioniert.

    Wie kann ich aber nun die Public Sub, die ich testweise im Formular Artikelerfassung erstellt habe für alle Formulare zur Anwendung bringen?
    Mein erster Versuch war die Sub in ein Modul auszulagern und dann als als Formload-Ereignis aufzurufen.
    Leider gibt es dabei aber den Fehler, dass die Sub aufgerufen wird, bevor das aufgerufene Formular tatsächlich geladen wurde und die Sub findet dann natürlich das Steuerelement Regalfach noch nicht...
    Auch die Versuche "beim Anzeigen", "Bei Fokuserhalt" gehen nicht...

    Visual Basic-Quellcode

    1. Public Sub BedingteFormatierung()
    2. Dim frm As Form
    3. Dim ctl As control
    4. Dim frmCurrentForm As Form
    5. Set frm = Screen.ActiveForm
    6. Dim objFormatCondition As FormatCondition
    7. Debug.Print frm.Regalfach
    8. If frm.Regalfach = "Zurückgeliefert" Then
    9. For Each ctl In frm.Controls
    10. Select Case ctl.ControlType
    11. Case acTextBox, acComboBox
    12. frm(ctl.name).ForeColor = RGB(191, 191, 191)
    13. End Select
    14. Next ctl
    15. Else
    16. For Each ctl In frm.Controls
    17. Select Case ctl.ControlType
    18. Case acTextBox, acComboBox
    19. Text = ctl.name
    20. frm(ctl.name).ForeColor = RGB(0, 0, 0)
    21. End Select
    22. Next ctl
    23. End If
    24. End Sub
    Die Prozedur gehört auf jeden Fall in ein Modul.
    Übergib doch den Zustand beim Aufrufen der Prozedur mit und werte nicht das Formular aus:

    Visual Basic-Quellcode

    1. Public Sub BedingteFormatierung(strRegalfach as string)
    2. Dim frm As Form
    3. Dim ctl As control
    4. Dim frmCurrentForm As Form
    5. Set frm = Screen.ActiveForm
    6. Dim objFormatCondition As FormatCondition
    7. If strRegalfach = "Zurückgeliefert" Then
    8. For Each ctl In frm.Controls
    9. ...
    10. Next ctl
    11. Else
    12. For Each ctl In frm.Controls
    13. ...
    14. Next ctl
    15. End If
    16. End Sub


    Aufgerufen wird es dann mit

    Visual Basic-Quellcode

    1. Call BedingteFormatierung("Zurückgeliefert")
    NB. Es ist doch schön, wenn man lesbare Namen vergibt. Siehe auch [VB.NET] Beispiele für guten und schlechten Code (Stil).
    Hallo INOPIAE,

    vielen lieben Dank für den Denkansatz. Ich muss das Formular aber auswerten, da die Formatierung ja in Abhängigkeit der Textbox Regalfach stattfinden soll.
    wenn dort der "Standort" Zurückgeliefert eben dirn steht dann sollen alle Textboxen, etc. mit grauer Schriftfarbe angezeigt werden. Damit impliziere ich dem Leser und mir selbst:
    "... Ahhh der Rechner ist bereits zurück zum Hersteller..." Und da beginnt ja das Problem. Das Modul wird geladen noch bevor das Formular angezeigt wird und somit
    gibt es das auszuwertende Steuerelement noch nicht. Ich versuche es mal mit der Auswertung des Tabellenfeldes...
    hallole

    das wäre die Routine von Formload:

    Visual Basic-Quellcode

    1. Private Sub Form_Load()
    2. Dim db As DAO.Database
    3. Dim rs As DAO.Recordset
    4. Dim sn, strRegalfach, strSQL As String
    5. sn = Me.Seriennummer
    6. Debug.Print sn
    7. Set db = CurrentDb
    8. Set rs = db.OpenRecordset("Artikel", dbOpenDynaset)
    9. rs.FindFirst "Standort='" & sn & "'"
    10. strRegalfach = rs!Standort
    11. Debug.Print strRegalfach
    12. rs.Close
    13. Set rs = Nothing
    14. Set db = Nothing
    15. Call BedingteFormatierung((strRegalfach))
    16. End Sub


    ich glaube aber das die findFirst-Methode nicht richtig ist, da er beim Load immer den Zustand des ersten Artikel hernimmt, anstatt den der übergebenen Seriennummer...
    Hallo an Alle nochmal,

    ich drehe total durch. Egal welche Art und Weise ich versuche ich bekomme es einfach nicht hin, den Wert des Feldes Standort aus der Tabelle Artikel in Bezug auf die Seriennummer auszulesen.
    Könnte mir bitte jemand ein CodeBeispiel posten wie ich per SQL den Wert des Feldes Standort in der Tabelle Artikel auslese aus der Zeile die per Seriennummer definiert ist.
    Die S/N ist Text, der Wert im Feld Standort ist auch Text.

    Visual Basic-Quellcode

    1. strSQL = "SELECT Standort FROM Artikel WHERE Seriennummer = " & sn
    Guten Morgen, Es handelt sich um die Tabelle Artikel.

    Die Artikelnr ist der Primärschlüssel. Dann gibt es eben die Felder Lieferscheinnr, Kategorie, Lieferdatum, Seriennummer und u.a. auch das Feld Standort. In den meisten Fällen sind die Felder als kurzer oder Langer Text formatiert.
    Ausser Datumfelder oder dergleichen...

    Was ich nicht verstehe ist, dass ich ein Programm mit Autoit geschrieben habe mit dem ich Buchungen von HW.- Ein- und Ausgaben, so zu sagen vollautomatisch in die Access DB auslese und schreibe und mit VBA
    will es einfach nicht funktionieren einfach nur ein Feld auszulesen...
    Was willst Du denn genau aus der Tabelle Artikel auslesen?

    Visual Basic-Quellcode

    1. strSQL = "SELECT Standort FROM Artikel WHERE Seriennummer = " & sn


    Gibt Dir unter der Voraussetzung, dass die SN nur einmal vorkommt, den Standort des Artikels zurück.

    In Deinem Form_Load sollt es dann so aussehen:

    Visual Basic-Quellcode

    1. Set db = CurrentDb
    2. strSQL = "SELECT Standort FROM Artikel WHERE Seriennummer = " & sn
    3. Set rs = db.OpenRecordset(strSQL, dbOpenDynaset)
    4. rs.MoveFirst
    5. strRegalfach = rs!Standort
    6. Debug.Print strRegalfach
    7. rs.Close
    8. Set rs = Nothing
    9. Set db = Nothing
    NB. Es ist doch schön, wenn man lesbare Namen vergibt. Siehe auch [VB.NET] Beispiele für guten und schlechten Code (Stil).
    Hallole INOPIAE,

    so sieht mein Formload jetzt aus:

    Visual Basic-Quellcode

    1. Private Sub Form_Load()
    2. Dim db As DAO.Database
    3. Dim rs As DAO.Recordset
    4. Dim sn, strRegalfach, strSQL As String
    5. sn = Me.Seriennummer
    6. Debug.Print sn & " From Load"
    7. Set db = CurrentDb
    8. strSQL = "SELECT Standort FROM Artikel WHERE Seriennummer = " & "'" & sn & "'"
    9. Set rs = db.OpenRecordset(strSQL, dbOpenDynaset)
    10. rs.MoveFirst
    11. strRegalfach = rs!Standort
    12. Debug.Print strRegalfach
    13. rs.Close
    14. Set rs = Nothing
    15. Set db = Nothing
    16. Call BedingteFormatierung((strRegalfach))
    17. End Sub


    So wie es jetzt aussieht wird der richtige Standort der per Seriennummer definierten Zeile ausgelesen. Keine Ahnung warum das bis jetzt nicht ums Verr... funktionieren wollte.
    Stimmt der Call eigentlich so? denn die Sub(im Modul) wird zwar aufgerufen, aber nicht ausgeführt. Will sagen die Schrift wird nicht grau....

    Visual Basic-Quellcode

    1. Public Sub BedingteFormatierung(strRegalfach As String)
    2. Dim frm As Form
    3. Dim ctl As control
    4. Dim frmCurrentForm As Form
    5. Set frm = Screen.ActiveForm
    6. Dim objFormatCondition As FormatCondition
    7. If strRegalfach = "Zurückgeliefert" Then
    8. Debug.Print strRegalfach & " if"
    9. For Each ctl In frm.Controls
    10. Select Case ctl.ControlType
    11. Case acTextBox, acComboBox
    12. frm(ctl.name).ForeColor = RGB(191, 191, 191)
    13. End Select
    14. Next ctl
    15. Else
    16. Debug.Print strRegalfach & " else"
    17. For Each ctl In frm.Controls
    18. Select Case ctl.ControlType
    19. Case acTextBox, acComboBox
    20. Text = ctl.name
    21. frm(ctl.name).ForeColor = RGB(0, 0, 0)
    22. End Select
    23. Next ctl
    24. End If
    25. End Sub


    Durch die beiden Debug.Print-Zeilen sieht man zwar, dass er beim Laden des Formulars in die If-Befehlsfolge nach dem Then geht
    aber die Schrift in den Textboxen und in den Comboboxen bleibt schwarz.
    Hast Du schon mal einen Haltepunkt auf Zeile 10 von BedingteFormatierung gesetzt und danach Schrittweise den Code angeschaut?

    Diesen Code solltest Du auf jeden Fall anpassen:

    Visual Basic-Quellcode

    1. Call BedingteFormatierung((strRegalfach))


    Endweder

    Visual Basic-Quellcode

    1. Call BedingteFormatierung(strRegalfach)

    oder

    Visual Basic-Quellcode

    1. BedingteFormatierung strRegalfach


    Mache mal aus

    Visual Basic-Quellcode

    1. frm(ctl.name).ForeColor = RGB(191, 191, 191)

    dies

    Visual Basic-Quellcode

    1. ctl.ForeColor = RGB(191, 191, 191)
    NB. Es ist doch schön, wenn man lesbare Namen vergibt. Siehe auch [VB.NET] Beispiele für guten und schlechten Code (Stil).

    hipfzwirgel schrieb:

    Dim sn, strRegalfach, strSQL As String

    Dir ist bewusst, das Du in der obigen Zeile nur strSQL als String definierst. Der Rest ist vom Typ Variant.
    In VBA muss jede Variable einzeln dimensioniert werden.
    NB. Es ist doch schön, wenn man lesbare Namen vergibt. Siehe auch [VB.NET] Beispiele für guten und schlechten Code (Stil).