Ich habe mich damit auch nicht weiter befasst, ...
14.11.2013 01:02:31
Luc:-?
…Andy,
sondern einfach das Vorhandene mit traditionellen Mitteln etwas universeller gestaltet:
Rem Liest bestimmte Zahlen aus einem String heraus (Position u/o Länge)
' Arg1 ist (Bezug auf) String; Arg2 gibt auszulesenden Treffer an (0=letzter)
' Arg3 gibt TrefferLänge vor - = >= > (Default: =) - Änd/Erw: Arg2/3 - 0/letzter
' Vs2.0 -OrigPost: Yogi (2010) -Erweit: Luc (20131113n pub: dito/herber.de)
Function GetNumber(ByVal Bezug, Optional ByVal TreffNr As Integer, Optional ByVal TreffLg)
Dim isLenM As Boolean, cix As Long, avMCt As Variant, _
regEx As Object, Matches As Object, MatchIt As Object
On Error GoTo fx
If IsEmpty(Bezug) Then Err.Raise xlErrRef
TreffNr = Abs(TreffNr): isLenM = Not IsMissing(TreffLg)
Set regEx = CreateObject("Vbscript.Regexp")
With regEx
' Einfach nach Zahl suchen
.Pattern = "[0-9]+"
' Explicit nach Leerzeichen + Zahl suchen
' .Pattern = " [0-9]+"
.Global = True
Set Matches = .Execute(Bezug)
End With
If isLenM Then
If IsNumeric(TreffLg) Then TreffLg = "=" & CStr(TreffLg)
ReDim avMCt(0)
For Each MatchIt In Matches
If Evaluate(CStr(Len(MatchIt)) & TreffLg) Then
ReDim Preserve avMCt(cix): avMCt(cix) = MatchIt
cix = cix + 1
End If
If CBool(TreffNr) Then
If cix = TreffNr Then Exit For
End If
Next MatchIt
If Not MatchIt Is Nothing Or (TreffNr = 0 And CBool(cix)) Then
GetNumber = LTrim(avMCt(cix - 1))
ElseIf TreffNr = 0 And CBool(Matches.Count) Then
GetNumber = Matches(Matches.Count - 1)
Else: Err.Raise xlErrNA
End If
ElseIf CBool(TreffNr) Then
With Matches
' Fehler #NV wenn nichts gefunden oder nicht so viel
' gefunden wie/was gewünscht wird, #NULL! InternFehler
If CBool(.Count) And .Count >= TreffNr Then
GetNumber = LTrim(.Item(TreffNr - 1))
Else: Err.Raise xlErrNA
' LTrim ist nur nötig, um nach Leerzeichen+Zahl zu suchen
' anderenfalls schadet es aber auch nicht
End If
End With
ElseIf CBool(Matches.Count) Then
GetNumber = Matches(Matches.Count - 1)
Else: Err.Raise xlErrNA
End If
GoTo ex
fx: If Err.Number > xlErrNull And Err.Number
So wird auf jeden Fall die Zahl gefunden, die du gerade suchst → 1./i./n. mit/ohne LängenVgl auf =x/<x/≤x/≠x/≥x/>x, je nachdem, was du gerade benötigst. Nur im Gleich-Fall kann Arg3 als Zahl angegeben wdn, sonst nur als Text bzw Bezug auf einen solchen mit den entsprd VglsOperanden wie bei ZÄHLENWENN u.ä. xlFktt. Mit Arg2=0 findest du den letzten Wert. Willst du die Zahl als echte Zahl haben, musst du die Fml mit führendem -- (Doppelminus) notieren oder das Ergebnis mit 1 multiplizieren oder 0 addieren.
Für deinen konkreten Fall sähe die Fml (mit Ergebnis echte Zahl) so aus:
=--GetNumber(A1;1;12) falls der Text in A1 steht!
Gruß Luc :-?