Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.04.2024 20:05:21
28.04.2024 18:33:31
28.04.2024 18:25:12
Anzeige
Archiv - Navigation
1932to1936
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

If not mit or funzt nicht

If not mit or funzt nicht
05.07.2023 15:50:33
Ray

Hallo,

eigentlich will ich nur sagen, wenn die Zelle nicht 0 oder 1 ist, dann mecker.
So funzt es aber nicht:

If Not Worksheets("" & mL).Cells(X, 35).Value = 0 Or Not Worksheets("" & mL).Cells(X, 35).Value = 1 Then
MsgBox "Fehler...."

End If

Wie geht es richtig?


Viele Grüße aus Hamburg stürmisch mit 15 Grad

Ray

23
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: If not mit or funzt nicht
05.07.2023 15:56:20
Der Steuerfuzzi
Hallo,

wer nicht mal einen ganzen Satz richtig formulieren kann und das Wort "funktioniert" unnötig mit einem völlig rotzig klingenden "funzt" abkürzt, sollte eigentlich keine Lösung präsentiert bekommen:
If Not (Worksheets("" & mL).Cells(X, 35).Value = 0 Or Worksheets("" & mL).Cells(X, 35).Value = 1) Then
    MsgBox "Fehler...."
End If


AW: If not mit or funzt nicht
05.07.2023 16:10:02
Ray
Danke lieber Steuerfuzzi... Ich war hier schon in dem Forum, da gab es noch gar keine Anmeldung und soooo lange benutzte ich schon funzt und finde zudem: In der Kürze liegt die Würze. Für die Antwort die Du trotzdem schickst, dann ich Dir.

Leider funzt - Entschuldigung - funktioniert Dein Code nicht. Wenn die Zelle leer ist oder auch 2 oder sonst was kommt keine ErrMld...

Woran mag das liegen?

Viele Grüße aus HH Ray


Anzeige
AW: If not mit or funzt nicht
05.07.2023 16:56:34
Der Steuerfuzzi
Ich kenne ja Deine Datei nicht, aber bei mir funktioniert es, wenn die Zelle nicht 0 oder 1 ist, dann kommt die Meldung.
Eine leere Zelle hat einen Wert von 0. Falls Du nicht möchtest, dass eine leere Zelle als 0 interpretiert wird, dann musst Du das mit berücksichtigen:
If Not (Worksheets("" & ml).Cells(X, 35).Value = 0 Or Worksheets("" & ml).Cells(X, 35).Value = 1) Or Worksheets("" & ml).Cells(X, 35).Value = "" Then
    MsgBox "Fehler...."
End If


AW: If not mit or funzt nicht
05.07.2023 17:01:49
Der Steuerfuzzi
Es ist zwar ohne Datei reines Rätselraten, aber wahrscheinlich hast Du die Zelle als Text formatiert und Value gibt einen String zurück:
With Worksheets("" & ml).Cells(X, 35)
    If Not (Val(.Value) = 0 Or Val(.Value) = 1) Or .Value = "" Then
        MsgBox "Fehler...."
    End If
End With
Da ja die Würze in der Kürze liegt, habe ich den Code mit With etwas verkürzt.


Anzeige
AW: If not mit or funzt nicht
05.07.2023 17:09:24
Der Steuerfuzzi
Und zum Schluss noch eine Variante, wenn die Zelle als Text formatiert ist und nicht nur Zahlen erlaubt sind:
With Worksheets("" & ml).Cells(X, 35)
    If Not (.Value = "0" Or .Value = "1") Then
        MsgBox "Fehler...."
    End If
End With
Jetzt hast Du genug Möglichkeiten. Die musst Du nur noch ausprobieren.


AW: If not mit or funzt nicht
05.07.2023 16:01:01
volti
Hallo,

eine Idee
With ThisWorkbook.Worksheets(mL).Cells(x, 35)
     If .Value  0 Or .Value > 1 Then MsgBox "Fehler...."
End With
Gruß KH


Anzeige
AW: If not mit or funzt nicht
05.07.2023 16:16:36
Ray
Danke aber das funktioniert auch nicht.


AW: If not mit or funzt nicht
05.07.2023 16:33:50
Rudi Maintaire
Hallo,
evtl. so?
Select Case --Worksheets(mL).Cells(X, 35).Value
  Case 0, 1
  Case Else: MsgBox "Mecker"
End Select
Gruß
Rudi


AW: If not mit or funzt nicht
05.07.2023 16:49:14
onur
If Worksheets("" & mL).Cells(X, 35).Value > 0 AND Worksheets("" & mL).Cells(X, 35).Value > 1 Then


AW: If not mit or funzt nicht
05.07.2023 17:24:11
Daniel
Hi
Bei NICHT in der Logik ist das menschliche Gehirn schnell über fordert.
Wir denken lieber Positiv.

Probiere mal so, das Not weglassen und dann die Messagbox in den Else-Teil schieben

If Worksheets("" & mL).Cells(X, 35).Value = 0 Or Worksheets("" & mL).Cells(X, 35).Value = 1 Then
Else
    MsgBox "Fehler...."
End If
Einfacher natürlich mit Select Gase
Select Case Worksheets("" & mL).Cells(X, 35).Value
    Case 0, 1
    Case Else
       Msgbox "Fehler ..."
End Select
Wenn du bei deiner Logik mit Not bleiben willst:
If Not (Worksheets("" & mL).Cells(X, 35).Value = 0 Or Worksheets("" & mL).Cells(X, 35).Value = 1) Then
MsgBox "Fehler...."

End If
Oder mit >
If Worksheets("" & mL).Cells(X, 35).Value > 0 And Worksheets("" & mL).Cells(X, 35).Value > 1 Then
MsgBox "Fehler...."

End If


Anzeige
Spiel offen: jeder darf raten
05.07.2023 18:02:49
Yal
Hallo Ray,

hast Du etwa irgendwo davor einen "On Error Resume Next", die einen nicht existierende Worksheets(mL) oder nicht numerischen "X" übergehen würden?

VG
Yal


Problem eingegrenzt aber noch offen
06.07.2023 09:06:21
Ray
Moin,
ich habe jetzt die verschiedenen Vorschläge einmal wie nachstehend durchprobiert. Keiner funktioniert mit allen Optionen. Die Zelle(n) sind nicht formatiert (Standard wird angezeigt) und das Problem scheint zu sein, wenn nichts in der Zelle steht. Gibt es eine Lösung die das mit einschließt oder brauche ich eine zweite abfrage nach "leer"?

Soll: Feld darf nur 0 oder 1 sein und nicht leer

Err mit case:
NULL nein
1 nein
2 ja
abc ja
-1 ja
0 nein

Err mit val
NULL ja
1 nein
2 ja
abc nein
-1 ja

Err mit if not
NULL Nein
1 nein
2 ja
abc ja
-1 ja
0 nein

Viele Grüße aus dem sonnigen windstillen Hamburg bei 15 Grad
Ray


Anzeige
AW: Problem eingegrenzt aber noch offen
06.07.2023 09:52:00
Der Steuerfuzzi
Leider kann man ohne Deine Datei zusehen schlecht sagen, was hier schief läuft. Bei all dem Code, den Du hier bekommen hast, müssten einige funktionieren, wenn die Zelle als Standard definiert ist.

Aber mal eine andere Frage: Wenn das Feld nur 0 oder 1 sein darf, kannst Du das ganze mit der Datenüberprüfung doch viel eleganter lösen. Einfach im Reiter "Daten" unter "Datentolls" auf "Datenüberprüfung" gehen und in dem Fenster unter "Zulassen" den Eintrag "Liste" auswählen. Dort dann bei "Quelle" die Werte durch Komma getrennt eingeben, hier also "0;1" (aber ohne Anführungszeichen eingeben). Jetzt kann man mittels Dropdown nur noch 0 und 1 auswählen. Durch Eingabe kann man nur noch den Wert aus der Zelle löschen, so dass die Zelle maximal noch leer sein könnte. Bei jeder anderen Eingabe kommt eine Meldung (die man auch individualisieren kann). Jetzt brauchst Du nur noch prüfen, ob die Zelle leer ist oder nicht.


Anzeige
AW: Problem eingegrenzt aber noch offen
06.07.2023 14:18:55
Ray
Hey danke, interessant, dass kannte ich noch nicht.


AW: Problem eingegrenzt aber noch offen
06.07.2023 15:42:41
Daniel
Ein Problem könnte sein, das Cells(...).Value eine Leerzelle wie 0 interpretiert.
Das Problem könntest du vermeiden, wenn du auf .Text anstelle von .Value abfragst.
Als Text sind Leerzellen "" und Null ist "0"

Also:

If ...Cells(...).Text = "0" or ...Cells(...).Text = "1" then
Else
    MsgBox "Fehler..."
End If
Grus Daniel


Anzeige
AW: Weil es AND sein muss
06.07.2023 19:33:55
Zwenn
Hallo Ray,

Deine Anforderung in Deiner Antwort an Yal:
Soll: Feld darf nur 0 oder 1 sein und nicht leer 
Die Abfragen auf NOT 0 und NOT 1 müssen AND verknüpft werden, wenn nur 0 oder 1 in der Zelle stehen darf. Ob die Zelle leer ist muss nicht extra geprüft werden, da alles außer 0 und 1 in der Zelle zum gewünschten Fehler führt. Der Zellinhalt wird für die Abfragen auf NOT 1 und NOT 0 in Zeichenketten umgewandelt. Damit ist es egal ob 0 oder 1 als Zahlen oder als Text formatiert sind.

Sub test()
  If Not CStr(Cells(1, 1)) = "0" And Not CStr(Cells(1, 1)) = "1" Then
    MsgBox "Fehler...."
  End If
End Sub
Viele Grüße,

Zwenn


Anzeige
AW: Fehlte noch ein zusätzliches OR
06.07.2023 19:57:54
Zwenn
Super,

in Deiner Anforderung steht, die Zelle darf zusätzlich nicht leer sein. Habe das nicht übersehen. Also muss noch eine zweite Verknüfung mit OR erfolgen, ob die Zelle leer ist, um den Fehler zu bekommen.

Sub test()
  If Not CStr(Cells(1, 1)) = "0" And Not CStr(Cells(1, 1)) = "1" Or Cells(1, 1) = "" Then
    MsgBox "Fehler...."
  End If
End Sub
Viele Grüße,

Zwenn


Jetzt erkennt er alles als Fehler
07.07.2023 10:34:54
Ray
Moin Moin, danke für den weitern Vorschlag:

Sub test()
  If Not CStr(Cells(1, 1)) = "0" And Not CStr(Cells(1, 1)) = "1" Or Cells(1, 1) = "" Then
    MsgBox "Fehler...."
  End If
End Sub
Leider wirft das bei allem einen Fehler aus, egal ob 0, 1, oder sonst was in der Zelle steht.

VG aus dem sonnigen HH bei 16 Grad Ray


Anzeige
Dann musst Du neue LogikGatter einkaufen ;-)
08.07.2023 11:55:52
Zwenn
Hallo Ray,

mit einigem Erstaunen lese ich, dass der Code bei Dir anders reagiert, als bei mir. Ich habe den nämlich nicht einfach nur hier ins Forum geschrieben, ich habe ihn vorher auch getestet. Es kann also nur sein, dass Du es mit einer anderen als Zelle A1 getestet hast, während in dieser weder eine 0 noch eine 1 stand oder dass es noch andere Rahmenbedingungen gibt, die ich nicht kannte oder nicht berücksichtigt habe. Ich hatte aber einleitend geschrieben, was ich als Anforderung Deinerseits verstanden habe und das Gleiche lese ich auch in Deiner Antwort auf Gerds Beitrag.

Hier ist die Erklärung. warum ich weiß, dass mein Code funktioniert.

Der Kernausdruck lautet:
Not 0 And Not 1
Im Code wird er verwendet, um sicherzustellen, dass der Körper für die If Anweisung nur ausgeführt wird, wenn das Ergebnis der Prüfung des logischen Ausdruckes True ergibt. Wie bekannt, ergibt And nur True, wenn alle miteinander verknüpften Variablen gleich sind. Deshalb brauchen wir noch die beiden Not vor den Variablen, die ihr Ergebnis jeweils umkehren, um alle Fälle abzudecken, die weder 0 noch 1 sind.

Wahrheitstabelle And:

a b x
0 0 0
0 1 0
1 0 0
1 1 1
Wahrheitstabelle Not:

a x
0 1
1 0
Wir rechnen das kurz durch.

In Zelle A1 steht 0: Not 0 ergibt dann False (0 = 0 = True, Not True = False), Not 1 ergibt True (0 = 1 = False, Not False = True)
Das entspricht in der Wahrheitstabelle von And Zeile 2, mit a = 0, b = 1. Als Ergbnis der And-Verknüpfung erhalten wir x = 0. Also genau was wir wollen, der If-Körper wird übersprungen.

In Zelle A1 steht 1: Not 0 ergibt dann True, Not 1 ergibt False
Das entspricht in der Wahrheitstabelle von And Zeile 3, mit a = 1, b = 0. Als Ergbnis der And-Verknüpfung erhalten wir x = 0. Also wieder genau was wir wollen, der If-Körper wird übersprungen.

In Zelle A1 steht z.B. 2: Not 0 ergibt dann True, Not 1 ergibt True
Das entspricht in der Wahrheitstabelle von And Zeile 4, mit a = 1, b = 1. Als Ergbnis der And-Verknüpfung erhalten wir x = 1. Also genau was wir wollen, der If-Körper wird ausgeführt. Da dies für die 2 funktioniert und nur gegen 0 und 1 geprüft wird, ergeben alle anderen Werte ungleich 0 oder 1 ebenfalls True für den And-Ausdruck.

Anschließend kommt noch der Or-Ausdruck hinzu, um zusätzlich sicherzustellen, dass die Zelle nicht leer ist. Das muss sein, weil eine leere Zelle als 0 interpretiert wird und folgllich der If-Körper nicht ausgeführt würde, weil der And-Audruck für eine leere Zelle True ergibt.

Eine Klammerung von Teilausdrücken ist nicht notwendig, weil Not Priorität vor And und And Priorität vor Or beim Berechnen hat. Das ist analog zu Punkt- vor Strichrechnung zu verstehen.

Hier ist die Erklärung. warum es mit Or nicht funktionieren kann. (Gerd hat das bereits angemerkt.)
Der Kernausdruck mit Or lautet:
Not 0 Or Not 1
Wahrheitstabelle Or:

a b x
0 0 0
0 1 1
1 0 1
1 1 1
Eigentlich sieht man es schon an der Wahrheitstabelle, denn die Zeilen 2, 3 und 4 darin ergeben jeweils True, womit völlig egal ist, was in der geprüften Zelle steht, der If-Körper wird in jedem Fall ausgeführt.

Wir rechnen das trotzdem kurz durch.

In Zelle A1 steht 0: Not 0 ergibt dann False, Not 1 ergibt True
Das entspricht in der Wahrheitstabelle von Or Zeile 2, mit a = 0, b = 1. Als Ergbnis der Or-Verknüpfung erhalten wir x = 1. Also genau was wir nicht wollen, der If-Körper wird ausgeführt.

In Zelle A1 steht 1: Not 0 ergibt dann True, Not 1 ergibt False
Das entspricht in der Wahrheitstabelle von Or Zeile 3, mit a = 1, b = 0. Als Ergbnis der Or-Verknüpfung erhalten wir x = 1. Also wieder genau was wir nicht wollen, der If-Körper wird ausgeführt.

In Zelle A1 steht z.B. 2: Not 0 ergibt dann True, Not 1 ergibt True
Das entspricht in der Wahrheitstabelle von Or Zeile 4, mit a = 1, b = 1. Als Ergbnis der Or-Verknüpfung erhalten wir x = 1. Also genau was wir wollen, der If-Körper ausgeführt. Da dies für die 2 funktioniert und nur gegen 0 und 1 geprüft wird, ergeben alle anderen Werte ungleich 0 oder 1 ebenfalls True für den Or-Ausdruck.

Das ist angewendete boolesche Algebra, der wir überall da in der Programmierung begenen, wo wir es mit logischen Ausrücken z.B. für If-Anweisungen oder Abbruchbedingungen für Schleifen zu tun haben.
https://de.wikipedia.org/wiki/Boolesche_Algebra
https://www.youtube.com/watch?v=pppTemykV5I
(Der Mann erklärt das Thema anhand von Logikgattern. Das ist aber das Gleiche, sogar noch besser veranschaulicht. Es geht dann aber auch schnell in die Mathematik, bzw. werden die Rechenregeln zur Anwendung und Vereinfachung von logischen Ausdrücken gezeigt. Ab 9:25 geht es dann wieder in die Veranschaulichung mit Gattern. Ich habe das Video nicht ganz angesehen, aber für die Grundlagen ist es gut brauchbar.)

Viele Grüße,

Zwenn


AW: Dann musst Du neue LogikGatter einkaufen ;-)
08.07.2023 12:53:28
GerdL
Ja Zwenn. Es ist immer schwierig, die Umsetzungen der Fragesteller zu erahnen.

Die Krux lag hier mit darin, dass eine leere Zelle -je nach Abfrage- Empty aber auch 0 und auch den Leerstring """ als Value zurückgibt.
Man kann á la Nepumuk die Text - Eigenschaft der Zelle auswerten. Die unterscheidet direkt.

Gruß Gerd


AW: Dann musst Du neue LogikGatter einkaufen ;-)
08.07.2023 13:14:33
Zwenn
Hallo Gerd,

ja, da hast Du natürlich Recht. Mir geht es bei meiner Erklärung vor allem darum zu erläutern, wie die Logik hinter dem Ausdruck zu verstehen ist, von dem ich ausgegangen bin, weil Ray antwortete, der Code führe immer zur Ausführung des If-Körpers. Da Du schon geschrieben hattest, das Not Or Not auf keinen Fall funktioniert, habe ich das direkt mit aufgegriffen.

Viele Grüße :-)

Zwenn


AW: If not mit or funzt nicht
07.07.2023 10:59:11
GerdL
Noch einen Krückstock.
Sub Unit()

    MsgBox ActiveCell.Address(external:=True)
    
    If Not IsEmpty(ActiveCell) And (ActiveCell.Value = 0 Or ActiveCell.Value = 1) Then
        MsgBox "OK"
    Else
        MsgBox "Fehler"
    End If

End Sub
Gruß Gerd


die LÖSUNG Ist:
07.07.2023 11:40:22
Ray
Moin nochmal und herzlichen Dank für die vielen Ideen und Anmerkungen. Seit 20 Jahre bin ich hier dabei und immer wieder lerne ich was dazu. Nachdem ich den letzten Hinweis etwas umgebaut habe funktinoiert nun alles wie gewünscht:

'Abfrage, dass die Zelle nicht NULL und nur 1 oder 0 ist. (Die folgende Abfage If Not (Worksheets("" & mL).Cells(X, 35).Value = 0 Or Worksheets("" & mL).Cells(X, 35).Value = 1) Then macht leer zu 0)
'MsgBox ActiveCell.Address(external:=True) Msg zeigt welches Sheet welche Zelle

If Not IsEmpty(Worksheets("" & mL).Cells(X, 35)) And (Worksheets("" & mL).Cells(X, 35).Value = 0 Or Worksheets("" & mL).Cells(X, 35).Value = 1) Then
Else
MsgBox "Fehler bei Angabe zur Freistellungsbescheinigung für das Finanzamt." & vbLf & "Es darf auf sheet mitglieder Spalte 35 ''Ai'' nur eine 0 oder 1 stehen. Dort steht: " & Worksheets("" & mL).Cells(X, 35).Value & vbLf & vbLf & "Err in Zeile: " & X, vbCritical, "DS Info #awsq123"

End If
'Ende Abfrage, dass die Zelle nicht NULL und nur 1 oder 0 ist

Schönes WoEnde für Euch
Ray

47 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige