Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: VBA if and or

VBA if and or
12.06.2021 10:25:33
W
Hallo Forum,
mein nachfolgender Code funktioniert nicht, weil in der "Or"-Bedingung der Wert SheetIX mit "0" zu einem Fehler führt.
On Error Resume Next
SheetIx = Sheets(NewName).Index
On Error GoTo 0
If (SheetIx = 0) Or _
(SheetIx > 0 And Sheets(SheetIx).Name <> NewName) Then
ActiveSheet.Name = NewName
End If
Was wäre die richtige Lösung?
Gruß Werner
Anzeige

16
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA if and or
12.06.2021 10:38:10
Hajo_Zi
Hallo Werner,
es gibt kein Scheets 0
Variable NewName nicht festgelegt.
Ich habe es definiertg, kein Fehler.
GrußformelHomepage
Anzeige
AW: VBA if and or
12.06.2021 10:54:35
W
Hallo Hajo,
das ist mir schon klar, dass ein keinen Index 0 gibt. Mein Problem ist die If-Bedingung.
Die Prüfung lautet doch: Wenn SheetIx = 0 oder
(SheetIx > 0 und Sheets(Sheetix).Name)...
Ich verstehe das so: entweder muss Sheetix = 0 sein, oder größer 0 und der Name unterschiedlich.
Gruß Werner
Anzeige
AW: VBA if and or
12.06.2021 10:56:16
Hajo_Zi
Hallo Werner,
warum dann dieser Vergleich.
Ich kann Dir nicht helfen. Bei mir geht es.
Gruß Hajo
AW: VBA if and or
12.06.2021 11:04:02
W
Hallo Forum,
auch wenn Hajo anscheinend den Sinn meines Codes nicht versteht: kann mir jemand weiterhelfen, wie ich mit IF OR und AND zum Ziel komme?
Gruß Werner
Anzeige
AW: VBA if and or
12.06.2021 11:13:32
Oberschlumpf
Hi Werner,

'On Error Resume Next - vermeide ich am liebsten, weil bei Fehler im Code dieser nicht mehr gezeigt wird
'On Error GoTo 0 - wenn 1. Zeile nicht verwendet, braucht man diese Zeile auch nicht
'If (SheetIx = 0) Or _ - SheetIx ist nie = 0
'(SheetIx > 0 And Sheets(SheetIx).Name  NewName) Then - weil SheetIx immer größer 0 ist, reichen eigentlich nur diese Befehle
SheetIx = Sheets(NewName).Index 'mit diesem Befehl ist SheetIx NIE 0
If Sheets(SheetIx).Name  NewName Then
ActiveSheet.Name = NewName
End If
Hilfts?
Wenn nein, zeig bitte per Upload eine Bsp-Datei und erklär in der Datei, was wann passieren soll.
Ciao
Thorsten
Anzeige
AW: VBA if and or
12.06.2021 11:32:05
W
Hallo Thorsten.
Mit SheetIx = Sheets(NewName).Index will ich feststellen, ob es bereits ein Tabellenblatt mit dem angegebenen Namen gibt. Ohne "on Error" gibt das einen Laufzeitfehler 9.
Wenn ich SheetIx zuvor lösche, und hinterher auf 0 abfrage, dann erkenne ich, dass es ein Blatt mit dem angegeben Namen nicht gibt. Und genau diese Bedingung möchte ich jetzt in meinen "If-Konstrukt" abfragen.
Gruß Werner
Anzeige
nur ma so zwi.durch...
12.06.2021 15:19:14
Oberschlumpf
Hi Werner,
ich fragte dich zum Abschluss:
Hilfts?
Wenn nein, zeig bitte per Upload eine Bsp-Datei

Darauf eingegangen bist du aber nicht....nu ja, weiter viel Erfolg von mir...
Ciao
Ich
AW: VBA No (if and or)
12.06.2021 11:33:58
GerdL
Moin Werner!

Sub Holzhaemmerche()
Dim NewName As String, objSheet As Object
NewName = "Tabelle99"
On Error Resume Next
Set objSheet = Sheets(NewName)
On Error GoTo 0
If objSheet Is Nothing Then ActiveSheet.Name = NewName
End Sub
Gruß Gerd
Anzeige
AW: VBA No (if and or)
12.06.2021 12:02:52
W
Hallo Gerd,
mit Deinem Vorschlag hast Du lediglich von SheetIx auf objsheet umgestellt. Das Problem mit der verknüpften If-Abfrage hast Du ignoriert.
Ich möchte das Umbenennen nur durchführen, wenn es den neuen Namen noch nicht gibt, oder wenn sich die Schreibweise geändert hat (z. B. kleiner Buchstabe gegen großen Buchstaben getauscht).
Mein Problem ist nach wie vor die If-Abfrage mit "or" und "and" und nicht die Frage, wie man feststellen kann, ob es ein bestimmtes Tabellenblatt schon gibt.
Gruß Werner.
Anzeige
AW: VBA No (if and or)
12.06.2021 12:54:07
GerdL
Soso Werner! Du weist es ohne Test besser als ich. Auch ich bin dann draußen. :-)
Gruß Gerd
AW: VBA if and or
12.06.2021 11:57:08
Daniel
Hi
Deine zweite Bedingung ist doch nonsense.
Wenn ein Sheet mit diesem Namen gibt, dann hast du auch dessen Nummer der Variablen zugewiesen und nicht eine andere.
Daher einfach weglassen:

If Sheetlx = 0 then
ActiveSheet.Name = NewName
End if
Wenns nur um das nennen geht, vielleicht auch einfach so:

On Error Resume Next
ActiveSheets.Name = NewName
On Error GoTo 0
Wenn der Name schon vorhanden ist, passiert nix.
Gruß Daniel
Anzeige
AW: VBA if and or
12.06.2021 15:13:05
Firmus
Hallo Werner,
dein Code, so wie du in zeigst, muss etwas hinterfragt werden.
in deinem Code finde ich das verwirrend und fehleranfällig:
Falls der Blattname, der in newname steht, noch nicht existiert, dann
ist sheetIx = "leer" und nicht "0"
dabei gilt: "0" ist nicht größer "leer"
VBA intepretiert hier 'leer" als "0" - die genaue Regel wann VBA "leer" als "0" intepretiert (Kulanz des Interpreters), kenne ich nicht,
deshalb würde ich mit präziseren Abfragen arbeiten.
oder wenn sich die Schreibweise geändert hat (z. B. kleiner Buchstabe gegen großen Buchstaben getauscht
XLS unterscheidet bei sheetnames nicht zwischen Groß- und Kleinschreibung,
deshalb ist Blatt "xxl" und "XXL" nicht gleichzeitig möglich.
=> Woran erkennst du die Änderung der Schreibweise?
Verlässliche, nachvollziehbare Ergebnisse produziert dieser Code, angelehnt an deinen Code.

Option Explicit
Sub xx2()
On Error Resume Next
newname = "XXL"
SheetIx = Sheets(newname).Index
On Error GoTo 0
If Err.Number  0 Then
'Blatt mit Name aus newname ist nicht vorhanden
'die Buchstaben in newname können dabei in beliebiger Kombination in Groß/Kleinschreibung sein.
Else
'Blatt mit Name aus newname ist vorhanden, sheetIX zeigt dort hin.
'auch hier gilt: Die Buchstaben in newname können in beliebiger Kombination in Groß/Kleinschreibung sein.
If Sheets(SheetIx).Name  newname Then
ActiveSheet.Name = newname
'welchen Sinn macht diese Anweisung, es kann nicht verschieden sein, denn
'SheetIx = Sheets(newname).Index hat genau diesen Wert gerade ausgelesen.
'UND Groß/Kleinschreibung bei den Blattnamen, als Unterscheidungskriterium von zwei Blättern in einer Datei, ist  nicht möglich.
End If
End If
End Sub
Gruß,
Firmus
Anzeige
AW: VBA if and or
12.06.2021 16:32:46
Yal
Hallo Werner,
ich finde es wunderbare, mit welchem Einsatz Du dich das Lernen von VBA unter Excel widmest und viele deiner Frage sind berechtigt, aber in dem Fall hat dein Problem nicht mit And oder Or zu tun, sondern mit der Handhabung der Objektwerte. Genauer gesagt: eine Tabellenblatt wird nicht über den Index geprüft, ob diese den Name hat, die man sucht.
Zwei Möglichkeiten:
man geht mit einer Schleife über alle Tabellen um die Namen abzugleichen:

Function TabellenName_existiert(MeinName As String) As Boolean
Dim W
For Each W In ActiveWorkbook.Worksheets
If LCase(W.Name) = LCase(MeinName) Then
TabellenName_existiert = True
Exit Function
End If
Next
End Function
ziemlich umstandlich und eher langsam (wenn auch in dem Fall wenig relevant). Namengleichheit erfolgt in dem Fall in Kleinbuchstabe (LCase).
Besser ist ein Assigment anzustossen und zu prüfen, ob es gelungen ist (unter On Error Resume Next).

Function TabellenName_existiert(MeinName As String) As Boolean
Dim W As Worksheet
On Error Resume Next
Set W = ActiveWorkbook.Worksheets(MeinName)
TabellenName_existiert = Not (W Is Nothing)
End Function
Ziemlich straight forward, schlank und performant. So wird die Existenz von Elementenamen unter Excel geprüft.
Du gehst mit dem gesenkten Kopf gegen die Wand und sagt: ich möchte nicht, dass man mir sagt, wie man am Wand vorbei gehen kann, sondern wie man vermeidet, dass es weh tut. So ticken die Hilfer nicht.
Wenn Du mit And/Or spielen möchte, nimmt Dir das Problem von Markus an: https://www.herber.de/forum/messages/1834747.html Da ist auch nicht programmiert, wie man es machen sollte. Finde den Fehler ;-)
VG
Yal
Anzeige
AW: VBA if and or
12.06.2021 18:20:39
W
Danke an Alle, die sich an meinem Thread beteiligt haben.
1. Da der von mir gezeigte Code nur ein Ausschnitt aus dem Gesamtcode ist, fehlt natürlich die Definition von Sheetix. Diese Variable ist als Integer definiert und hat dadurch den Anfangswert 0. Somit kann diese Variable nie "leer" sein.
2. Um festzustellen, ob man sich im "richtigen" Tabellenblatt befindet, macht es schon einen Unterschied, ob das Blatt den Namen "Test" oder "test" hat. Ja klar, ich kann das auch mit UCase() prüfen!!
3. Nach einer Mustermappe zu verlangen finde ich im vorliegenden Fall als unnötig; der Code kann in jeder Mappe probiert werden, sofern er um "

Sub X()" und "End Sub
" ergänzt, und ggf. fehlende Variablen definiert werden.
4. Für mich ist weiterhin die IF-Abfrage das Problem, wobei es folgende Möglichkeiten gibt:
a: Sheetix ist 0; das gesuchte Tabellenblatt wurde nicht gefunden.
b: Sheetix ist größer 0, dann ist nur noch die Frage, ob der alte und der neue Namen identisch ist. Mit Sheetix = Sheets(Newname).Index kann ich nur feststellen, dass es den Namen ohne Rücksich auf Klein/Großschreibung gibt.
c: Wenn der alte und der neue Namen identisch ist, dann ist das in meiner Logik ein Fehler, den der Anwender gemacht hat. Und dann soll er informiert werden.
Wieso prüft Excel im OR-Zweig die AND-Bedingung, wenn die 1. OR-Bedingung (Sheetix größer 0) nicht erfüllt ist. Das ist in meinen Augen das Grund-Problem.
Ein Beispiel aus dem täglichen Leben: ich werde am Sonntag zum Baden an den See fahren, wenn die Sonne scheint: wenn der aktuelle Tag kein Sonntag ist, interessiert es auch nicht, ob die Sonne scheint. Genauswenig interessiert mich die Sonne an anderen Tagen. Das verstehe ich unter "IF" , "OR" und "AND".
Für mich ist das Thema erledigt. Ich werde das Problem durch mehrere getrennte Abfragen lösen.
Gruß Werner
Anzeige
AW: VBA if and or
12.06.2021 19:00:57
Oberschlumpf
ich habe nur bis 3. gelesen, denn...
Nach einer Mustermappe zu verlangen finde ich im vorliegenden Fall als unnötig
ähhh? DU findest die Lösung MIT Datei NICHT, erwartest aber von uns, dir OHNE Datei helfen zu können?...ähhh....finde auch hier den Fehler!
AW: VBA if and or
12.06.2021 19:49:38
Yal
Hallo Werner,
"Wieso prüft Excel im OR-Zweig die AND-Bedingung, wenn die 1. OR-Bedingung (Sheetix größer 0) nicht erfüllt ist. Das ist in meinen Augen das Grund-Problem.":
Da hast du vollkommen Recht. Die meisten Programmiersprachen haben diese Optimierung. VBA nicht.
Man muss daher 2 If nach einander implementieren.
Das ist der eigentliche Knackpunkt deiner Frage.
Eine Datei fand ich auch nicht notwendig. Aber es ist nur meine Meinung.
VG
Yal
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige

Infobox / Tutorial

VBA: If und Or kombinieren in Excel


Schritt-für-Schritt-Anleitung

Um in Excel VBA die If- und Or-Bedingungen korrekt zu kombinieren, befolge diese Schritte:

  1. Variablen deklarieren: Stelle sicher, dass alle benötigten Variablen deklariert sind. Zum Beispiel:

    Dim NewName As String
    Dim SheetIx As Integer
  2. Fehlerbehandlung aktivieren: Nutze On Error Resume Next, um Fehler zu vermeiden, wenn du auf ein nicht existierendes Tabellenblatt zugreifst:

    On Error Resume Next
    SheetIx = Sheets(NewName).Index
    On Error GoTo 0
  3. If-Bedingung schreiben: Formuliere die If-Bedingung, um sowohl die Or- als auch die And-Bedingungen zu kombinieren:

    If (SheetIx = 0) Or (SheetIx > 0 And Sheets(SheetIx).Name <> NewName) Then
       ActiveSheet.Name = NewName
    End If
  4. Ausführen und testen: Führe den Code aus und teste, ob die Bedingungen wie gewünscht funktionieren.


Häufige Fehler und Lösungen

  • Fehler: SheetIx ist 0
    Lösung: Stelle sicher, dass die Variable korrekt zugewiesen wurde. Ein Tabellenblatt mit einem Index von 0 existiert nicht.

  • Fehler: Typkonflikt
    Lösung: Überprüfe, ob die Variablen korrekt deklariert sind und ob du die richtigen Datentypen verwendest.

  • Fehler: Bedingung wird nicht erfüllt
    Lösung: Achte darauf, dass die Logik deiner Bedingungen korrekt ist. Wenn SheetIx 0 ist, wird die And-Bedingung nicht geprüft.


Alternative Methoden

  • Verwendung von Is Nothing: Statt den Index abzufragen, kannst du prüfen, ob ein Blatt mit dem gewünschten Namen existiert:

    Dim objSheet As Worksheet
    Set objSheet = Nothing
    On Error Resume Next
    Set objSheet = Sheets(NewName)
    On Error GoTo 0
    
    If objSheet Is Nothing Then
       ActiveSheet.Name = NewName
    End If
  • Schleifen verwenden: Du kannst auch eine Schleife verwenden, um über alle Tabellenblätter zu iterieren und die Namen zu vergleichen.


Praktische Beispiele

  1. Beispiel für die Umbenennung eines Blattes:

    Sub RenameSheet()
       Dim NewName As String
       NewName = "NeuerName"
       Dim SheetIx As Integer
       SheetIx = Sheets(NewName).Index
    
       If (SheetIx = 0) Or (SheetIx > 0 And Sheets(SheetIx).Name <> NewName) Then
           ActiveSheet.Name = NewName
       End If
    End Sub
  2. Beispiel zur Verwendung von If mit Or:

    Sub CheckConditions()
       Dim condition1 As Boolean
       Dim condition2 As Boolean
       condition1 = True
       condition2 = False
    
       If condition1 Or condition2 Then
           MsgBox "Mindestens eine Bedingung ist erfüllt."
       End If
    End Sub

Tipps für Profis

  • Verwende Option Explicit: Dies zwingt dich, alle Variablen zu deklarieren, was die Fehlersuche erleichtert.
  • Vermeide On Error Resume Next zu oft: Es kann die Fehlersuche erschweren, da es Fehler unterdrückt.
  • Nutze LCase() oder UCase(): Wenn du die Schreibweise von Blattnamen vergleichen möchtest, um sicherzustellen, dass die Groß- und Kleinschreibung nicht stört.

FAQ: Häufige Fragen

1. Wie kann ich mehrere Bedingungen in VBA prüfen?
Du kannst If-Anweisungen mit And und Or kombinieren, um komplexe Bedingungen zu erstellen.

2. Warum funktioniert meine If-Bedingung nicht?
Überprüfe die Logik der Bedingungen und stelle sicher, dass die Variablen korrekt deklariert und zugewiesen sind.

3. Was ist der Unterschied zwischen And und Or in VBA?
And prüft, ob beide Bedingungen wahr sind, während Or prüft, ob mindestens eine der Bedingungen wahr ist.

4. Wie kann ich sicherstellen, dass mein Code robust ist?
Nutze Fehlerbehandlung und achte darauf, alle Variablen ordnungsgemäß zu deklarieren. Verwende aussagekräftige Variablennamen, um die Lesbarkeit zu verbessern.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige