461 Aufrufe
Gefragt in Tabellenkalkulation von ahorn38 Experte (3.2k Punkte)
Hallo,

ich möchte in einer Schleife eine bestimmte Zeichenfolge #92# in einem Ausdruck cells(i,5) suchen wobei, zwischen den Rauten jeweils zweistellige Zahlen stehen. Hat jemand eine Idee für den Code?

Danke und Gruß A.

14 Antworten

0 Punkte
Beantwortet von
Hallo

Nutze instr/Revinstr!

Gruß Michael
0 Punkte
Beantwortet von

Hallo Michael,

danke für deine Antwort.

Ich hatte es schon mit instr(1,cells(i,15),"#??#") versucht, das funktioniert aber nicht, weil instr keine Platzhalter akzeptiert.

Übergangsweise habe ich einen umständlichen Code erfunden, der das Problem erst mal löst, wo es aber sicher bessere Lösungen gibt:

 x = InStr(1, Cells(i, 5), "#")

  If Mid(Cells(i, 5), InStr(1, Cells(i, 5), "#") + 3, 1) = "#" Then

  y = Mid(Cells(i, 5), InStr(1, Cells(i, 5), "#") + 1, 2)

   Cells(i, 16) = "#" & y & "#"

Vlt. hat noch jemand eine Idee. Danke und Gruß A.

0 Punkte
Beantwortet von

Hallo

Oder auch Reguläre Ausdrücke!

Dessen Steuerzeichen sind auswendig zu lernen,um vernünftig arbeiten zu können!

Gruß Michael

z.b. https://www.vba-tutorial.de/applikation/regexp.htm  mit Liste der Steuerzeichen!

0 Punkte
Beantwortet von
Hallo

Cells Selectierungen führen nicht gerade zum Geschwindigkeitsrausch!

Wozu die Schleife!

Erstelle dir eigene Funktionen,die du dann mit einem Rutsch in Bereiche kopieren kannst,auswerten,Funktionen wieder löschen.

 Stichwort Hilfsspalte!

Gruß Michael
0 Punkte
Beantwortet von

Hallo

Statt Cells Zugriffe!

Gruß Michael

https://excelmacromastery.com/vba-dictionary/

+1 Punkt
Beantwortet von m-o Profi (22.7k Punkte)

Hallo Andreas,

du könntest z.B. LIKE nutzen.

Beispiel:

If Cells(i, 5).Value Like "*[#]##[#]*" Then

Damit findest du z.B. alle Zellinhalte bei denen zwei Zahlen zwischen dem # stehen.

Leider gibt es hierbei keine Möglichkeit die Position zu bestimmen, an der der Suchbegriff gefunden wurde.

Daher musst du auch hier InStr nutzen.

Ich habe mal zwei Beispielcodes erstellt, einmal nur mit InStr und einmal kombiniert. Ich gehe davon aus, dass in der 1. Zeile Überschriften stehen. Hier der Code nur mit InStr:

Sub suchen()

Dim lngLetzte As Long
Dim arrDaten As Variant
Dim i As Long
Dim lngStart As Long

lngLetzte = ActiveSheet.Cells(Rows.Count, 5).End(xlUp).Row
ReDim arrDaten(lngLetzte - 1)

arrDaten = Range(Cells(2, 5), Cells(lngLetzte, 5))

For i = LBound(arrDaten, 1) To UBound(arrDaten, 1)
  lngStart = InStr(1, arrDaten(i, 1), "#")
  If lngStart > 0 Then
    If Mid(arrDaten(i, 1), lngStart + 3, 1) = "#" Then Cells(i + 1, 16) = Mid(arrDaten(i, 1), lngStart, 4)
  End If
Next i

End Sub

Und hier die Kombination mit LIKE:

Sub suchen2()

Dim lngLetzte As Long
Dim arrDaten As Variant
Dim i As Long
Dim lngStart As Long

lngLetzte = ActiveSheet.Cells(Rows.Count, 5).End(xlUp).Row
ReDim arrDaten(lngLetzte - 1)

arrDaten = Range(Cells(2, 5), Cells(lngLetzte, 5))

For i = LBound(arrDaten, 1) To UBound(arrDaten, 1)
  If arrDaten(i, 1) Like "*[#]##[#]*" Then
    lngStart = InStr(1, arrDaten(i, 1), "#")
    If Mid(arrDaten(i, 1), lngStart + 3, 1) = "#" Then Cells(i + 1, 16) = Mid(arrDaten(i, 1), lngStart, 4)
  End If
Next i

End Sub

Gruß

M.O.

0 Punkte
Beantwortet von ahorn38 Experte (3.2k Punkte)
Hallo M.O.

super, das ist die beste Lösung!

Danke an Alle, die mir geholfen haben!

Gruß A.
0 Punkte
Beantwortet von m-o Profi (22.7k Punkte)
Hallo Andreas,

danke für die Rückmeldung.

Gruß

M.O.
0 Punkte
Beantwortet von
Hallo, noch einmal,

das klappt so gut, daß ich gleich noch ein anderes Problem anfügen möchte, über das ich mir schon den Kopf zerbrochen habe.

Gibt es eine Möglichkeit, mit instr nach der Position zu suchen an der ein string mit dem Format "T999" beginnt. Der string beginnt immer mit T gefolgt von einer immer dreistelligen Zahl, ggf.mit Vornullen (T023, T003, T573)). Auch hier stoße ich immer auf das Problem der fehlenden Platzhalter für Ziffern...

Danke und Gruß A.
+1 Punkt
Beantwortet von m-o Profi (22.7k Punkte)

Hallo Andreas,

anbei ein Beispielcode:

Sub TSuche()

Dim d As Long
Dim a As Long
Dim lngZeile As Long
Dim arrDaten As Variant
Dim strTeil As String
Dim strRest As String
Dim bGefunden As Boolean

'letzte Zeile in Spalte wird ermittelt
lngLetzte = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row

'Array für Daten wird redimensioniert - ohne Überschriftenzeile = Zeile 1
ReDim arrDaten(lngLetzte - 1)

'Einlesen ab Zeile 2 - Zeile 1 enthält Überschriften
arrDaten = Range(Cells(2, 1), Cells(lngLetzte, 1))

'Schleife zum Suchen nach
For d = LBound(arrDaten, 1) To UBound(arrDaten, 1)
  'Schalter, wenn Ausdruck gefunden auf falsch setzen
  bGefunden = False
  'Prüfen ob im String Ausdruch T gefolgt von drei Ziffern enthalten ist
  If arrDaten(d, 1) Like "*T###*" Then
    'zu prüfender Inhalt in Variable schreiben
    strRest = arrDaten(d, 1)
    Do
       'nun nach Position im String suchen
        a = InStr(1, strRest, "T")
        'ab gefundenen großen T werden 4 Zeichen in Variable geschrieben
        strTeil = Mid(strRest, a, 4)
        'Teilstring wird überprüft
        If strTeil Like "T###" Then
           'falls gefunden Schalter auf wahr setzen
           bGefunden = True
           'und gefundenen Teil in Spalte B schreiben
           Cells(d + 1, 2) = strTeil
           'sowie gefunden Position in Spalte C schreiben
           Cells(d + 1, 3) = "gefunden an Position: " & a
          Else
           'String verkürzen, damit er weiter durchsucht werden kann
            strRest = Right(strRest, Len(strRest) - a)
         End If
    Loop Until bGefunden = True
       
     
  End If

Next d

End Sub

Die Daten stehen hierbei in Spalte A und haben Überschriften. In Spalte B und C werden die Ergebnisse geschrieben. Ich gehe davon aus, dass der gesuchte String nur einmal in der Zelle enthalten ist.

Gruß

M.O.

...