Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema Userform
BildScreenshot zu Userform Userform-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema ListBox
BildScreenshot zu ListBox ListBox-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema TextBox
BildScreenshot zu TextBox TextBox-Seite mit Beispielarbeitsmappe aufrufen

Listboxeintrag merken


Betrifft: Listboxeintrag merken von: Jonathan
Geschrieben am: 24.01.2018 18:46:50

Hallo,

folgendes Problem:
ich nutze ein Modul, welches bei jeder Änderung (in irgend einem Feld des UserForms) neu berechnet. Es bezieht sich auf die bereits eingetragenen/gewählten Werte und erkennt den neuen Wert. Nur ein ausgewählter ListBox-Eintrag wird bei einer Wert-Änderung nicht mehr als gewählt erkannt (obwohl noch markiert).

So sieht das aktuell (auf den wesentlichen Teil reduziert) aus:


Private Sub txtbx_Change()
For A = 0 To Listbox.ListCount - 1
If Listbox.Selected(A) Then 
...
End If
Next A
End Sub

Es ist definitiv ein Wert ausgewählt, VBA erkennt das aber irgendwie nicht (oder verliert den Wert). Weiss jemand woran das liegen könnte?

  

Betrifft: AW: Listboxeintrag merken von: onur
Geschrieben am: 24.01.2018 18:51:04

Wenn die Listbox tatsächlich txtbx heisst, must du auch txtbx.listcount-1 (bzw txtbx.selected) schreiben.
Wenn nicht - welche Listbox denn ?
Listbox1 oder Listbox2 oder ...???


  

Betrifft: AW: Listboxeintrag merken von: Jonathan
Geschrieben am: 24.01.2018 19:15:11

txtbx heisst nicht die Listbox, sondern txtbx_Cange() ist ein Befehl dass bei jeder Änderung einer TextBox im UserForm etwas passieren soll (wie geschrieben, läuft in einem Modul und nicht in dem UserForm). Und das was passieren soll ist in diesem Fall, dass bei der Änderung eines Eintrages erneut gerechnet wird. Zur Rechnung wird aber auch der gewählte ListBox-Eintrag benötigt bzw. wird bei gewähltem ListBox-Eintrag halt noch etwas anderes berechnet. Und es ist eigentlich ein Eintrag gewählt, nur rechnet er nicht, er verliert die Auswahl (obwohl noch markiert).

"Listbox" war nur ein Bsp., um mein Problem möglichst einfach darzustellen, bei mir ist diese schon genauer spezifiziert.


  

Betrifft: AW: Listboxeintrag merken von: onur
Geschrieben am: 24.01.2018 21:17:30

"Listbox" war nur ein Bsp., um mein Problem möglichst einfach darzustellen, bei mir ist diese schon genauer spezifiziert - Dann erwarte auch keine spezifische lösung!
Eine textbox_event-code (wenn die textbox auf einer UF ist) muss im Code der Userform stehen und nicht in irgend einem modul, du kannst nicht einfach ein Change-Event in ein Modul setzen (außer ein Klasenmodul, aber den code hast bestimmt nicht du geschrieben).
Ohne den genauen code oder die datei - erwarte keine Lösung!


  

Betrifft: AW: Listboxeintrag merken von: Jonathan
Geschrieben am: 25.01.2018 08:26:34

natürlich habe ich den Code selbst geschrieben. Doch, ich kann ein Change-Event in ein Modul schreiben, ich muss die einzelnen Felder der UserForm nur konkret ansprechen

Also gut, hier der gesamte Code (ich wollte es ursprünglich nur möglichst einfach halten, um auf mein Problem hinzudeuten):

Option Explicit
Public WithEvents txtbx As MSForms.TextBox

Private Sub Class_Initialize()
    Static Variable1 As New Collection
    Variable1.Add Me
End Sub
Private Sub txtbx_Change()


' füllt "Berechnungswerte" UserForm


'----------------------------------
' Kraft Eingang HBZ: FhbzEin
'------------------------------------
If Fahrzeugdaten.bkraft <> "" And Fahrzeugdaten.Fpedalfeder <> "" And Fahrzeugdaten.iPedal <> "" _
 Then
    Berechnungswerte.FhbzEin.Value = Format((Fahrzeugdaten.bkraft.Value - Fahrzeugdaten. _
Fpedalfeder.Value) * Fahrzeugdaten.iPedal.Value, "0")
Else
FhbzEin = ""
End If


'--------------------------------------
' Druck Ausgang: Phbz
'--------------------------------------


For LoII = 0 To Fahrzeugdaten.ListeHBZVerstärker.ListCount - 1
If Fahrzeugdaten.ListeHBZVerstärker.Selected(LoII) Then


  If Berechnungswerte.FhbzEin.Value < Fk1075 Then
        Berechnungswerte.Phbz.Value = 0
        
    Else
    
     If Berechnungswerte.FhbzEin.Value <> "" And Fahrzeugdaten.WahlUnterdruck.Value <> "" Then
      If Berechnungswerte.FhbzEin.Value < Fk2075 Then
        Berechnungswerte.Phbz.Value = Format(Str((pk2075 - pk1075) / (Fk2075 - Fk1075) *  _
Berechnungswerte.FhbzEin.Value + pk2075 - Fk2075 * (pk2075 - pk1075) / (Fk2075 - Fk1075)), "0.0")
        Else
        Berechnungswerte.Phbz.Value = Format(Str((pW075 - pk2075) / (FW075 - Fk2075) *  _
Berechnungswerte.FhbzEin.Value + pkWahl - (pW075 - pk2075) / (FW075 - Fk2075) * FkWahl), "0.0")
      End If
     End If
     
     If Berechnungswerte.FhbzEin.Value <> "" And Fahrzeugdaten.WahlUnterdruck.Value = "" Then
      If Berechnungswerte.FhbzEin.Value < FkWahl Then
        Berechnungswerte.Phbz.Value = Format(Str((pk2075 - pk1075) / (Fk2075 - Fk1075) *  _
Berechnungswerte.FhbzEin.Value + pk2075 - Fk2075 * (pk2075 - pk1075) / (Fk2075 - Fk1075)), "0.0")
        Else
        Berechnungswerte.Phbz.Value = Format(Str((pW075 - pk2075) / (FW075 - Fk2075) *  _
Berechnungswerte.FhbzEin.Value + pW075 - FW075 * (pW075 - pk2075) / (FW075 - Fk2075)), "0.0")
      End If
     End If
     
     
    End If







Else

Berechnungswerte.Phbz.Value = ""

End If
Next LoII

'------------------------------------------
' Bremsmoment pro Bremse: Mb
'------------------------------------------
' 1. Achse
If Fahrzeugdaten.Dk1A.Value <> "" And _
Berechnungswerte.Phbz.Value <> "" And _
Fahrzeugdaten.AnzKolben1A.Value <> "" And _
Fahrzeugdaten.panl.Value <> "" And _
Fahrzeugdaten.AnzBr1A.Value <> "" And _
Fahrzeugdaten.uS.Value <> "" And _
Fahrzeugdaten.hh.Value <> "" And _
Fahrzeugdaten.rS.Value <> "" Then
    Berechnungswerte.Mb1A.Value = Format(Str(4 * Atn(1) * Fahrzeugdaten.Dk1A / 2 *  _
Fahrzeugdaten.Dk1A / 2 * Fahrzeugdaten.AnzKolben1A * Fahrzeugdaten.AnzBr1A * (Berechnungswerte.Phbz.Value - Fahrzeugdaten.panl) * Fahrzeugdaten.uS * Fahrzeugdaten.hh * Fahrzeugdaten.rS / 10), "0")
Else
    Berechnungswerte.Mb1A.Value = ""
End If

'--------------------------------------------------
' 2. Achse
If Fahrzeugdaten.Dk2A.Value <> "" And _
Berechnungswerte.Phbz.Value <> "" And _
Fahrzeugdaten.AnzKolben2A.Value <> "" And _
Fahrzeugdaten.panl.Value <> "" And _
Fahrzeugdaten.AnzBr2A.Value <> "" And _
Fahrzeugdaten.uS.Value <> "" And _
Fahrzeugdaten.hh.Value <> "" And _
Fahrzeugdaten.rS.Value <> "" Then
    Berechnungswerte.Mb2A.Value = Format(Str(4 * Atn(1) * Fahrzeugdaten.Dk2A / 2 *  _
Fahrzeugdaten.Dk2A / 2 * Fahrzeugdaten.AnzKolben2A * Fahrzeugdaten.AnzBr2A * (Berechnungswerte.Phbz.Value - Fahrzeugdaten.panl) * Fahrzeugdaten.uS * Fahrzeugdaten.hh * Fahrzeugdaten.rS / 10), "0")
Else
    Berechnungswerte.Mb2A.Value = ""
End If

'--------------------------------------------------
' 3. Achse
If Fahrzeugdaten.Dk3A.Value <> "" And _
Berechnungswerte.Phbz.Value <> "" And _
Fahrzeugdaten.AnzKolben3A.Value <> "" And _
Fahrzeugdaten.panl.Value <> "" And _
Fahrzeugdaten.AnzBr3A.Value <> "" And _
Fahrzeugdaten.uS.Value <> "" And _
Fahrzeugdaten.hh.Value <> "" And _
Fahrzeugdaten.rS.Value <> "" Then
    Berechnungswerte.Mb3A.Value = Format(Str(4 * Atn(1) * Fahrzeugdaten.Dk3A / 2 *  _
Fahrzeugdaten.Dk3A / 2 * Fahrzeugdaten.AnzKolben3A * Fahrzeugdaten.AnzBr3A * (Berechnungswerte.Phbz.Value - Fahrzeugdaten.panl) * Fahrzeugdaten.uS * Fahrzeugdaten.hh * Fahrzeugdaten.rS / 10), "0")
Else
    Berechnungswerte.Mb3A.Value = ""
End If

'-----------------------------------------------------
' 4. Achse
If Fahrzeugdaten.Dk4A.Value <> "" And _
Berechnungswerte.Phbz.Value <> "" And _
Fahrzeugdaten.AnzKolben4A.Value <> "" And _
Fahrzeugdaten.panl.Value <> "" And _
Fahrzeugdaten.AnzBr4A.Value <> "" And _
Fahrzeugdaten.uS.Value <> "" And _
Fahrzeugdaten.hh.Value <> "" And _
Fahrzeugdaten.rS.Value <> "" Then
    Berechnungswerte.Mb4A.Value = Format(Str(4 * Atn(1) * Fahrzeugdaten.Dk4A / 2 *  _
Fahrzeugdaten.Dk4A / 2 * Fahrzeugdaten.AnzKolben4A * Fahrzeugdaten.AnzBr4A * (Berechnungswerte.Phbz.Value - Fahrzeugdaten.panl) * Fahrzeugdaten.uS * Fahrzeugdaten.hh * Fahrzeugdaten.rS / 10), "0")
Else
    Berechnungswerte.Mb4A.Value = ""
End If

'------------------------------------------
' Bremsmoment pro Rad: Mr
'------------------------------------------
' 1. Achse
'If Berechnungswerte.Mb1A.Value <> "" And _
'5Fahrzeugdaten.Vorgelegeja.Value = True Then
'Berechnungswerte.Mr1A.Value = Berechnungswerte.Mb1A.Value * Fahrzeugdaten.Ir.Value /  _
Fahrzeugdaten.eta.Value

'Else

'If Berechnungswerte.Mb1A.Value <> "" And _
'Fahrzeugdaten.Vorgelegeja.Value = False Then
'Berechnungswerte.Mr1A.Value = Berechnungswerte.Mb1A.Value

'Else
'Berechnungswerte.Mr1A.Value = ""

'End If
'End If

End Sub

FhbzEin berechnet er mir jederzeit korrekt, Phbz setzt er mir immer auf leer, obwohl - wie gesagt - eine Variable gewählt ist.


  

Betrifft: AW: Listboxeintrag merken von: Jonathan
Geschrieben am: 25.01.2018 08:28:42

vergessen zu aktivieren dass das Thema noch offen ist.


  

Betrifft: AW: Listboxeintrag merken von: EtoPHG
Geschrieben am: 25.01.2018 11:42:18

Hallo,

Phbz setzt er mir immer auf leer, obwohl - wie gesagt - eine Variable gewählt ist.
Kein Wunder: Bei jedem nicht selektiertem Eintrag, stetzt du sie im Else-Zweig auf ""!

Gruess Hansueli


  

Betrifft: AW: Listboxeintrag merken von: Jonathan
Geschrieben am: 25.01.2018 15:42:58

das ist auch so gewollt...

Allerdings ist ein Wert selektiert (blau hinterlegt) und er geht trotzdem ins ""

Also zurück zur Ursprungsfrage, die mir bisher noch keiner beantworten konnte: warum erkennt er den markierten Wert in der Listbox nicht mehr, nachdem ich einen Change durch eine beliebige Änderung in der UserForm habe? Wenn ich dann erneut in die Listbox klicke, dann hat er den Wert wieder und setzt nicht mehr ""

Kann es sein dass keiner so recht verstanden hat worauf ich hinaus will?


  

Betrifft: AW: Listboxeintrag merken von: EtoPHG
Geschrieben am: 25.01.2018 15:45:46

Hallo Jonathan,

Bullshit: Beweis es mit einer Beispielmappe!

Gruess Hansueli


  

Betrifft: AW: Listboxeintrag merken von: onur
Geschrieben am: 25.01.2018 16:03:04

Passiert halt, wenn man so kompliziert programmiert, dass man selber nicht mehr durch den code blickt und nicht weiss, wie man effektiv den debugger benutzt.


  

Betrifft: AW: Listboxeintrag merken von: Jonathan
Geschrieben am: 25.01.2018 17:07:10

Hallo onur,

was soll denn das? Woher willst denn wissen dass ich kompliziert programmiere? Du weisst doch gar nicht warum ich gewisse Programmierungen eben in dieser Form mache. So wie meine Anwendung aussieht, ist das nicht anders möglich. Wenn du mir nicht helfen kannst/willst dann schreibe einfach nichts und unterlasse doch bitte diese Beleidigungen.


  

Betrifft: AW: Listboxeintrag merken von: onur
Geschrieben am: 25.01.2018 17:16:41


Nix für ungut,aber wenn du Kritik nicht vertragen kannst und sie auch noch als Beleidigung auffasst, bist du selber Schuld.
Wenn du doch so gut bist, wie du glaubst und keinerlei Kritik möchtest, wieso wendest du dich überhaupt an das Forum?
Alles, was ich von dir lese, ist: Das kann nicht sein, mein Code ist perfekt, es muss andere Gründe haben (EXCEL, UFO´s ?).
Auf jede Kritik reagierst du schnippisch, jede Information muss man dir aus der Nase ziehen, lädst keine Datei hoch, der gepostete Code ist für den A... und der tatsächliche Code kommt nur nach ausdrücklicher Anforderung.


  

Betrifft: AW: Listboxeintrag merken von: Jonathan
Geschrieben am: 26.01.2018 10:42:16

Ich konnte das Problem finden, ich werde es hier nochmal beschreiben, falls jemand anderes mal ein ähnliches Verhalten haben sollte. Der korrekte Code sieht nun so aus:

Option Explicit
Public WithEvents txtbx As MSForms.TextBox
Private Sub Class_Initialize()
    Static Variable1 As New Collection
    Variable1.Add Me
End Sub
Private Sub txtbx_Change()

For LoII = 0 To Fahrzeugdaten.ListeHBZVerstärker.ListCount - 1
If Fahrzeugdaten.ListeHBZVerstärker.Selected(LoII) Then


  If Berechnungswerte.FhbzEin.Value < Fk1075 Then
        Berechnungswerte.Phbz.Value = 0
        
    Else
    
     If Berechnungswerte.FhbzEin.Value <> "" And Fahrzeugdaten.WahlUnterdruck.Value <> "" Then
      If Berechnungswerte.FhbzEin.Value < Fk2075 Then
        Berechnungswerte.Phbz.Value = Format(Str((pk2075 - pk1075) / (Fk2075 - Fk1075) *  _
Berechnungswerte.FhbzEin.Value + pk2075 - Fk2075 * (pk2075 - pk1075) / (Fk2075 - Fk1075)), "0.0")
        Else
        Berechnungswerte.Phbz.Value = Format(Str((pW075 - pk2075) / (FW075 - Fk2075) *  _
Berechnungswerte.FhbzEin.Value + pkWahl - (pW075 - pk2075) / (FW075 - Fk2075) * FkWahl), "0.0")
      End If
     End If
     
     If Berechnungswerte.FhbzEin.Value <> "" And Fahrzeugdaten.WahlUnterdruck.Value = "" Then
      If Berechnungswerte.FhbzEin.Value < FkWahl Then
        Berechnungswerte.Phbz.Value = Format(Str((pk2075 - pk1075) / (Fk2075 - Fk1075) *  _
Berechnungswerte.FhbzEin.Value + pk2075 - Fk2075 * (pk2075 - pk1075) / (Fk2075 - Fk1075)), "0.0")
        Else
        Berechnungswerte.Phbz.Value = Format(Str((pW075 - pk2075) / (FW075 - Fk2075) *  _
Berechnungswerte.FhbzEin.Value + pW075 - FW075 * (pW075 - pk2075) / (FW075 - Fk2075)), "0.0")
      End If
     End If
     
     
    End If



Exit For



Else

Berechnungswerte.Phbz.Value = ""

End If
Next LoII

End Sub
Fehler war, dass Exit For an der richtigen Stelle gefehlt hat. Dann hatte er zwar eine Auswahl, die Schleife hat diese Auswahl aber einfach "überlaufen"


  

Betrifft: Also doch ein Wunder ...;-) (owT) von: EtoPHG
Geschrieben am: 26.01.2018 10:57:17




  

Betrifft: AW: Listboxeintrag merken von: Jonathan
Geschrieben am: 25.01.2018 17:00:07

Gut, ich werde mich ran machen mal was zu basteln. Hier schon mal ein Screenshot, damit ihr seht was ich meine. Beim ersten mal Listbox wählen ist das Feld "Druck Ausgang HBZ" gefüllt. Sobald ich einen Wert ändere springt der Wert auf "" obwohl die Listbox nach wie vor aktiviert ist.




Beiträge aus dem Excel-Forum zum Thema "Listboxeintrag merken"