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

VBA - Frage zu Instr

Forumthread: VBA - Frage zu Instr

VBA - Frage zu Instr
16.03.2026 15:39:42
Christian
Hallo, habe mal eine Frage zu meinem Codeteil

 ' --------------------------

' 6c. Neue Einträge nach Codes übertragen
' --------------------------
lastRowCodes2 = wsCodes2.Cells(wsCodes2.Rows.Count, "A").End(xlUp).Row
If wsCodes2.Cells(1, "A").Value = "" Then
startRowCodes = 1
Else
startRowCodes = lastRowCodes2 + 1
End If
counter = 0

For i = 1 To neueIdx
txtA = arrNeueEintraege(i, 1)
txtB = arrNeueEintraege(i, 2)
txtD = arrNeueEintraege(i, 4)

If txtD = "" Then GoTo NextRowCodes
If txtB > "" Then
If InStr(1, txtB, "UNKNOWN", vbTextCompare) > 0 Or _
InStr(1, txtB, "UNKNOWNS", vbTextCompare) > 0 Then GoTo NextRowCodes
End If
If txtA > "" And txtB > "" Then
If InStr(1, txtA, txtB, vbTextCompare) > 0 Then GoTo NextRowCodes
End If

counter = counter + 1
wsCodes2.Cells(startRowCodes + counter - 1, "A").Value = txtA
wsCodes2.Cells(startRowCodes + counter - 1, "B").Value = txtB
wsCodes2.Cells(startRowCodes + counter - 1, "M").Value = txtD
wsCodes2.Cells(startRowCodes + counter - 1, "C").Value = "site:www.imdb.com/title " & txtA & " " & txtB
wsCodes2.Cells(startRowCodes + counter - 1, "L").Value = "date of birth " & txtB

NextRowCodes:
Next i


eigentlich hätte mein Wunsch heißen sollen, es sollen keine Zeilen übertragen werden, in denen in Spalte B UNKNOWN oder UNKNOWNS steht, sowie Zeilen in denen der Text in Spalte A den Text in Spalte B enthält.

Jedoch prüft dieses Makro auch umgekehrt, ob der Text in Spalte B den Text in Spalte A enthält. Wie kann ich diese letzte Prüfung umgehen, sodass diese Zeilen übertragen werden?

Danke
Christian
Anzeige

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Mal ein, zwei...
16.03.2026 16:43:16
Case
Moin Christian, :-)

... Gedanken dazu: ;-)

Der Code prüft nicht beide Richtungen. ;-)
InStr wird hier so verwendet: ;-)
If InStr(1, txtA, txtB, vbTextCompare) > 0 Then GoTo NextRowCodes

Die Bedeutung von InStr(Start, String1, String2) ist: ;-)

Suche String2 in String1 - in deinem Fall also:
Kommt der Text aus Spalte B in Spalte A vor?

Beispiele:
Userbild

Der Code prüft also nicht, ob A in B enthalten ist.
Wenn es so wirkt, liegt das meist daran, dass B nur ein Teilstring von A ist (z.B. "Hanks" in "Tom Hanks"). Dann greift die Bedingung natürlich ebenfalls.

Wenn du sehen willst, welche Kombinationen tatsächlich übersprungen werden, kannst du testweise z.B. folgendes einbauen:
If InStr(1, txtA, txtB, vbTextCompare) > 0 Then

Debug.Print txtA, txtB
GoTo NextRowCodes
End If


Dann siehst du im Direktfenster, welche Werte die Bedingung auslösen.

Ohne Goto kannst du es auch so schreiben (UNKNOWNS wird damit auch erwischt):
If txtD > "" And (txtB = "" Or (InStr(1, txtB, "UNKNOWN", vbTextCompare) = 0)) And (txtA = "" Or txtB = "" Or InStr(1, txtA, txtB, vbTextCompare) = 0) Then

counter = counter + 1
wsCodes2.Cells(startRowCodes + counter - 1, "A").Value = txtA
wsCodes2.Cells(startRowCodes + counter - 1, "B").Value = txtB
wsCodes2.Cells(startRowCodes + counter - 1, "M").Value = txtD
wsCodes2.Cells(startRowCodes + counter - 1, "C").Value = "site:www.imdb.com/title " & txtA & " " & txtB
wsCodes2.Cells(startRowCodes + counter - 1, "L").Value = "date of birth " & txtB
End If

Die If eventuell auch so:
If txtD > "" And InStr(1, txtB, "UNKNOWN", vbTextCompare) = 0 And (txtB = "" Or InStr(1, txtA, txtB, vbTextCompare) = 0) Then

Ohne Beispieldatei schlecht zu testen - alles ins Blaue geschrieben. ;-)

Servus
Case
Anzeige
habe es jetzt so gelöst
16.03.2026 17:28:55
Christian
    ' --------------------------

' 6c. Neue Einträge nach Codes übertragen
' --------------------------
lastRowCodes2 = wsCodes2.Cells(wsCodes2.Rows.Count, "A").End(xlUp).Row
If wsCodes2.Cells(1, "A").Value = "" Then
startRowCodes = 1
Else
startRowCodes = lastRowCodes2 + 1
End If
counter = 0

For i = 1 To neueIdx
txtA = arrNeueEintraege(i, 1)
txtB = arrNeueEintraege(i, 2)
txtD = arrNeueEintraege(i, 4)

If txtD = "" Then GoTo NextRowCodes
If txtB > "" Then
If txtB = "UNKNOWN" Or _
txtB = "UNKNOWNS" Then GoTo NextRowCodes
End If
If txtA > "" And txtB > "" Then
If txtA Like "*" & txtB & "*" Then GoTo NextRowCodes
End If

counter = counter + 1
wsCodes2.Cells(startRowCodes + counter - 1, "A").Value = txtA
wsCodes2.Cells(startRowCodes + counter - 1, "B").Value = txtB
wsCodes2.Cells(startRowCodes + counter - 1, "M").Value = txtD
wsCodes2.Cells(startRowCodes + counter - 1, "C").Value = "site:www.imdb.com/title " & txtA & " " & txtB
wsCodes2.Cells(startRowCodes + counter - 1, "L").Value = "date of birth " & txtB

NextRowCodes:
Next i


ich weiß eure Vorschläge gingen in Richtungen ohne GoTo, aber so war es mir im Endeffekt am Liebsten.

Vielen Dank
Christian
Anzeige
Wenn du...
16.03.2026 17:54:25
Case
Moin Christian, :-)

... glücklich bist, ist alles gut. ;-)

Wenn du Like einsetzen möchtest, kannst du es auch so schreiben: ;-)
If txtB Like "UNKNOWN*" Then


Zellzugriffe sind bei vielen Einträgen langsam, dann lieber: ;-)
'....

ReDim arrOut(1 To neueIdx, 1 To 5)
counter = counter + 1
arrOut(counter, 1) = txtA
arrOut(counter, 2) = txtB
arrOut(counter, 3) = txtD
arrOut(counter, 4) = "site:www.imdb.com/title " & txtA & " " & txtB
arrOut(counter, 5) = "date of birth " & txtB
wsCodes2.Cells(startRowCodes, "A").Resize(counter, 5).Value = arrOut
'...

So ähnlich - musst du testen und eventuell auf deine Gegebenheiten anpassen. ;-)

Servus
Case
Anzeige
AW: Wenn du...
16.03.2026 18:05:41
Christian
Hallo Case,

es ging mir da auch speziell darum, entgegen dem ursprünglichen Code auf exakt UNKNOWN oder UNKNOWNS zu prüfen, dass da z.b. wenn da UNKNOWN MAN steht, das nicht mehr gefunden wird.

Gruß
Christian
AW: Das wäre dann die...
16.03.2026 18:53:05
Christian
erstmal vielen Dank, das habe ich wirklich nicht gewusst.

Aber trotzdem, auch wenn das jetzt Erbsenzählerei ist, dann würde auch UNKNOWNA oder UNKNOWNB erkannt werden, nicht nur UNKNOWNS, aber in meinem Fall funktioniert das mit der Wildcard

Gruß
Christian
Eine weitere Möglichkeit...
16.03.2026 20:25:14
Case
Moin Christian, :-)

... wäre den String per RegEx evaluieren. ;-)

Wir haben nun =, Like, InStr und RegEx: ;-)
strTMP = "UNKNOWN"

MsgBox Application.Evaluate("=REGEXTEST(" & """" & strTMP & """" & ",""^UNKNOWN(S)?$"",0)")

Oder eben strTMP = "UNKNOWNS". ;-)

Erklärung Pattern: ;-)
^ = Anfang des Strings
$ = Ende des Strings
(S)? = optional ein S am Ende

Nur der Vollständigkeit halber - und wenn wir schon beim Erbsen zählen sind. Immer bedenken - es gibt mehrere Wege (nicht nur nach Rom). ;-)

Servus
Case
Anzeige
AW: Mal ein, zwei...
16.03.2026 16:54:46
GerdL
Moin Christian!
counter = 0


For i = 1 To neueIdx
txta = arrNeueEintraege(i, 1)
txtb = arrNeueEintraege(i, 2)
txtD = arrNeueEintraege(i, 4)

If txtD > "" Then
If txtb > "" Then
If InStr(1, txtb, "UNKNOWN", vbTextCompare) > 0 Or txta Like "*" & textb & "*" Then

counter = counter + 1
wsCodes2.Cells(startRowCodes + counter - 1, "A").Value = txta
wsCodes2.Cells(startRowCodes + counter - 1, "B").Value = txtb
wsCodes2.Cells(startRowCodes + counter - 1, "M").Value = txtD
wsCodes2.Cells(startRowCodes + counter - 1, "C").Value = "site:www.imdb.com/title " & txta & " " & txtb
wsCodes2.Cells(startRowCodes + counter - 1, "L").Value = "date of birth " & txtb

End If
End If

Next i

Gruß Gerd
Anzeige
AW: Mal ein, zwei...
16.03.2026 17:15:31
Christian
Hallo Gerd,
ich frage lieber mal zuerst, bevor mir Tests alles zerschießen.
Für mich sieht es so aus, als wäre
 If InStr(1, txtb, "UNKNOWN", vbTextCompare) > 0 Or txta Like "*" & textb & "*" Then
die Bedingung, damit Texte kopiert werden, aber es soll genau umgekehrt sein, Texte sollen kopiert werden, wenn keine dieser Bedingungen erfüllt sind, sobald eine erfüllt ist, soll nicht kopiert werden

Danke
Christian
Anzeige
AW: Mal ein, zwei...
17.03.2026 08:55:39
GerdL
Moin Christian,

ach so ja die Negation ist gewollt.

If InStr(1, txtb, "UNKNOWN", vbTextCompare) = 0 And Not txta Like "*" & textb & "*" Then



Damit ist die Sprungmarke entbehrlich.

Gruß Gerd
AW: Mal ein, zwei...
17.03.2026 12:46:37
Christian
Hallo Gerd,

vielen Dank

Christian
Anzeige

Forumthreads zu verwandten Themen

Anzeige