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

Forumthread: instr und like kombinieren

instr und like kombinieren
29.06.2017 12:01:46
Florian
Hallo liebes Forum,
ich möchte in einem String jeweils die Position zurückgemeldet bekommen, an der einem "g" eine Zahl vorsteht.
Mit Like kann man mit dem Wildcard-Operator für Zahlen zumindest schonmal rausfinden, ob eine derartige Kombination im String überhaupt vorhanden ist:
meinString Like "*#g*" = true .....
gibt es einen Wildcardoperator für Zahlen, der auch mit Instr funktioniert?
instr(1, like "*#g*", vbCompareText) funktioniert jedenfalls nicht.
Vllt kann mir einer von euch weiterhelfen.
Bis hierhin schon mal vielen Dank fürs Lesen :-)
Florian
Anzeige

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: instr und like kombinieren
29.06.2017 12:51:19
Michael
Hallo!
Würde ich per Regular Expressions überprüfen:
Sub a()
Dim a$, b$, c$, d$, arr, i&
Dim Rex As Object
Set Rex = CreateObject("VBScript.RegExp")
Rex.Pattern = "\dg"
Rex.Global = True
a = "Das ist ein gString"
b = "Auch 1g String"
c = "Der 25g String"
d = "Das ist Keiner"
arr = Array(a, b, c, d)
For i = LBound(arr) To UBound(arr)
MsgBox "Teste den String [" & arr(i) & "] auf [#g]..."
If Rex.test(arr(i)) Then
MsgBox "Der String [" & arr(i) & "] enthält [#g]"
Else:
MsgBox "Der String [" & arr(i) & "] enthält KEIN [#g]"
End If
Next i
End Sub
LG
Michael
Anzeige
Ich vermute, Michael, dass das nicht das ist, ...
29.06.2017 14:05:59
Luc:-?
…was Florian bezweckt. Das Problem ist mir nämlich durchaus vertraut und RegExp kann in diesem einfachen Fall auch nicht mehr liefern als Like, aber da Instr versucht wurde, ist anzunehmen, dass die Position dieses g oder gar einer ganzen Zahl+g gesucht ist.
Tja, Florian,
das geht natürlich nicht und es gibt in VBA auch keine Fertig-Methode für so etwas. Das darfst du also selbst pgmmieren → mit Like feststellen, ob #g vorhanden und dann mit Instr jedes g oder jede Ziffer suchen und die Vorgänger bzw Nachfolger kontrollieren. So etwas habe ich in 2 UDFs gemacht, mit denen man das dann sogar in einer ZellFml feststellen könnte, bspw so:
=VLike(textbezug;"*#g*";-1) → Position von # bzw 0
=VLike(textbezug;"*#g*";1) → Position von g bzw 0
=VLike(textbezug;"*#g*") → WAHR oder FALSCH
Man könnte aber auch mit MaskOn kombinieren, zB so: =WENN(VLike(textbezug;"*#g*");MaskOn(textbezug;"num";"g"))
MaskOn: https://www.herber.de/cgi-bin/callthread.pl?index=1344962#1345181
VLike: https://www.herber.de/cgi-bin/callthread.pl?index=1247144#1247699
Letztere enthält auch Möglichkeiten, die Position zu bestimmen, falls du das selbst schreiben willst (Zeilen mit Verwendung der unpublizierten UDF VPairs wurden hier absichtl auskommentiert!).
Feedback nicht unerwünscht! Gruß, Luc :-?
Besser informiert mit …
Anzeige
Ah, dass Pos gesucht, hab ich überlesen, naja, owT
29.06.2017 14:23:40
Michael
AW: Ah, , hab ich überlesen, naja, owT
29.06.2017 15:09:43
Florian
Hi Luc,
das ist zwar nicht das was ich hören wollte, aber immerhin brauche ich es nicht mehr weiter versuchen.
Dann werde ich mir was programmieren....
schönen Tag
Florian
Ich hatte auch Vorschläge gemacht und Links ...
30.06.2017 02:48:49
Luc:-?
…geliefert, Florian,
du musst also das Rad nicht unbedingt neu erfinden… ;-]
Luc :-?
Anzeige
AW: instr und like kombinieren
29.06.2017 15:05:19
Florian
Hallo Michael,
vielen Dank für deine Antwort. Werde ich probieren.
Gehe ich zurecht davon aus, dass es bei instr keinen Platzhalter für Zahlen gibt?
Grüße
Florian
Ja, siehe v.a. auch Lucs Antwort!!! owT
29.06.2017 15:09:59
Michael
AW: instr und like kombinieren
29.06.2017 15:21:47
Daniel
Hi
nein, gibt es nicht.
da musst du schon mit einer Schleife prüfen, z.B. so:
txt = "aaa 1g bbb"
for i = 1 to len(txt) - 1
if mid(Txt, i, 2) like "#g" then Exit for
next
if i = len(txt) then i = 0

oder eben so
txt = "aaa 1g bbb"
for i = 0 to 9
i = instr(txt, x & "g")
if i > 0 then Exit for
next
das Ergebnis i ist dann anlaog einem Instr(txt, Ziffer&"g")
(wobei es kleine Unterschiede in beiden Varianten gibt, wenn es mehrere Fundstellen im Text gibt. die erste Variante findet auf jeden fall das erste Vorkommen, die zweite Variante findet das Vorkommen mit der kleinsten Zahl)
Gruß Daniel
Anzeige
AW: Basierend auf meinem ersten Code...
29.06.2017 15:50:10
Michael
...kann ein "einfaches Auszählen" auch so ablaufen - hier werden alle Positionen von "g" mit einer Ziffer davor in einem String gesammelt...
Sub a()
Const SEP$ = ","
Dim a$, b$, c$, d$, e$, arr, brr, i&, j&, s$
a = "Das ist ein gString"
b = "Auch 1g String"
c = "Der 25g String"
d = "Das ist Keiner"
e = "Da 33g größer als 22g, zwei!"
arr = Array(a, b, c, d, e)
ReDim brr(0 To UBound(arr), 1 To 2)
For i = LBound(arr) To UBound(arr)
For j = 2 To Len(arr(i))
If Mid(arr(i), j, 1) Like "g" Then
If IsNumeric(Mid(arr(i), j - 1, 1)) Then
s = s & j & SEP
End If
End If
Next j
brr(i, 1) = arr(i): brr(i, 2) = s
s = vbNullString
Next i
For i = LBound(brr) To UBound(brr)
Debug.Print "Str: " & brr(i, 1), "Pos: " & brr(i, 2)
Next i
Erase arr: Erase brr
End Sub
Du hast ja schon sehr viele Infos bekommen, aber vielleicht kannst Du das ja (auch) brauchen.
LG
Michael
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Kombination von Instr und Like in Excel VBA


Schritt-für-Schritt-Anleitung

Um in Excel VBA die Kombination von Instr und Like zu verwenden, kannst du die folgenden Schritte befolgen:

  1. Öffne den Visual Basic for Applications (VBA) Editor:

    • Drücke ALT + F11 in Excel.
  2. Erstelle ein neues Modul:

    • Rechtsklicke auf ein beliebiges Element im Projekt-Explorer und wähle Einfügen > Modul.
  3. Schreibe den VBA-Code:

    • Du kannst die Instr-Funktion in Kombination mit Like verwenden, um die Position eines bestimmten Zeichens in einem String zu finden. Hier ist ein einfaches Beispiel, das zeigt, wie man nach einer Zahl gefolgt von dem Buchstaben "g" sucht:
    Sub FindPosition()
       Dim txt As String
       Dim i As Integer
       txt = "aaa 1g bbb"
    
       For i = 1 To Len(txt) - 1
           If Mid(txt, i, 2) Like "#g" Then
               MsgBox "Gefunden an Position: " & i
               Exit For
           End If
       Next i
    End Sub
  4. Führe den Code aus:

    • Drücke F5, um das Makro auszuführen und die Position des gefundenen Strings anzuzeigen.

Häufige Fehler und Lösungen

  • Fehler: Instr funktioniert nicht mit Wildcards.

    • Lösung: Verwende Like mit Wildcards, um nach Mustern zu suchen. Instr kann keine Wildcards interpretieren.
  • Fehler: Keine Ergebnisse werden angezeigt.

    • Lösung: Überprüfe, ob der zu durchsuchende String tatsächlich das gesuchte Muster enthält. Verwende Debugging-Techniken, um den Code Schritt für Schritt zu überprüfen.

Alternative Methoden

Eine weitere Möglichkeit, die Position von Zeichen in einem String zu bestimmen, ist die Verwendung von Regulären Ausdrücken (Regular Expressions). Hier ist ein Beispiel:

Sub RegexExample()
    Dim regex As Object
    Set regex = CreateObject("VBScript.RegExp")
    regex.Pattern = "\dg"
    regex.Global = True

    Dim testString As String
    testString = "Das ist ein 1g Beispiel"

    If regex.Test(testString) Then
        MsgBox "Gefunden!"
    Else
        MsgBox "Nicht gefunden."
    End If
End Sub

Praktische Beispiele

Hier sind einige praktische Anwendungen der Instr und Like Funktionen:

  1. Finden aller "g" mit einer Zahl davor:

    Sub FindAllG()
       Dim txt As String
       Dim i As Integer
       txt = "aaa 1g bbb 2g ccc"
    
       For i = 1 To Len(txt)
           If Mid(txt, i, 1) Like "g" And IsNumeric(Mid(txt, i - 1, 1)) Then
               MsgBox "Gefunden: " & Mid(txt, i, 1) & " an Position: " & i
           End If
       Next i
    End Sub
  2. Verwendung von Instr zur Zählung von Vorkommen:

    Sub CountOccurrences()
       Dim txt As String
       Dim count As Integer
       count = 0
       txt = "1g 2g 3g"
    
       Dim pos As Integer
       pos = InStr(txt, "g")
       While pos > 0
           count = count + 1
           pos = InStr(pos + 1, txt, "g")
       Wend
    
       MsgBox "Anzahl der 'g': " & count
    End Sub

Tipps für Profis

  • Nutze InstrRev, um von hinten nach vorne zu suchen.
  • Kombiniere Instr mit Like, um spezifischere Suchen durchzuführen.
  • Wenn du viele Strings untersuchst, erwäge die Verwendung von Arrays zur Leistungsverbesserung.

FAQ: Häufige Fragen

1. Gibt es einen Platzhalter für Zahlen in Instr?
Nein, Instr unterstützt keine Wildcards. Du musst Like verwenden, um Muster mit Platzhaltern zu suchen.

2. Wie kann ich die Position des letzten Vorkommens eines Zeichens finden?
Verwende die InstrRev-Funktion, um die Suche rückwärts durchzuführen.

3. Kann ich Instr und Like in einer If-Bedingung kombinieren?
Ja, das ist möglich. Du kannst die beiden in einer If-Anweisung verwenden, um komplexe Bedingungen zu prüfen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige