# teil des textes aus excel zelle auslesen



## beni83 (30. Oktober 2013)

hallo zusammen!

ich hoffe jemand kann mir helfen, ich möchte gerne einen teil des textes aus der excel zelle auslesen.

die infos sind in folgendem format:

a.b.c.d.e.f.2000.g.h...

also an  der stelle 2000 ist eine zahl zwischen 1900-2100 (jahrgang), ich möchte nun dass alles was vor dieser zahl ist ohne punkte angezeigt wird ( a b c d e f )

ich danke schon mal...

gruss

beni


----------



## Yaslaw (30. Oktober 2013)

*Step 1: *Geh in den Macroeditor
*Step 2: *Setz eine Referenz auf 'Microsoft VBScript Regulare Expression 5.5'
(in der Englischen Version: Menu->tools->References)
*Step 3: *Erstelle ein neues Modul (Menu -> Insert -> Modul)
*Step 4: *Kopier die folgende Funktion da hinein

```
Public Function abc(ByRef iCell As Range) As String
    Dim val   As String
    Dim rx As New regexp
    
    val = iCell.Value
    
    'Pattern: Selektier Alles von Anfang bis das folgende zutrifft:
    'Gefolgt von einer 1 oder 2, dann eine 9, 0 oder 1 und 2 weitere Zahlen
    'und denganzen Rest des Feldes.
    rx.Pattern = "^(.*)[12][901][\d]{2}.*$"
    If rx.test(val) Then
        'Alles vor dem Jahr extrahiren
        val = rx.Replace(val, "$1")
        'und die Punkte durch leerzeichen ersetzen
        val = Replace(val, ".", " ")
    Else
        val = "#NA"
    End If
    
    'den Wert zurückgeben (Hier ggf abc durch neuen Funktionsnamen ersetzen)
    abc = val
    
End Function
```

Jetzt kannst du im Excelsheet ganz einfach drauf zugreiffen

```
=abc(A1)
```

Der Name der Funktion kannst du noch anpassen. Nicht vergessen dass auch in der 2t letzten Zeile zu tun!


----------



## beni83 (30. Oktober 2013)

hallo yaslaw!

vielen dank für die schnelle antwort...

allerdings steht in der zelle wo ich die extrahierten daten haben will einfach "=abc(K5)"

woran kann das liegen?

gruss

ok habs in einer anderen zelle ausprobiert, komischerweise gehts dort, allerdings bekomme ich dann a b c d e f 2000 g  ....

ok habs denn so gelöst...


```
Function SUCHENNAME(myC As Excel.Range) As String
    Dim val As String
    Dim deli As String
    Dim myString As String
    Dim myStringjahr As String
    Dim myStringname As String
    Dim pos As Integer
    Dim pos2 As Integer
    Dim l_nge As Integer
    
    val = myC.Value
    l_nge = 4
    pos = 0
    
    Dim x As Byte
    
    For x = 0 To 199
        deli = (x + 1900) & ""
        pos = InStrRev(val, deli, -1)
        If pos > 1 Then
            Exit For
        End If
    Next x
    
    pos2 = pos - 1
    If pos > 1 Then
        myStringname = Mid(val, 1, pos2)
    Else
        myStringname = " "
    End If
    
    SUCHENNAME = Replace(myStringname, ".", " ")
    
End Function
```

verbesserungsvorschläge?


----------



## HonniCilest (30. Oktober 2013)

beni83 hat gesagt.:
			
		

> hallo yaslaw!
> 
> vielen dank für die schnelle antwort...
> 
> ...



Dann ist die Zelle vermutlich als Text formatiert.
Bei: Rechtsklick Zelle > Zelle formatieren... 
Kannst du dies überprüfen. Für die Formel am besten auf Standard zurücksetzen.

Was genau stimmt bei dem Ergebnis noch nicht mit dem gewünschten Ergebnis überein?

Ist die Anzahl der Punkte vor dem Jahrgang konstant?


----------



## Yaslaw (30. Oktober 2013)

beni83 hat gesagt.:
			
		

> ok habs in einer anderen zelle ausprobiert, komischerweise gehts dort, allerdings bekomme ich dann a b c d e f 2000 g  ....



Komisch. Mit dem Wert "a.b.c.d.e.f.2000.g.h..." funktioniert es bei mir perfekt. Siehe mein Excelfile im Anhang


----------



## beni83 (30. Oktober 2013)

das feld war tatsächlich als text formatiert, allerdings hatte ich über dieser spalte wo ich das ergebnis wollte ein anderes script für die suche in der spalte, ich denke dass es etwas damit zu tun hatte... ****t jetzt alles gut soweit...

danke nochmals für die hilfe... hast mir sehr geholfen


----------



## beni83 (30. Oktober 2013)

noch etwas hätte ich.... ich habe ein script mit dem ich in meiner tabelle dir zeile B2 als suchfeld definiere... der funktioniert bestens, nun wäre meine frage: 

- kann man den code so ergänzen, dass jedes mal wenn sich die eingabe im suchfeld (B2) ändert quasi die ergebnise aktualisieren, z.b. wenn ich "a" eingebe werden nur ergebnise angezeigt die "a" enthalten... dann wenn ich weiter "ab" schreibe aktualisiert sich die liste mit den ergebnissen... "abc" usw...

- ist es möglich mehrere spalten einzubinden?

hier noch der code:


```
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim sBereich As Range, sZeile As Range, sZelle As Range
  Dim such As String
  Set Target = Target.Cells(1)
  If Target.Address = "$B$2" Then
    Application.ScreenUpdating = False
    such = "*" & LCase(Target.Value) & "*"
    If such = "**" Then 'wenn nichts eingegeben wird, werden alle Zeilen eingeblendet
      Rows.Hidden = False
      Exit Sub
    End If
    Set sBereich = Me.Range("B3", Me.Range("B2").End(xlDown))
    sBereich.EntireRow.Hidden = True
    For Each sZeile In sBereich.Rows
      For Each sZelle In sZeile.Cells
        If LCase(sZelle) Like such Then
          sZeile.Hidden = False
          Exit For
        End If
      Next sZelle
    Next sZeile
    Application.Goto Cells(1), True
    Target.Activate
    Application.ScreenUpdating = True
  End If
End Sub
```

danke!


----------



## HonniCilest (31. Oktober 2013)

Was genau funktioniert im Code denn noch nicht so wie gewollt?
Was genau meinst du mit mehrere Spalten einbinden?


----------



## beni83 (31. Oktober 2013)

also 1. würde ich gerne die spalte a in die suche miteinbeziehen und 2. jedes mal wenn ich einen weiteren buchstaben reinschreibe die gefundenen begriffe aktualisiert werden...


----------

