Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Ein VBA Code für mehrere Umschaltflächen - Textfarbe ändern

Begonnen von mk500, Januar 09, 2017, 17:58:49

⏪ vorheriges - nächstes ⏩

mk500

Hallo liebe Access-Profis, mein erster Eintrag hier im Forum :)
Grundlagen in VBA sind vorhanden trotzdem habe ich ein Problem, welches ich nicht gelöst bekomme. Es geht um folgendes ich habe ein Formular mit 15 Umschaltflächen. Bei jeder Umschaltfläche soll sich beim Umschalten die Farbe des Textes auf Rot ändern. Jetzt wollte ich nicht für alle 15 Flächen einen VBA Code schreiben, sondern das ganze zusammenfassen und habe folgenden Code erstmal getestet und dieser funktioniert auch soweit:

Private Sub Form_Activate()
    Dim intIndex As Integer
    For intIndex = 1 To 15
        Controls("Umschaltfläche" & CStr(intIndex)).ForeColor = vbRed
    Next intIndex
End Sub

Die Beschriftung der 15 Flächen ändert sich auf Rot beim Laden des Formulars. Aber es soll ich ja bei jedem einzelnen beim Klicken/Umschalten ändern. Also habe ich eine Abfrage mit hinzu genommen und das ganze funktioniert aber nicht. Ich bekomme aber auch keine Meldung, dass der Code fehlerhaft ist:


Private Sub Form_Activate()
    Dim intIndex As Integer
    For intIndex = 1 To 15
        If Controls("Umschaltfläche" & CStr(intIndex)) = True Then
        Controls("Umschaltfläche" & CStr(intIndex)).ForeColor = vbRed
        Else
        Controls("Umschaltfläche" & CStr(intIndex)).ForeColor = vbBlack
        End If
    Next intIndex
End Sub




Habt ihr eine Idee wo der Fehler liegen könnte?
Danke im Voraus!

crystal

Hallo mk500,

willkommen in diesem schönen Forum!

Ein paar Fragen:
1. Woher stammen die Werte der UFls?
2. Der Activate-Event feuert mMn nur einmal (so wie Load), also nicht für jeden Datensatz.
3. Mit "Abfrage" meinst du vermutlich nur dein If-Then-Else im Code. Das ist etwas irreführend; besser wäre hier der Begriff "Bedingung".

Wenn du den Code in Form_Current verlagerst, könnte es klappen.

Damit eine Änderung der Farbe allerdings bei jedem Klick auf eines der 15 Felder funktioniert, musst du noch eine Funktion einbauen (On_Click), die das für jedes Steuerelement macht.
Schreibe eine Funktion, etwa so

public sub Umschalten(index as integer)
if me.controls("UF" & index) then
    me.controls("UF" & index).forecolor=vbred
else
    me.controls("UF" & index).forecolor=vbblack
endif
end sub

Anmerkungen:
der Vergleich "= true" erfolgt automatisch
die Wandlung "cstr(..." braucht man auch nicht (automatische Typwandlung erledigt Access).

Diesen Code musst du dann im On_Click-Event jeder UFl aufrufen, etwa so:
...
call Umschalten(5)
...

Wenn du statt des Index das Control selbst übergibst und die Routine in ein Modul auslagerst, wird's universeller. Sorry, wenn ich das jetzt nicht genauer ausführe, hole ich bei Bedarf nach...

lg
crystal

Wer Fehler in meinen Antworten findet, darf sie behalten, muss sie aber kommentieren. ;-)
Dies ist keineswegs arrogant gemeint, sondern soll nur unterstreichen, dass meine Antworten - natürlich - nicht immer fehlerfrei sind und sein können.
Devise: bitte immer erst selbst probieren!

Aus gesundheitlichen Gründen nur noch selten dabei...

MaggieMay

Hallo,

ich denke, der entscheidende Hinweis verbirgt sich hinter dieser "Frage":
Zitat von: crystal am Januar 09, 2017, 20:17:16
2. Der Activate-Event feuert mMn nur einmal (so wie Load), also nicht für jeden Datensatz.

Fazit:
"Activate" ist hier definitiv das falsche Ereignis, "Current" wäre da schon eher denkbar, kommt halt drauf an wie du das angelegt hast.
Freundliche Grüße
MaggieMay

Joss

Hallo mk500,

noch eine mögliche Alternative:
Erstelle eine Private Function.

Private Function Umschalten()

Dim ctl As Control

Set ctl = Screen.ActiveControl

If ctl = True Then
   ctl.ForeColor = vbRed
Else
   ctl.ForeColor = vbBlack
End If

End Function


Markiere alle 15 Umschaltflächen, und schreibe in das Ereignis "Nach Aktualisierung" (statt dem Wort "Ereignisprozedur") den Funktionsnamen =Umschalten() (mit IstGleichZeichen).

Gruß
Josef

mk500

Hey, sorry erstmal für die verspätete Antwort, hatte bisschen viel um die Ohren.

Danke für eure Antworten, besonders die Lösung von Joss gefällt mir sehr gut, weil ich somit nicht für alle Umschaltflächen ein VBA Click Event schreiben muss, sondern gleich alle mit einmal erledige. TOP!

Nun ich habe natürlich nicht ganz so viel über den Hintergrund der Umschaltflächen geschrieben und daraus ergibt sich jetzt nun noch eine andere Frage.
Die Schaltflächen sind verknüpft mit einem Ja/Nein Feld in einer Tabelle. Je nach Schaltzustand welchen der Mitarbeiter über die Schaltflächen ändert, werden in einem selbst erstellten Kalender, Zeiträume farbig markiert.

Jetzt hab ich das Problem, dass sich zwar die Schaltflächen rotfärben (Textfarbe) wenn ich darauf klicke, aber der Zustand der über nein/ja in der Tabelle gespeichert wird. Natürlich beim Laden im Formular nicht angezeigt wird. Sprich wenn er einmal ausgewählt wurde, und dann das Formular nochmals geöffnet wird. Wie kann ich das lösen?

Viele Grüße
Martin

Joss

Hallo Martin,

wie sieht denn der Code aus, mit dem du das Drücken der Umschaltfläche im Ja/Nein-Feld speicherst?
Gibt es 15 Ja/Nein-Felder in der Tabelle?
Da stellt sich die Frage nach dem Datenmodell?

Gruß
Josef

mk500

Hallo Josef,

da habe ich mich sicherlich falsch ausgedrückt. Mit speichern meine ich das es gebunden ist an die Tabelle, somit eine Änderung des Zustandes stattfindet, wenn ich auf eine Umschaltfläche drücke und somit der Wert in Tabelle "geschrieben" wird. Ja, aktuell gibt es 15 Ja/Nein-Felder in der Tabelle. Was genau meinst du mit Datenmodell?

Viele Grüße
Martin

Joss

Hallo Martin,

mit Datenmodell meine ich deinen Tabellenaufbau. Die 15 JA/Nein-Felder könnten mit Sicherheit durch den Einbau einer weiteren Tabelle ersatzlos wegfallen. Dazu müsstest du allerdings die Funktion/Dateninhalt/Sinn der Felder genau beschreiben.
Dann kann dir bestimmt jemand aus dem Forum Hinweise zu einer sinnvolleren Tabellenstruktur geben.

Gruß
Josef

Beaker s.a.

ZitatDazu müsstest du allerdings die Funktion/Dateninhalt/Sinn der Felder genau beschreiben.
Ergänzend solltest du auch ein Bild des Beziehungsfensters mit allen Tabellen
und allen Feldern (sichtbar) hochladen.
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

mk500

Hey Leute,
danke für eure Rückmeldungen. Ich bin gerade im Aufbau an einer größeren Datenbank. Die aber erst einmal aus vielen kleinen Teilen und anfangs auch aus Testaufbauten besteht. Daher gibt es bei dieser Tabelle und auch bei dem Formular mit den Umschaltflächen keine Verbindungen, Beziehungen o.ä.

Ich versuche es nochmal zu erklären, vielleicht denke ich ja auch viel zu kompliziert und sicherlich kann man es auch irgendwie einfacher machen.

Also ich habe 15 Schaltflächen auf einem Formular (eine Art Einstellungsformular für einen Kalender). Dort kann der User, durch verschiedene Schaltzustände der Schaltflächen wählen, was in seinem Kalender angezeigt werden soll bzw. farblich markiert werden soll.

Als Beispiel: Gibt es eine Umschaltfläche "Feiertage" diese markiert in seinem Kalender bei Betätigung die Feiertage des aktuellen Jahres.

Die Umschaltenflächen sind gebunden an eine Tabelle mit Ja/Nein-Feldern.
Nun soll er nicht nur durch den Graustufenwechsel der Umschaltfläche, sondern auch durch den Textfarbwechsel sehen, dass er den Button gedrückt hat.

Das beim Umschalten sich die Farbe des Textes ändert, ohne für jede einzelne Umschaltfläche ein VBA Click Event zu schreiben, habe ich ja mit dem sehr hilfreichen Kommentar von Josef umsetzten können. Nun sollen die gebunden Werte der Tabelle (ebenso mit möglich wenig VBA Aufwand für jede Umschaltfläche) aus der Tabelle auch wieder gelesen werden.

Das heißt wenn der User das nächste mal das "Einstellungsfenster öffnet" weiß er, "aha diese Sachen habe ich schon ausgewählt, diese noch nicht." Ist das wirklich so schwer zu realisieren?  ??? Die andere Sache ging ja auch leichter/vereinfachter, als ich dachte  :-\ :D

Würde mich über Antworten freuen. Sorry für teils verwirrte Schreibweise.
Viele Grüße
Martin

DF6GL

Hallo,

nachdem "Die Umschaltenflächen sind gebunden an eine Tabelle mit Ja/Nein-Feldern", kannst Du ja "Beim Laden" des Forms (evtl. "beim" Anzeigen") die Prozeduren (bzw. eine "Einstell-Prozedur"  , siehe vorangegangene Beiträge) aufrufen...

Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

Beaker s.a.

Hallo,
Zitat(evtl. "beim" Anzeigen")
Würde ich bevorzugen, da dieses Event beim Laden auch gefeuert wird.
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

mk500

... und wieder mal es kann so einfach sein *fremdschämen*  :D

hab es jetzt so gelöst:

"vorhandene" Werte aus Tabelle anzeigen beim Öffnen des Formulars

Private Sub Form_Current()
    Dim intIndex As Integer
    For intIndex = 1 To 5
        If Controls("Umschaltfläche" & intIndex) Then
        Controls("Umschaltfläche" & intIndex).ForeColor = vbRed
        Else
        Controls("Umschaltfläche" & intIndex).ForeColor = vbBlack
        End If
    Next
End Sub


Beim klicken des geöffneten Formulars auf Umschaltflächen


Private Function Umschalten()

Dim ctl As Control

Set ctl = Screen.ActiveControl

If ctl = True Then
   ctl.ForeColor = vbRed
Else
   ctl.ForeColor = vbBlack
End If

End Function


mit dem Aufruf "=Umschalten ()" in das Ereignis "Nach Aktualisierung".


Jetzt funktioniert alles so wie ich es haben wollte. Danke an alle!!
Hab noch ein zwei andere Fragen, aber nicht unbedingt zu diesem Thema.
Da mach ich lieber nen neuen Beitrag auf oder?  ??? 8)

Grüße
Martin

Beaker s.a.

ZitatDa mach ich lieber nen neuen Beitrag auf oder?
Ja bitte.
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)