Deaktivierung Button funktioniert nicht

Hallo,
ein kleines Problem.
Der „cmdRechnen“ ist solange deaktiviert, bis in der „txtWareneingangEingabe“ ein Wert(Zahl) eingegeben worden ist.
Der „cmdÜbertragen“ ist solange deaktiviert, bis der „cmdRechnen“
gedrückt wurde. Das funzt.
Aber jetzt ist die „txtRollenEingabe“ dazugekommen. Auch hier soll
der „cmdRechnen“ solange deaktiviert sein, bis ein Wert eingegeben ist. Das funzt jetzt nicht mehr, keine Fehlermeldung.
Irgendwo habe ich da noch einen Fehler drin.
Für jede Hilfe mein Dank im Voraus.
Hier der Code mit den „Change-Ereignissen“ der TextBoxen und
„UserForm_Initialize“.
Gruß Skaletti!

Private Sub txtWareneingangEingabe\_Change()
cmdRechnen.Enabled = CBool(Len(txtWareneingangEingabe) \> 0)
If IsNumeric(txtWareneingangEingabe) = False Then
 MsgBox "Bitte nur Zahlen eingeben"
 txtWareneingangEingabe.Value = ""
 End If
End Sub

Private Sub txtRollenEingabe\_Change()
cmdRechnen.Enabled = CBool(Len(txtRollenEingabe) \> 0)
If IsNumeric(txtRollenEingabe) = False Then
 MsgBox "Bitte nur Zahlen eingeben"
 txtRollenEingabe.Value = ""
 End If
End Sub

Private Sub UserForm\_Initialize()
cmdRechnen.Enabled = CBool(Len(txtWareneingangEingabe) \> 0 = CBool(Len(txtRollenEingabe) \> 0))
cmdÜbertragen.Locked = True
 txtAufLagerAlt.Text = Tabelle4.Cells(Selection.Row, 10)
 txtWareneingangAlt.Text = Tabelle4.Cells(Selection.Row, 12)
 txtRollenAlt.Text = Tabelle4.Cells(Selection.Row, 9)
End Sub

Hallo,
bin ein Stück weiter.
cmdRechnen.Enabled = CBool(Len(txtWareneingangEingabe) > 0 + CBool(Len(txtRollenEingabe) > 0))
So ist der Button deaktiviert.
Aber sobald in einer Box ein Wert steht, wird der Button freigegeben.
Er soll aber erst freigegeben werden wenn in beiden TextBoxen ein
Wert steht. Ist das möglich??

Gruß Skaletti!

Hallo Skaletti,

Hallo,
bin ein Stück weiter.
cmdRechnen.Enabled = CBool(Len(txtWareneingangEingabe) > 0 +
CBool(Len(txtRollenEingabe) > 0))
So ist der Button deaktiviert.
Aber sobald in einer Box ein Wert steht, wird der Button
freigegeben.
Er soll aber erst freigegeben werden wenn in beiden TextBoxen
ein
Wert steht. Ist das möglich??

Das ist aber nicht der Weg den ich dir gezeigt habe. Mal ein wenig Theorethie *gg*

Durch cBool wandelst du den Audruck in ein Boolschen Wert um!
Mal ein kleine Bsp:

Dim v1 as integer
Dim v2 as intreger
Dim b as Boolean
V1=0
V2=1
B=cbool(v1) --\> B ist False
B=cbool(V2) --\> B ist True
v2=15
b=cbool(v2) --\> B ist true

Wie du erkennst liefert Cbool mit dem Argument einer Zahl nur dann False wenn dieser 0 ist. Ist dieser aber ungleich 0 so liefert er true.

Nun aber zu deinem Source

> cmdRechnen.Enabled = CBool(Len(txtWareneingangEingabe) \> 0 +  
> CBool(Len(txtRollenEingabe) \> 0))

Was machst du hier? Ist txtWareneingangEingabe > 0 dann bekommst du ein True. Das selbe machst du mit txtRollenEingabe. Nun versuchst du 2 Boolsche Werte miteinander zu addieren! Prinbzipiell geht es da True auch als -1 interpretiert wird und False als 0
Gehen wir mal nun von dem Sachverhalt eine der Textboxen ist gefuellt, so versuchst du nun -1 + 0 zu rechnen. Das diese wiederrum -1 ist, ist klar. -1 ist ungleich 0 und ergo TRUE!

Mache es doch so, wie ich es dir beschrieben habe!

Sprich

Control.Enabled= Len(txt1)>0 and len(txt2)>0 and len(txt3)>0)

Was geschieht hier?

Len(Object) liefert dir die Länge. Ist sie Null so bekommst du eine 0. Ist sie länger so bekommst du einen Wert >0

Nun kommt aber das wichtige. Die Verknüpfung!! Du verknüpfst sie mit AND.
Weisst du wie man einen Ausdruck mit AND vergleicht? Also Rechnerisch?

Nein ? Ok hier mal ein Bsp.

Zahlen werden intern Binaer dargestellt.
Binaer schaut die 0 so aus

00000000

Die 1

00000001

und zum Bsp. die 13

00001101

Warum diese nun schauen wir mal. Wir vergleichen die 3 mit and

00000000
AND
00000001
AND
00001101

Binaere Zustaende gibt es nur als 1 oder 0. Sind alle Werte 1 am gleichen Bit, so wird bei einer AND Verknüpfung das Resultat 1! Ansonsten 0!

Nun rechnen wir mal

Bit 7: 1 AND 1 AND 0 -> 0
Bit 6: 0 AND 0 AND 0 --> 0
Bit 5: 1 AND 0 AND 0 -> 0

Das Ergebiniss würde also 0 Sein! O wiederrum ist False. Also bekommst du nun ein False geliefert!

Versuche das nun mal mit deinem Versuch! Eine Negative Zahl wird binaer wiefolgt dargstellt. Das oberste Bit ist eine 1! das sagt das sie negativ ist. Deswegen kannst du nur noch Wert bis 126 darstellen, da das 7 Bit fehlt.

Rechnen wir nun mal

00000000 -> False
+
10000001 -> True

10000001 -> TRUE!!!

So nun hoffe ich mal das du einen kleinen Einblick bekommen hast :smile:

Deine Abfragen müssten in den 4 Ereignissen ( 3 mal Change und einmal Initialize) wie folgt lauten.
Ausdruck wird länger *gg* Also makieren und ganz nach rechts ziehen :smile:

cmdRechnen.enabled=cBool(len(txtWarenEingangEingabe)\>0 **AND** len(txtWarenAusgangEingabe)\>0 **AND** len(txtRollenEingabe)\>0)

Gruß Skaletti!

MfG Alex

Hi Alex,
vielen Dank für diese Lernstunde.
Diese ausführlichen Erklärungen sind Super, und sehr gut zu verstehen.
VBA ist für mich Hobby, und solche genauen Erklärungen helfen mir sehr.
Nochmals vielen Dank.

Gruß Skaletti!

Hallo Skaletti!

Die Steuerung des cmdRechnen sollte aber auch funktionieren, wenn Du die Textlängen-Werte miteinander multiplizierst:

cmdRechnen.Enabled=CBool(Len(txtWarenEingangEingabe.Text) \* Len(txtWarenAusgangEingabe.Text) \* Len(txtRollenEingabe.Text))

Meiner Meinung nach ist der Aufbau dieser Anweisung falsch, selbst, wenn sie funktioniert:

cmdRechnen.enabled=cBool(len(txtWarenEingangEingabe)\>0 AND len(txtWarenAusgangEingabe)\>0 AND len(txtRollenEingabe)\>0)

Nach meiner Überzeugung wäre die Anweisung folgendermaßen richtig aufgebaut:

cmdRechnen.Enabled = CBool(Len(txtWarenEingangEingabe.Text)) And CBool(Len(txtWarenAusgangEingabe.Text)) And CBool(Len(txtRollenEingabe.Text))

Auf diese Weise wären die drei boolschen Werte dann richtig miteinander „verstrickt“.

VG
Carsten

Hallo Skaletti!

Sofern die Schaltfläche „cmdRechnen“ bei jedem Aufruf des UserForm deaktiviert sein soll, wäre es eine Möglichkeit, die „Enabled“-Eigenschaft der Schaltfläche(n) pauschal in den Eigenschaften auf „False“ einzustellen. Damit könnte dann die Anweisung im „UserForm_Initialize“-Ereignis wegfallen.

Weiterhin bietet es sich an, die Anweisung in eine eigene Prozedur zu verfrachten, die dann in den „Change“-Ereignissen der Textboxen aufgerufen wird. Das hätte dann den Vorteil, dass immer nur die eine Anweisung geändert werden müsste, wenn man 'mal in die Verlegenheit kommt, dass das UserForm um eine Textbox erweitert wird, deren Textlängen-Wert ebenfalls für die Steuerung der „Enabled“-Eigenschaft der Schaltfläche benötigt wird.

VG
Carsten

Hallo Carsten,

Die Steuerung des cmdRechnen sollte aber auch funktionieren,
wenn Du die Textlängen-Werte miteinander multiplizierst:

cmdRechnen.Enabled=CBool(Len(txtWarenEingangEingabe.Text) *
Len(txtWarenAusgangEingabe.Text) * Len(txtRollenEingabe.Text))

funktioniert

Meiner Meinung nach ist der Aufbau dieser Anweisung falsch,
selbst, wenn sie funktioniert:

cmdRechnen.enabled=cBool(len(txtWarenEingangEingabe)>0 AND
len(txtWarenAusgangEingabe)>0 AND len(txtRollenEingabe)>0)

funktioniert

Nach meiner Überzeugung wäre die Anweisung folgendermaßen
richtig aufgebaut:

cmdRechnen.Enabled = CBool(Len(txtWarenEingangEingabe.Text))
And CBool(Len(txtWarenAusgangEingabe.Text)) And
CBool(Len(txtRollenEingabe.Text))

Auf diese Weise wären die drei boolschen Werte dann richtig
miteinander „verstrickt“.

Also, funktionieren alle 3. Es werden also jedesmal die richtigen
boolschen Werte errechnet. Theoretisch sind alle 3 anwendbar.
Habe ich ausprobiert. Die „Verstrickung“ der boolschen Werte soll
dann bestimmt für einen sicheren Ablauf des Codes sorgen.
Richtig??
Gruß Skaletti!
PS.:smiley:anke für die Hilfe

Hallo Skaletti.

cmdRechnen.enabled=cBool(len(txtWarenEingangEingabe)\>0 AND len(txtWarenAusgangEingabe)\>0 AND len(txtRollenEingabe)\>0)

Die Anweisung in der Form, wie Anno sie schrieb, ist eher die „Verkürzung“ eines If-Blocks. Ich meine rein gefühlsmäßig, denn sie „hört“ sich eigentlich so an :

If Len(txtWarenEingangEingabe.Text) \> 0 And Len(txtWarenAusgangEingabe.Text) \> 0 And Len(txtRollenEingabe.Text) \> 0 Then
 cmdRechnen.Enabled = True
Else
 cmdRechnen.Enbled = False
End If

VG
Carsten

Hallo Carsten,

Hallo Skaletti!

Die Steuerung des cmdRechnen sollte aber auch funktionieren,
wenn Du die Textlängen-Werte miteinander multiplizierst:

Richtig, weil du dann nur einen Wert hast, der bei einer fehlenden Angabe gleich 0 ist ansonsten 0 und VB eine 0 als False interpretiert, ansonsten als True.

cmdRechnen.Enabled=CBool(Len(txtWarenEingangEingabe.Text) *
Len(txtWarenAusgangEingabe.Text) * Len(txtRollenEingabe.Text))

Meiner Meinung nach ist der Aufbau dieser Anweisung falsch,
selbst, wenn sie funktioniert:

cmdRechnen.enabled=cBool(len(txtWarenEingangEingabe)>0 AND
len(txtWarenAusgangEingabe)>0 AND len(txtRollenEingabe)>0)

Was bitte schön ist daran falsch? Len(txtWarenEingangEingabe)>0 gibt dir einen Wert von True oder False wieder. Sprich eine -1 oder eine 0. Die Umwandlung macht VB automatisch! Danach werden nur die 3 Werte mit AND überprüft. Je nachdem erhaelt man dann eine 1 oder eine 0 und diese wird, nur zur Übersicht und zur Sicherstellung in einen Wert vom Typ Boolean gewandelt!
Man könnt auch noch das Cbool weglassen. Aber dann wird es unuebersichtlich und gerade für Anfaenger, ein Ding der Unmöglichkeit den Source dann noch zu lesen!

Nach meiner Überzeugung wäre die Anweisung folgendermaßen
richtig aufgebaut:

cmdRechnen.Enabled = CBool(Len(txtWarenEingangEingabe.Text))
And CBool(Len(txtWarenAusgangEingabe.Text)) And
CBool(Len(txtRollenEingabe.Text))

Funktioniert auch. Nur warum schreiben, wenn die Arbeit VB automatisch übernimmt?

Auf diese Weise wären die drei boolschen Werte dann richtig
miteinander „verstrickt“.

Das sind sie auch bei meiner Variante! Oder habe ich einen Denkfehler, der sich schon über Jahre hinweg zieht und in etlichen Proggis die heute noch funktionieren ihren Dienst machen!

VG
Carsten

MFG Alex

Hallo Anno.

Was bitte schön ist daran falsch?
Len(txtWarenEingangEingabe)>0 gibt dir einen Wert von True
oder False wieder. Sprich eine -1 oder eine 0. Die Umwandlung
macht VB automatisch! Danach werden nur die 3 Werte mit AND
überprüft. Je nachdem erhaelt man dann eine 1 oder eine 0 und
diese wird, nur zur Übersicht und zur Sicherstellung in einen
Wert vom Typ Boolean gewandelt!
Man könnt auch noch das Cbool weglassen. Aber dann wird es
unuebersichtlich und gerade für Anfaenger, ein Ding der
Unmöglichkeit den Source dann noch zu lesen!

Ich denke, ich habe ziemlich genau beschrieben, was ich am Aufbau Deiner Anweisung falsch finde. Ob und was VB automatisch macht, ist meiner Meinung nach an dieser Stelle unerheblich. „.Text“ kann man ja auch weglassen, weil’s die Standard-Eigenschaft der Textboxen ist; aber sollte man das? Nee.

VG
Carsten

Hallo Carsten,

Ich denke, ich habe ziemlich genau beschrieben, was ich am
Aufbau Deiner Anweisung falsch finde. Ob und was VB
automatisch macht, ist meiner Meinung nach an dieser Stelle
unerheblich. „.Text“ kann man ja auch weglassen, weil’s die
Standard-Eigenschaft der Textboxen ist; aber sollte man das?
Nee.

Doch das könnte man. Wozu kann man in VB Standard Eigenschaften definieren? Dafür das man es eh nie nutzen „Sollte“? Die MSDN sagt diesbezueglich auch etwas anderes…

Desweiteren hast du nicht genau beschrieben was an meiner Anweisung falsch sein könnte! Ich habe lediglich VB die Arbeit machen lassen. Also völlig korrekt. Wo ist da nun der Fehler?

Aber by the Way …

Du hast Skaletti folgendes vorgeschlagen

cmdRechnen.Enabled = CBool(Len(txtWarenEingangEingabe.Text)) And CBool(Len(txtWarenAusgangEingabe.Text)) And CBool(Len(txtRollenEingabe.Text))

Wenn mich da mal nicht mein Auge täuscht. Aber mir haelst du vor das ich eine Automatische Umwandlung durchführen lasse, aber selbst du machst das dann auch!

Schaue dir mal deine Anweisung genauer an. Du verknüpfst 3 Werte vom Typ mit Boolean. Aber erfolgt da die Umwandlung? Hier überlässt du VB die Arbeit!

Man könnte zum Bsp. folgendes schreiben

Dim x as integer
Dim y as boolean

x=1 and 2 and 3 --> Ergebnis 0
y= 1 and 2 and 3 --> Ergebnis False

Wie du siehst liefert 2 mal die selbige Anweisung, 2 Unterschiedliche Wertetypen!

Aber mal was anderes, schreibst du immer anderen das die Lösung falsch ist, wenn sie nicht Deiner entspricht? Es führen viele Wege nach Rom. Welchen man nutzt ist letztendlich jedem selbst überlassen…
Wenn es an dem ist, dann werde ich mich in Zukunft hüten hier jemanden eine Lösung zu präsentieren, denn sie ist ja so oder so falsch …

VG
Carsten

In diesem Sinne

MfG Alex

Ommmmmmm

Wenn es an dem ist, dann werde ich mich in Zukunft hüten hier
jemanden eine Lösung zu präsentieren, denn sie ist ja so oder
so falsch …

Hallo Alex,

heute war/ist hier ein sehr schöner sonniger Tag. Die Eintracht kann heute auch nicht verlieren, weil sie erst morgen spielt *lächel*

Lass bittesehr bzw. bitteschön den Kwark hier nicht mehr antworten zu wollen.
Entspann dich, chill ab oder fäll nen Baum mit ner stumpfen Axt, dann kommste auf andere Gedanken :smile:))

Zur Sache selbst, ich hab zwar mitgelesen, aber die Codes waren mir zu breit, ich hasse den Überblicksverlust wenn man da horizontal scrollen muß, insofern habe ich mir es erspart die Codes genauer anzusehen.

Peace

Gruß
Reinhard

Hallo Anno.

Calm Down.
Genau lesen
Nicht durchdrehen
Mir meine Meinung lassen

VG
Carsten