Instr verwenden

Moin Leute,

ich habe leider noch nie mit Instr gearbeitet, soweit gelesen, sollte eigentlich so gehen:

Dim Art As String
Art = Cells(zeile, 7)

Select Case Art

Case Is = InStr(1, Art, „AFPB“, 1): wert = „AFPB“
Case Is = InStr(1, Art, „AFAB“, 1): wert = „AFAB“
usw.

Die erste 1 soll doch sagen, ab welchen Zeichen in einer Zelle ich starten soll. Die zweite 1 soll definieren, das ich textlich und nicht binär suchen soll.

In den Zellen ist meist ein längerer Text als Beschreibung enthalten, in den immer mal diese Zeichenfolgen aber vorkommen.

Hab mir das ganze mit dem Debugger mal angeschaut. Leider erkennt er die Zeichen (wenn enthalten) nicht, sondern die ganze SelectCase Geschichte durch und findet nichts.

Welchen Fehler habe ich da gemacht?

Danke und VG
W3lcome

Hallo W3lcome

Probier’s mal mit " select case true".

„Select case Art“ würde nur funktionieren, wenn du den ganzen Inhalt der Variable „Art“ mit irgendwas vergleichen tätest.
Bei dir ist aber die ganze Bedingung im „case is“, dadurch ist die Variable oben nicht nur überflüssig, sondern sogar so störend, dass es gar nicht funktioniert. Da „select case“ aber unbedingt noch etwas haben will, nimmt man einfach den Wert „true“, der eigentlich in dem Fall nichts bewirkt, außer die Syntaxprüfung zu befriedigen.

Schöne Grüße
Roland

ich habe leider noch nie mit Instr gearbeitet, soweit gelesen,
sollte eigentlich so gehen:

Dim Art As String
Art = Cells(zeile, 7)

Select Case Art

Case Is = InStr(1, Art, „AFPB“, 1): wert = „AFPB“
Case Is = InStr(1, Art, „AFAB“, 1): wert = „AFAB“
usw.

Hallo w3lcome,

ich benutze zwar auch gerne Select Case wenn sich If vermeiden lässt, aber ich glaube in deinem Fall wäre eine Lösung mit if besser:

Sub durchsuchen()
 Dim Art As String

 Art = Cells(zeile, 7)
 If InStr(1, Art, "AFPB", 1) 0 Then
 wert = "AFPB"
 ElseIf InStr(1, Art, "AFAB", 1) 0 Then
 wert = "AFAB"
 ' ElseIf ...
 '
 '
 End If
End Sub

Gruß, Andreas

Hallo W3lcome,

hier noch eine Variante, die fast gleichlang bleibt im Code wenn du ansonsten sehr viele Case bzw. ElseIF Zeilen hättest:

Sub Test()
Dim Art As String, Such() As Variant, S As Integer, Wert As String
Such = Array("AFPB", "AFAB", "AFCB")
Wert = "nicht gefunden"
Art = Cells(6, 7).Value
For S = 0 To UBound(Such)
 If InStr(1, Art, Such(S), 1) Then
 Wert = Such(S)
 Exit For
 End If
Next S
MsgBox Wert
End Sub

Gruß
Reinhard

Hey Reinhard,

ein Array ist eine sehr gute Idee, das werde ich mir auf jeden Fall nochmal angucken, wenn ich mehr Zeit hab, das der Code langfristig mit Arrays arbeitet. :smile:

Arrays sind mir leider bis auf die Theorie noch ein wenig unbekannt :wink:

Viele Grüße

Super, ich danke für die Antwort.

Was mich noch interessiert, warum ist in dem Fall select case denn nicht so top. Welche Probleme ergeben sich damit?

Viele Grüße

Hallo w3lcome,

unter bestimmten Voraussetzungen gäbe es noch eine einfachere Variante. Wenn nämlich

  • die Zeichenfolge die du im String suchst immer mit „AB beginnt“,

  • dieses „AB“ im String immer nur 1x vorkommt,

  • Die Zeichenfolge, die du suchst immer genau 4 Zeichen lang ist, also „ABxx“.
    Dann könnte der Code so aussehen:

    Dim Art As String

    Art = Cells(1, 7)
    wert = Mid(Art, InStr(Art, „AB“), 4)

Gruß, Andreas

Bei Select Case hast du einen feststehenden Ausdruck, den du dann auf verschiedene Bedingungen prüfst.
In deinem Fall hast du aber keinen feststehenden Ausdruck. Dein Asudruck ist irgendwo in deinem String. Die Position musst du ja erst finden.
Etwas anderes wäre es, wenn dein Ausdruck immer an der selben Stelle im String wäre (z.B. ab Pos. 5) und immer gleich lang wäre (z.B. 4 Zeichen).

Dann könntest du so etwas machen

Select Case Mid(string, 5, 4)
 Case "ABCD"
 ' hier soll was passieren, wenn ABCD ab Pos. 5 im String steht
 Case "EFGH"
 ' hier passiert etwas für EFGH ab Pos. 5
End Select

Gruß, Andreas

Warum eigentlich mit Instr

Dim Art As String

Art = Cells(1, 7)

wert = Art Like „*AFPB *“
wert 1= Art Like „*AFAB*“

wert und wert1 gibt True oder False zurück

oder so

Dim Art As String, wert As String, wert1 As String

Art = Cells(1, 7)

Select Case True
Case Art Like „*AFPB*“
wert = Cells(1, 7)

Case Art Like „*AFAB*“
wert1 = Cells(1, 7)
End Select

wert und wert1 gibt den gesamten String zurück in dem die Zeichengruppe vorhanden ist