Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1832to1836
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

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

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
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
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
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
Anzeige
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
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

306 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige