Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1480to1484
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Hat Label Text geändert?

Hat Label Text geändert?
22.03.2016 14:57:54
Pepi
Hallo zusammen
Kann ich rausfinden, ob der Text in einem Label (Beschriftungsfeld) geändert hat?
Privat

Sub Label_Change()'geht leider nicht
MsgBox "Der Text wurde geändert"
End Sub

freue mich auf einen Tipp
mfg
Pepi

18
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Hat Label Text geändert?
22.03.2016 15:02:33
selli
hallo pepi,
warum fragst du nicht die routine ab, die den text ändern könnte?
gruß
selli

AW: Hat Label Text geändert?
22.03.2016 15:10:00
Steve
Hallo Pepi,
dann würd ich gern von dir wissen, wie kann sich denn das Label ändern? Doch nur von einem Makro aus, oder?
Dann empfehle ich dir an dieser Stelle das Makro Label_Change mit Call selber aufzurufen.

Private Sub Test()
Label1.Caption = "ABC" 'Änderun des Labels im Code
Call Label1_Change     'Aufruf deines anderen Makros
End Sub

Man könnte auch zu Beginn des Makros sich den Wert von Label.Caption in einer Variablen merken und an der notwendigen Stelle mit dem aktuellen Labeltext vergleichen und dann deine Aktion durchführen.
sLabelText = Label1.Caption
'Abschnitt mit potentieller Änderung des Labeltextes
If sLabelText  Label1.Caption Then Call Label_Change
lg Steve

Anzeige
AW: Hat Label Text geändert?
22.03.2016 15:47:29
Pepi
Danke für Eures mitdenken
Ja, das Label wird über ein Makro geändert - ich versuche ein Problem über Umwege zu lösen.
Ich habe eine Listbox, die Multiselect ist. Nun will ich die Listbox einfärben, sobald keine Position markiert ist (zb rot). Ich habe rausgefunden, dass das nicht funktioniert.
Mit einer Checkbox lässt sich das aber ganz einfach machen - bereits tetestet!
Nun dachte ich, ich schreibe eine "1" in das Hilfslabel, sobald Listbox1 keine Positionen selektiert hat. Das Hilfslabel reagiert (ähnlich Private Sub Worksheet_Change(ByVal Target As Range)) und dann kann ich die Listbox1 einfärben. Deshalb brauche ich eine Möglichkeit herauszufinden, ob ein Wert in ein Label geschrieben wurde. Vermutlich geht das aber nicht - habe es soeben mit einer Checkbox getestet. Die Listbox wird nur eingefärbt, wenn ich die Checkbox per Maus anklicke. (siehe Musterdatei)
https://www.herber.de/bbs/user/104538.xlsm
Als kann mir einer sagen, wie ich eine Listbox einfärben kann, wenn keine Positionen selektiert sind?
Ich hoffe, ich habe nicht alle Klarheiten beseitigt.
mfg Pepi

Anzeige
AW: Hat Label Text geändert?
22.03.2016 15:58:13
Steve
Hallo Pepi,
ich würde das so lösen:
Private Sub lBo2_Click()
Dim lngIndex As Long
With lBo2
For lngIndex = 0 To .ListCount - 1
If .Selected(lngIndex) Then Exit For
Next
If lngIndex = .ListCount Then 'Färbe rot
lBo2.BackColor = &H8080FF
Else
lBo2.BackColor = &H8000000F
End If
End With
End Sub

Beim Anklicken wird überprüft welche Auswahl getroffen wurde. Läuft die Schleife durch ohne Treffer dann wird die Listbox rot, sonst nicht. Beim Aufruf der Userform im Activate-Event oder an der Stelle wo du deine Prüfung einbauen möchtest, kannst du das Click-Event mit Call aufrufen. Beim Öffnen der Userform sollte ja nichts selektiert sein, also wird sie automatisch rot.
lg Steve

Anzeige
AW: Hat Label Text geändert?
22.03.2016 16:23:33
Steve
Ich sehe schon,
das war leichter gesagt als getan. Abgesehen davon, dass er das Click-Event bei der MultiSelect-Eigenschaft nicht bei jedem Click ausführt, färbt er die Box trotzdem nicht wieder weiß. Die Logik stimmt zwar, entsprechende MsgBoxen in der If-Bedingung sagen mir auch die richtige Farbe an, jedoch nützt auch kein Repaint.
Ich gebe noch nicht auf,
lg Steve

vielleicht hilft ja....
22.03.2016 16:27:19
selli
hallo steve,
...ein Do.Events zwischendrin, um das ganze aufzufrischen.
(keine ahnung, ob's hilft)
gruß
selli

DoEvents - ohne punkt natürlich e.o.m.
22.03.2016 16:30:54
selli

AW: DoEvents - ohne punkt natürlich e.o.m.
23.03.2016 14:40:42
Steve
Danke Selli,
leider hilft das auch nicht. Pepi hat es probiert, ich auch.
Ich habe den Fehler weiter eingegrenzt und kann sagen, dass die LB nicht durch ihre eigenen Events gefärbt werden kann. Andere Makros habe keinerlei Hindernisse, aber rufe ich sie mit einem der Listbox-Events (Call) auf ist schon wieder Sense, da sie während des LB-Events abgearbeitet werden. Ergo braucht man einen Trigger der zwar in Reichweite der Userform liegt, aber eine ausführende Instanz der unabhängig davon ist.
Daher kam ich auf die Funktion OnTime zu nutzen, um die Farbänderung aus dem LB-Event auszulagern. Damit geht die Änderung nicht mehr von der Userform, sondern der Application aus und sollte funktionieren:
In der UserForm:
Private Sub lBo2_Change()  'aktiv bei anklicken einer Position
Application.OnTime Now + TimeValue("00:00:00"), "Modul1.UForFaerben", , True
End Sub
Private Sub UserForm_Initialize()
Application.OnTime Now + TimeValue("00:00:00"), "Modul1.UForFaerben", , True
End Sub

In ein Modul:
Sub UForFaerben()
Dim lngIndex As Long
With uFor.lBo2
For lngIndex = 0 To .ListCount - 1
If .Selected(lngIndex) Then Exit For
Next
If lngIndex = .ListCount Then 'Färbe rot
.BackColor = &H8080FF
Else
.BackColor = &H8000000F
End If
End With
End Sub
Der Aufruf im UF_Initialize- bzw. UF_Activate-Event ist ein Kann, kein Muss, wenn du zu Beginn gleich eine rote Listbox haben möchtest.
lg Steve

Anzeige
AW: DoEvents - ohne punkt natürlich e.o.m.
23.03.2016 14:42:15
Steve
Danke Selli,
leider hilft das auch nicht. Pepi hat es probiert, ich auch.
Ich habe den Fehler weiter eingegrenzt und kann sagen, dass die LB nicht durch ihre eigenen Events gefärbt werden kann. Andere Makros habe keinerlei Hindernisse, aber rufe ich sie mit einem der Listbox-Events (Call) auf ist schon wieder Sense, da sie während des LB-Events abgearbeitet werden. Ergo braucht man einen Trigger der zwar in Reichweite der Userform liegt, aber eine ausführende Instanz der unabhängig davon ist.
Daher kam ich auf die Funktion OnTime zu nutzen, um die Farbänderung aus dem LB-Event auszulagern. Damit geht die Änderung nicht mehr von der Userform, sondern der Application aus und sollte funktionieren:
In der UserForm:
Private Sub lBo2_Change()  'aktiv bei anklicken einer Position
Application.OnTime Now + TimeValue("00:00:00"), "Modul1.UForFaerben", , True
End Sub
Private Sub UserForm_Initialize()
Application.OnTime Now + TimeValue("00:00:00"), "Modul1.UForFaerben", , True
End Sub

In ein Modul:
Sub UForFaerben()
Dim lngIndex As Long
With uFor.lBo2
For lngIndex = 0 To .ListCount - 1
If .Selected(lngIndex) Then Exit For
Next
If lngIndex = .ListCount Then 'Färbe rot
.BackColor = &H8080FF
Else
.BackColor = &H8000000F
End If
End With
End Sub
Der Aufruf im UF_Initialize- bzw. UF_Activate-Event ist ein Kann, kein Muss, wenn du zu Beginn gleich eine rote Listbox haben möchtest.
lg Steve
PS.: Die TimeValue kannst du rausnehmen, ich will nur jetzt nicht nochmal im Text rumstreichen. Habe das nur so aus einer anderen Mappe übernommen.

Anzeige
AW: DoEvents - ohne punkt natürlich e.o.m.
23.03.2016 19:37:42
Pepi
Hallo lieber Steve
Ist ja toll, wie du dich ins Zeug legst, wegen meinem Anliegen. Ganz lieben Dank!!!
Ich habe Deinen Code in mein Makro eingebaut und getestet. Leider funktioniert die "OnTime" Funktion nur halb (hatte bei anderen Makros auch schon meine Mühe damit!). Ich habe die Zeit auf 1 Sec gesetzt, sonst geht es gar nicht (ich kann die Position nicht mehr an und abklicken! Aber mit einer Sek Verzögerung macht das ganze auch keinen Spass.
Ich dachte vielleicht geht es auch, wenn ich mit dem Klick eine Zahl in Zelle (Tabelle1) jeweils um 1 erhöhe und dann mit Worksheet.change() die Listbox einfärbe - doch leider geht das nicht - jedoch kann ich so Label1/2 einfärben.
siehe Anhang.
Vielleicht kommen wir doch noch weiter - wäre doch eine tolle Funktion für ListBoxes mit vielen Einträgen!
https://www.herber.de/bbs/user/104579.xlsm
mfg
Pepi
PS: vergisst vor lauter VBA die Ostern nicht - smile!

Anzeige
AW: DoEvents - ohne punkt natürlich e.o.m.
24.03.2016 10:27:48
Steve
Hallo Pepi,
das mit der Zahl wird leider nichts, da das Change-Event sofort mit dem Schreiben in die Zelle ausgelöst wird und damit noch während das ListBox-Event läuft. Damit ist es nicht unabhängig.
Das mit der Auswahl sehe ich erst jetzt. Direkt beim Färben verliert die Listbox immer ihre Auswahl, es ist zum Haare raufen. Auch mein Versuch die Selection neu zu setzen scheitert daran, dass ich für die Userform aus dem Modul heraus die Events nicht deaktiviert bekomme und damit wieder und wieder das Färben auslöse.
So schade es auch ist, wohl oder übel solltest du darauf verzichten die LB selbst zu färben und lieber ein Warn-Label anbringen und dieses färben, wie es bei LB1 getan wird. Dabei spiel es dann keine Rolle ob du den Code in ein anderes Makro oder den Code der UF steckst. Ich würde nur vermeiden wollen eine Zelle unnötig zu beschreiben, das hätte man auch mit Call erledigen können denn es tut ja nix anderes als das Sh_Change-Makro zu rufen.
Zudem aufpassen LB1 wird nach derzeitigem Code-Stand bei jedem zweiten Click umgefärbt, aber es war ja auch nur ein Test.
lg Steve

Anzeige
AW: DoEvents - ohne punkt natürlich e.o.m.
24.03.2016 13:40:08
Pepi
Hallo Mullit
Jetzt ist Ostern noch vor dem Karfreitag!
Das ist ja grossartig - es funktioniert bestens, doch verstehen tu ich da nicht mehr viel - das ist halt, wenn Profis am Werk sind.
Ganz herzlichen Dank - ich glaube, da haben ausser mir noch ein paar andere profitiert.
mfg
Pepi

Anzeige
AW: DoEvents - ohne punkt natürlich e.o.m.
26.03.2016 17:33:01
Pepi
Hallo Mullit
Ich habe die Makros noch etwas erweitert:
1. che1 selektiert je nachdem alle oder keine - leider funktioniert dies mit Deinem Code zusammen nicht richtig (siehe Anhang)
2. wenn alle oder keine selektiert sind, wird che1 auf true oder false gesetzt - funktioniert!
Frage: Beim einfärben prcSetBoxColor() schreibst du folgenden Code:
With uFor
If lobjListBox Is .lBo1 Then
If Not .prpblnBox1Init Then
Call prcSetBoxToColor(pvlngListIndex:=lngListIndex)
Else
.prpblnBox1Init = Not .prpblnBox1Init
End If
Else 'nicht .lBo1
Call prcSetBoxToColor(pvlngListIndex:=lngListIndex)
End If
End With
Frage 1: Sind lBo2, lBo3, lBo4 unter else behandelt?
Frage 2: Warum wird lBo1 anders behandelt als die weiteren lBo..? (Initianlisierung)
https://www.herber.de/bbs/user/104615.xlsm
Vielleicht schaust du nochmals rein - vielen Dank
mfg Pepi

Anzeige
AW: DoEvents - ohne punkt natürlich e.o.m.
27.03.2016 20:03:57
Mullit
Hallo,
zu 1): den Code in die aufgeführten Module:
' ********************************************************************** 
' Modul: uFor Typ: Userform 
' ********************************************************************** 

Option Explicit

' die folgenden Makros werden benötigt, um die Listbox einzufärben * 24.03.16 Mullit 
Private mblnNoChangeEvent As Boolean
Private mblnBox1Init As Boolean

Private Sub che1_Click()
Call prcSetBoxColorByChkBox(probjListBox:=lBo1, _
    probjCheckBox:=che1, pvlngBoxColor:=BOX1_COLOR)
End Sub

Private Sub che2_Click()
Call prcSetBoxColorByChkBox(probjListBox:=lBo2, _
    probjCheckBox:=che2, pvlngBoxColor:=BOX2_COLOR)
End Sub

Private Sub che3_Click()
Call prcSetBoxColorByChkBox(probjListBox:=lBo3, _
    probjCheckBox:=che3, pvlngBoxColor:=BOX3_COLOR)
End Sub

Private Sub lBo1_Change()
   If Not mblnNoChangeEvent Then Call prcStartTimer(probjListBox:=lBo1)
   Call SU_ListBox_Alle_Keine_Prüfen(probjListBox:=lBo1, _
     probjCheckBox:=che1, pvlngVon:=0)
End Sub

Private Sub lBo2_Change()
   If Not mblnNoChangeEvent Then Call prcStartTimer(probjListBox:=lBo2)
   Call SU_ListBox_Alle_Keine_Prüfen(probjListBox:=lBo2, _
     probjCheckBox:=che2, pvlngVon:=0)
End Sub

Private Sub lBo3_Change()
   If Not mblnNoChangeEvent Then Call prcStartTimer(probjListBox:=lBo3)
   Call SU_ListBox_Alle_Keine_Prüfen(probjListBox:=lBo3, _
     probjCheckBox:=che3, pvlngVon:=0)
End Sub

Private Sub UserForm_Activate()
   mblnBox1Init = True
   lBo1.BackColor = BOX1_COLOR
   lBo2.BackColor = BOX2_COLOR
   lBo3.BackColor = BOX3_COLOR
End Sub

Friend Property Let prpblnNoChangeEvent(ByVal pvblnNoChangeEvent As Boolean)
   Let mblnNoChangeEvent = pvblnNoChangeEvent
End Property

Friend Property Get prpblnBox1Init() As Boolean
   Let prpblnBox1Init = mblnBox1Init
End Property

Friend Property Let prpblnBox1Init(ByVal pvblnBox1Init As Boolean)
   Let mblnBox1Init = pvblnBox1Init
End Property

Private Sub prcSetBoxColorByChkBox(ByRef probjListBox As MSForms.ListBox, _
   ByRef probjCheckBox As MSForms.CheckBox, ByVal pvlngBoxColor As Long)
Dim lngIndex As Long
With probjListBox
    .BackColor = IIf(probjCheckBox.Value, RESET_COLOR, pvlngBoxColor)
    For lngIndex = 0 To .ListCount - 1
       .Selected(pvargIndex:=lngIndex) = probjCheckBox.Value
    Next
End With
End Sub

' ********************************************************************** 
' Modul: c_lBo_färben Typ: Standardmodul 
' ********************************************************************** 

Option Explicit
Option Private Module
'diese Makros werden benötigt, um die Listbox einzufärben - 24.03.16 Herber Mullit 

Private Declare Function SetTimer Lib "user32.dll" ( _
     ByVal hwnd As Long, _
     ByVal nIDEvent As Long, _
     ByVal uElapse As Long, _
     ByVal lpTimerFunc As Long) As Long
Private Declare Function KillTimer Lib "user32.dll" ( _
     ByVal hwnd As Long, _
     ByVal nIDEvent As Long) As Long
    
Public Const BOX1_COLOR As Long = vbGreen
Public Const BOX2_COLOR As Long = &HFF00FF     'pink vbRed 
Public Const BOX3_COLOR As Long = vbRed
Public Const RESET_COLOR As Long = vbWhite

Private lobjListBox As MSForms.ListBox

Public Sub prcStartTimer(ByRef probjListBox As MSForms.ListBox)
   Set lobjListBox = probjListBox
   Call SetTimer(Application.hwnd, 0&, 200&, AddressOf TimerProc)
End Sub

Private Sub prcStopTimer()
   Call KillTimer(Application.hwnd, 0&)
End Sub

Private Sub TimerProc(ByVal pvlngHwnd As Long, ByVal pvlngnIDEvent As Long, _
  ByVal pvlnguElapse As Long, ByVal pvlnglpTimerFunc As Long)
   Call prcStopTimer
   Call prcSetBoxColor
End Sub

Private Sub prcSetBoxColor()  'Hauptprogramm, hier müssen die einzelnen "lBo" aufgelistet sein 
Dim lngListIndex As Long, lngTopIndex As Long
With lobjListBox
    lngListIndex = .ListIndex
    lngTopIndex = .TopIndex
    If .Selected(pvargIndex:=.ListIndex) Then
      If .BackColor <> RESET_COLOR Then
         uFor.prpblnNoChangeEvent = True
         .BackColor = RESET_COLOR
         .ListIndex = lngListIndex
         .Selected(pvargIndex:=lngListIndex) = True
         .TopIndex = lngTopIndex
         uFor.prpblnNoChangeEvent = False
      End If
    Else
       With uFor
            If lobjListBox Is .lBo2 Then
               Call prcSetBoxToColor(pvlngListIndex:=lngListIndex, _
                   pvlngTopIndex:=lngTopIndex)
            ElseIf Not .prpblnBox1Init Then
               Call prcSetBoxToColor(pvlngListIndex:=lngListIndex, _
                   pvlngTopIndex:=lngTopIndex)
            Else
               .prpblnBox1Init = Not .prpblnBox1Init
            End If
       End With
    End If
End With
Set lobjListBox = Nothing
End Sub

Private Sub prcSetBoxToColor(ByVal pvlngListIndex As Long, _
   ByVal pvlngTopIndex As Long)
Dim ialngIndex As Long
With lobjListBox
    For ialngIndex = 1 To .ListCount
       If .Selected(pvargIndex:=ialngIndex - 1) Then Exit For
    Next
    If ialngIndex = .ListCount + 1 Then
       Select Case lobjListBox.Name
          Case Is = "lBo1": .BackColor = BOX1_COLOR
          Case Is = "lBo2": .BackColor = BOX2_COLOR
          Case Else: .BackColor = BOX3_COLOR
       End Select
       .ListIndex = pvlngListIndex
       .TopIndex = pvlngTopIndex
    End If
End With
End Sub

' ********************************************************************** 
' Modul: Makros Typ: Standardmodul 
' ********************************************************************** 

Option Explicit

Public Sub SU_ListBox_Alle_Keine_Prüfen(ByRef probjListBox As MSForms.ListBox, _
  ByRef probjCheckBox As MSForms.CheckBox, ByVal pvlngVon As Long)
Dim lngAnz As Long, lngIndex As Long, lngCount As Long
lngAnz = probjListBox.ListCount - 1
If lngAnz < pvlngVon Then Exit Sub
For lngIndex = pvlngVon To lngAnz
   If probjListBox.Selected(pvargIndex:=lngIndex) Then lngCount = lngCount + 1
Next

If lngCount = lngAnz + 1 Then
  probjCheckBox.Value = True
ElseIf lngCount = 0 Then
  probjCheckBox.Value = False
End If
End Sub


VBA/HTML - CodeConverter für Office-Foren
AddIn für Excel/Word 2000-2010 - komplett in VBA geschrieben von Lukas Mosimann
Projektbetreuung durch mumpel



Code erstellt und getestet in Office 14

zur Frage: hab ich befürchtet, daß Die Frage kommt, die Abfrage dient dazu, den Fall abzufangen, wenn die Listbox bei Erstauswahl keinen Wert selektiert, das kann man allerdings auch verhindern, indem man den Code nacheditiert und könnte dann u.U. auch raus...
Gruß, Mullit

AW: DoEvents - ohne punkt natürlich e.o.m.
29.03.2016 08:33:25
Pepi
Hallo Mullit
unglaublich, was du da alles herumjonglierst mit VBA - ganz herzlichen Dank, es funktioniert alles bestens, wie ich mir das vorgestellt habe.
mfg
Pepi

AW: Hat Label Text geändert?
22.03.2016 16:35:44
Pepi
Hallo Steve
Dein Makro funktioniert nur wenn die Listbox auf single-select steht - meine steht auf multi-select.
Bei multi-select geht lbo2_Click() nicht mehr, sondern nur noch lbo2_change(), doch das Einfärben geht nicht - siehe mein Makro (die Schlaufe wird zwar durchlaufen, der Command ausgeführt, doch die Farbe ändert nicht!!)
mfg
Pepi

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige