Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

VBA: Erste 12 stellige Zahl im String suchen

VBA: Erste 12 stellige Zahl im String suchen
13.11.2013 21:29:37
Andy
Hallo zusammen,
ich benötige für eine knifflige Sache mal eure Hilfe.
Ich möchte gerne aus einem langen String die erste 12 stellige Zahl auslesen.
Bei meiner Recherche bin ich hier im Forum auf das folgenden Script gestoßen, welches mir u.a die erste Zahl aus einem String raussucht:
' Liest Zahlen aus einem String heraus ' matchNr gibt an, welcher Treffer ausgelesen werden soll Function getZahl(ByVal myStr As String, Optional ByVal matchNr As Integer = 1) Dim regEx As Object Dim Matches As Object ' https://www.herber.de/forum/archiv/1176to1180/1177805_Zahl_im_String_finden_VBA.html
Hilfestellung benötige ich bei der Bedingung auf "12 stellige Zahl".
Kann mir da jemand weiterhelfen, wie bzw. wo man das Script anpassen muss.
Gruß Andy

27
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
.Pattern = "\d{12}"
13.11.2013 21:52:50
Andy
Ich glaub, ich habe es selber rausgefunden:
.Pattern = "\d{12}"
statt
.Pattern = "[0-9]+"
Kann mir jemand das bestätigen? Was bedeutet "\d" ?

benötige doch Hilfe
13.11.2013 22:20:16
Andy
Mein erste Lösungsversuch hat doch nicht zur Lösung geführt. Aus dem folgenden String findet das Script nicht die erste 12 stellige Zahl, sondern erst die zweite:
Lorem 222259998888 ipsum dolor 123457890sit amet, conset 331122223333 etur 222257898888 sadipscing elitr, sed diam nonumy 210987654321 eirmod tempor i 222255557777 nvidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.

Anzeige
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 :-?

Anzeige
AW: benötige doch Hilfe
14.11.2013 08:02:53
Luschi
Hallo Andy,
ich habe das mit dem RegEx und dem hier gepostetem langen String sowie dem Pattern getestet und die Funktion spuckt 222259998888 aus und das ist ja wohl die 1. 12-stellige Zahl.
Im Patter bedeuted '\d' nur Ziffern wobei darunter die Zahlen im ASCII-Code aber auch Zahlen aus dem länderspezifischen Unicode verstanden werden.
Will man nur die Zahlen aus dem ASCII-Code haben, dann so:
.Pattern = "[0-9]{12}"
{12} entspricht der Anzahl von Ziffern, die als ein Bock vorkommen müssen.
Gruß von Luschi
aus klein-Paris
PS: Ein deutschsprachiges Buch zum Thema 'Reguläre Ausdrücke' (RegEx) findest Du hier:
http://www.oreilly.de/catalog/search.html?tfq=regex

Anzeige
nix VBA
13.11.2013 23:44:10
WF
Hi,
per Arrayformel:
{=TEIL(A1;VERGLEICH(WAHR;ISTZAHL(TEIL(WECHSELN(A1;" ";"#");ZEILE(1:999);12)*1);0);12)}
Salut WF

AW: VBA: Erste 12 stellige Zahl im String suchen
14.11.2013 08:47:05
bst
Auch Hallo,
das bisherige liefert M.E. aber auch immer die ersten 12 Ziffern einer mehr als 12 stelligen Zahl.
Ist das erwünscht?
cu, Bernd

Definiert 'Das Bisherige', ...
14.11.2013 17:10:42
Luc:-?
…Bernd & Matti!
Sollte darin die von mir bearbeitete UDF enthalten sein (denn sie lag ja zZp dieser Behauptung schon seit Stunden vor), ist diese Aussage definitiv falsch. Leerzeichen spielen da auch keine Rolle, wenn man das nicht aktiviert.
Gruß Luc :-?

Anzeige
Ja, so isses ... :-)
15.11.2013 00:54:47
Matthias
Guten Morgen Luc
Hatt Deine UDF noch garnicht getestet, sondern vorsorglich nur erst mal in ein Modul kopiert.
Dannach hatte ich es einfach vergessen mal zu probieren. Sorry
War mit dem Testen und der Recherche zu sehr abgelenkt und hatte dann echt nicht mehr dran gedacht.
Klappt nun aber auch bei mir ;-)
Gruß Matthias

Na siehste! ;-) Übrigens ...
15.11.2013 02:10:38
Luc:-?
…kann man die UDF noch etwas erweitern, Matti,
indem man für Arg2 auch negative Werte zulässt und die dann als TreffNr von hinten interpretiert, also bei TreffNr <= 0GetNumber = Matches(Matches.Count + TreffNr - 1) bzw GetNumber = avMCt(cix + IIf(TreffNr > 0, 0, TreffNr) - 1) schreibt.
Die von mir aus dem Original beibehaltene, auskommentierte alternative Suche inkl Leerzeichen ist eigentl überflüssig* bzw kann generell angewendet wdn, während LTrim stets völlig überflüssig sein dürfte, da führende Leerzeichen sowohl in Xl als auch VBA beim Umwandeln in eine Zahl ignoriert wdn.
Einen „Nachteil“ hat die UDF allerdings tatsächlich — sie findet nur ganze, keine DezimalZahlen. Aber das könnte man ja auch noch bei ihren Argumenten ergänzen und dann einen alternativen regAusdruck verwenden, der das berücksichtigt. Gleiches gilt übrigens auch für negative bzw imaginäre Werte und solche in ExponentialSchreibweise.
* Man wird das/sie ja kaum auch bei einer TextZahl behalten wollen, die sich solitär und ohne Fml ohnehin in eine echte verwandelt.
Gruß Luc :-?
PS: Hatte übrigens neulich auf OL das Konzept einer sich quasi selbst korrigierenden Eingabe-(Verbund-)Zelle entwickelt. Interessiert?
Besser informiert mit …

Anzeige
Interessiert? Klar immer! ...
15.11.2013 22:04:39
Matthias
Hallo Luc
Hast Du einen Link für mich, wo ich das nachlesen kann?
Gruß Matthias

Erst mal den DirektLink zu meinen beiden ...
16.11.2013 00:50:09
Luc:-?
…letzten Beiträgen dort und dann auch noch mal zum StartBeitrag, damit es verständlicher wird.
Außerdem kann ich dir auch noch meine letzte Umsetzung des Ganzen zeigen, denn die steht da nicht.
Option Explicit
Public AktKont As Boolean
Sub Senden(Von As Range, Nach As Range)
If IsMissing(Von) Or IsMissing(Nach) Then AktKont = False: Exit Sub
Nach.Value = Von.Value: AktKont = True
End Sub
Function Exec(ByVal Aktion$, ParamArray AktPm()) As Boolean
Dim txAktPm$
On Error GoTo fx
If UBound(AktPm) 
Wenn du nun 3 nebeneinanderliegende Zellen wie folgt einrichtest und dann verbindest, erhältst du eine EingabeZelle, die nur Zahlen akzeptiert, deren letzte Ziffer 0 oder 5 ist. Alle anderen wdn entsprd ab- bzw aufgerundet.
1.Zelle(A1): eigentl Eingabe → leer
2.Zelle(B1): SendeFml → =WENN(ISTLEER(A1);"";Exec("Senden";"C1";"A1"))
3.Zelle(C1): KorrekturFml → =WENN(ISTZAHL(A1);--(KÜRZEN(A1/10)+(--RECHTS(A1)>7)&WAHL(RECHTS(A1)+1;0;0;0;5;5;5;5;5;0;0));"")
Die KorrekturFml kann natürlich auch anders aussehen. ;-)
Interessant finde ich auch, was ich soeben entdeckt habe: Wird etwas Anderes als eine Zahl eingegeben, wird ein NullString erzeugt und an die EingabeZelle gesendet, wodurch die Zelle gelöscht wird (echte Leerzelle!). Ein Link auf diese Zelle zeigt dann folglich eine 0 an.
Viel Spaß & schöWE! Gruß Luc :-?

Anzeige
Erst mal Danke ich melde mich wieder owT
16.11.2013 09:46:45
Matthias

@Luc zur Entkopplung
16.11.2013 13:08:43
Erich
Hi Luc,
das finde ich ziemlich spannend, was Thomas in OL mit Evaluate gezeigt hat - und wie du das weiter verarbeitet hast. :-)
Ich habe mal versucht, die Geschichte zu reduzieren auf die Essenz - ohne Fehlerhandling und
unter Verringerung der Universalität usw. Dabei ist das hier rausgekommen:
 ABC
1115 115

Formeln der Tabelle
ZelleFormel
B1=WENN(A1="";"";ExcSend(C1;A1))
C1=WENN(ISTZAHL(A1); 5*RUNDEN(A1/5;); "")

Vom Code ist nur noch das geblieben:

Option Explicit
Sub Sende(Von As Range, Nach As Range)
Nach.Value = Von.Value
End Sub
Function ExcSend(rngV As Range, rngB As Range) As String
Evaluate "Sende(" & rngV.Address & "," & rngB.Address & ")"
End Function
Hierbei ging es mir jetzt nicht um praktische und sichere Einsetzbarkeit,
sondern nur um eine möglichst einfache Darstellung des Prinzips.
Schönes Wochenende allerseits!

Anzeige
Ja, Erich, das ist die Essenz, das Andere ...
16.11.2013 14:27:19
Luc:-?
…ist wirklich nur „Komfort-Beigabe“! ;-)
Da du ja auch den Links gefolgt bist, nehme ich an, dass du alles gelesen hast. Ich weiß nicht, ob Thomas das entwickelt oder „nur“ irgendwo entdeckt hat, dazu hat er sich ja nicht geäußert, aber auf jeden Fall scheint er das nicht weiter verfolgt zu haben.
Na ja, ich hatte bereits vor etlichen Jahren, nachdem ich meine 1.Ersatz-UDF für AUSWERTEN zum Einsatz in ZellFmln geschrieben hatte, diese auch gleich an allen möglichen FmlTexten getestet, auch welchen mit Einsatz anderer UDF. Daran, dass das dann im Ggsatz zu AUSWERTEN auch mit Subprox fktionieren könnte, hatte ich damals nicht gedacht. Durch Thomas' Beitrag ist mir das dann klar geworden, weshalb ich diese Idee auch so schnell weiter entwickeln konnte, zumal ich ja schon früher mit physischer Entkopplung experimentiert hatte, wie du wahrscheinlich weißt. Diese Versuche mit Event-Prox kann das hier zwar nicht ganz ersetzen, weil Xl so doch nicht alles mitmacht, aber soeben ist mir eine neue Idee gekommen: Man könnte das doch auch einsetzen, um relativ sicher ein Change-Event auszulösen. Dann könnte man doch irgendeine UDF mit dieser in einer Fml verbinden und hätte dadurch immer ein solches Event, in dem man eine von der erstgenannten UDF mit einem Anweisungs-String gefüllte GlobalVariable auswerten und entsprd reagieren könnte. Damit wären dann ganz ohne API-Einsatz nahezu alle Wege offen. Das sollte unbedingt fktionieren, denn ich hatte schon vor 11 Jahren mal in eine UDF etwas Vglbares, mit dem eine ganze Tabelle aus TextFeldern, quasi aus der UDF heraus (aber nur scheinbar!) erzeugt wdn konnte, eingebaut. Wenn da nicht evtl die neue xlCalcEngine einen Strich durch diese Rechnung macht.
Auf jeden Fall entstehen durch den Einsatz von UDFs auf Evaluate-Basis noch ganz andere interessante Effekte. Wende so etwas doch mal auf eine UDF an, die eine BedingtFormat-Fml ausliest! Aber eine richtige, etwas komplexere Fml mit xlFktt! Na, alles klar?! ;-)
Ich hatte mich im OL-xlVBA-Forum dieses Jahr mal nachträglich in eine Diskussion vom Vorjahr eingeklinkt — denkst du, das hätte der letzte Mitdiskutant da verstanden?! Aber das muss ja auch nicht jeder wissen, nur die, die sich wirlich daranmachen wollen, den (aus meiner Sicht) „Heiligen Xl-Gral“ zu suchen bzw den „gordischen Xl-Knoten“ zu lösen. Denn das wäre erst der Anfang, die eigentl Arbeit fängt danach an. ;-)
So, Besuch ist da, muss Schluss machen.
Ciao und dito WE, Luc :-?

Anzeige
Hallo Luc ...
16.11.2013 19:38:42
Matthias
Hallo ..
Leider könnte ich es nicht komplett umsetzen.
Erst eimal bin ich von der Möglichkeit generell sehr beeindruckt.
Das Beispiel von Thomas konnte ich umsetzen


Beim Versuch Dein Bsp. zu testen bekomme ich leider #Wert in der Formel,
Obwohl in A1 ein numerischer Wert steht, Im Bsp. steht in A1 die Zahl 22
Jetzt hatte ich erwartet das die UDF eine 20 daraus macht. Macht es aber nicht
Was mache ich falsch?
Userbild
Leigts an der ExcelVersion? Hab es mit XL2000 getestet.
Das Bsp von Erich klappt bei mir allerdings problemlos.
Gruß Matthias

Anzeige
Es wird an der Fml in B1 liegen, ...
16.11.2013 20:44:26
Luc:-?
…Matti;
in Erichs ExcSend-Fkt kannst du Ranges eingeben, während meine fürs ParamArray AdressTexte erwartet. Das hatte ich gemacht, um sie allgemeiner einsetzen zu können. Wenn du meine Fkt an entsprd Stelle um .Address ergänzt, fktioniert sie genauso wie Erichs. Oder du verwendest halt AdressTexte, was für mich keinen Anpassungsaufwand für Umkopierungen bedeuten würde, da ich bei so etwas stets mit der UDF RAddress(zellbezug) arbeite, die diesen Text erzeugt. Man könnte wohl auch ZELLE verwenden.
Man kann natürlich auch alles Mögliche ab/in Arg2 eingeben, aber dann müsste in Abhängigkeit von Arg1 und Arg2 entschieden wdn, was gemacht wird (zB If IsObject(AktPm(0))… bzw If IsError(Range(AktPm(0)))… oder If TypeName(AktPm(0)) = "Range"… o.ä.). Aber soweit wollte ich nur zur Darstellung des Prinzips nicht gehen.
Übrigens erzeuge ich die Wahrheitswerte in B1, damit darauf ggf eine BedingtFormatierung einfach aufsetzen kann. Das hatte ich für einen anderen Thread in OL, der auch auf erstgenannten verlinkt, benötigt, aber erst jetzt generell „durchgezogen“.
Gruß Luc :-?

Ich hatte da Einiges vermischt ...
18.11.2013 22:44:44
Matthias
Hallo Luc
Mann oh Mann das hat mich Nerven gekostet

Ich hatte alle 3 UDF in einer Datei und habe nicht bemerkt das ich sie "vermischt" hatte.
Sie waren zwar alle in je einem anderen Modul und getestet in je einer anderen Tabelle,
hatte aber die "Vermischung der Formeln" nicht bemerkt.
Nun habe ich das mal alles voeinander getrennt. ;-)
Und siehe da es klappt.
ABER!
Mir ist da etwas aufgefallen, was so nicht sein sollte.
Warum wird aus -3 = +5 'ich erwarte -5
Warum wird aus -9 = +10 'ich erwarte -10
-11 dagegen wird korrekt zu -10
Was mich aber echt zum Verzweifeln brachte.
A1:C1 ist verbunden
A1 ist die Eingabezelle
ohne Verbund so:
Tabelle1

 ABC
125WAHR25

Formeln der Tabelle
ZelleFormel
B1=WENN(ISTLEER(A1);"";Exec("Senden";"C1";"A1"))
C1=WENN(ISTZAHL(A1);--(KÜRZEN(A1/10)+(--RECHTS(A1)>7)&WAHL(RECHTS(A1)+1;0;0;0;5;5;5;5;5;0;0));"")


Excel Tabellen im Web darstellen >> Excel Jeanie HTML 4
nach Zellverbund so:
Nach der Eingabe von.z.B. 23 kommt wie erwartet ...
Tabelle1

 ABC
125


Excel Tabellen im Web darstellen >> Excel Jeanie HTML 4
Das klappt alles wunderbar bis ... !
... ich mir in einer separaten Zelle das Ergebnis der Formel von B1 anschauen wollte
Ich schreibe also in irgend eine Zelle der Tabelle die Formel: =B1 (in XL2000 !!!)
Ab da versagt mir die UDF ihre Dienste.
Nach Eingabe einer Zahl in A1 werden mir keinerlei Daten mehr angezeigt.
Der Test in XL2007 ergab dagegen keine Probleme.
Ich schreibe Dir das, damit Du evtl. eine Versionsprüfung in die UDF mit einpflegst.
Gruß Matthias

Bis 2012/09 habe ich immer auch xl9 ...
19.11.2013 00:46:29
Luc:-?
…verwendet, Matti;
mit dem HD-Crash war's dann damit erst mal vorbei. Seitdem wartet der Ersatz-Entwicklungs-PC (für die älteren Sachen) auf die OS-Installation… ;-)
Kann ich also zZ nicht nachvollziehen, muss warten. Aber noch ist ja daraus keine ernsthafte UniversalLösung geworden, denn auch ab Xl12 geht damit nicht alles. Aber UDFs kann man unter allen Versionen analog evaluieren, während bei SubProzeduren offensichtlich Vorsicht angeraten ist. Mitunter kommt es aber auch unter xl12 zu Irritationen beim Aufheben des Verbunds, so dass schon mal plötzlich die Fml von C1 in A1 stand, während C1 leer war. Muss also noch näher untersucht wdn.
Warum bei negativen Zahlen unter Xl9 (auch ab Xl10/12 ?) das Geschilderte passiert, kann ich also auch noch nicht sagen. Hatte deshalb ja KÜRZEN statt GANZZAHL verwendet. Aber mal sehen, schaue ich mir noch mal an.
Bis dahin, Gruß, Luc :-?

bestätige C1 < - > A1
19.11.2013 09:04:33
Matthias
Hallo Luc
so dass schon mal plötzlich die Fml von C1 in A1 stand
Kann ich bestätigen. Ist bei mir auch vorgekommen.
Na dann wünsch ich ein gutes Händchen beim weiterentwickeln :-)
Gruß Matthias

Rundungsformel
19.11.2013 09:35:52
Erich
Hi Luc und Matthias,
schaut euch doch mal die "Spezial-Rundungsformel" einfach so an - ohne Blick auf Entkopplung und verbundene Zellen...
 ABC
1-10-10-10
2-910-10
3-810-10
4-75-5

Formeln der Tabelle
ZelleFormel
B1=WENN(ISTZAHL(A1); --(KÜRZEN(A1/10)+(--RECHTS(A1)>7)&WAHL(RECHTS(A1)+1;0;0;0;5;5;5;5;5;0;0)); "")
C1=WENN(ISTZAHL(A1); 5*RUNDEN(A1/5;); "")

=WENN(ISTZAHL(A3);--(KÜRZEN(A3/10)+(--RECHTS(A3)>7)&WAHL(RECHTS(A3)+1;0;0;0;5;5;5;5;5;0;0));"")
=--(KÜRZEN(A3/10)+(--RECHTS(A3)>7)&WAHL(RECHTS(A3)+1;0;0;0;5;5;5;5;5;0;0))
=--(0)+(--RECHTS(A3)>7)&WAHL(RECHTS(A3)+1;0;0;0;5;5;5;5;5;0;0))
=--(0)+(--WAHR)&WAHL("8"+1;0;0;0;5;5;5;5;5;0;0))
=0+(1)&WAHL(9;0;0;0;5;5;5;5;5;0;0))
=0+1&0
=0+10
Ob KÜRZEN oder GANZZAHL - 0 ist 0.
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Danke ...
19.11.2013 12:16:14
Matthias
Hallo Erich
Werd mal versuchen mich da reinzudenken.
Gruß Matthias

So, habe noch mal nachgesehen und ...
20.11.2013 01:02:32
Luc:-?
…natürlich feststellen müssen, Matti & Erich,
dass sich die KorrekturFml nicht für Dezimalzahlen eignet, aber für negative Ganzzahlen sollte sie problemlos fktionieren, was sie aber leider erst ab 2 Stellen macht, 1stellig ergibt sie #WERT!.
Aber ich schrieb ja, dass sie ersetzt wdn kann (durch Besseres oder Anderes), was Erich ja auch mit Erfolg getan hat. Auf der Basis dieser Fml ist dann auch die Verwendung von rationalen Zahlen möglich, wenn man sie wie folgt erweitert:
C1:=WENN(ISTZAHL(A1); 5*RUNDEN(A1/5;WENNFEHLER(LÄNGE(A1)-SUCHEN(",";A1);0)); "")
Unter Xl9[…11] natürlich entsprd angepasst.
Ein negativer Nebeneffekt ist außerdem, dass (unter Xl12) der Wert einer auf A1 verweisenden Zelle nicht automatisch aktualisiert wird. Anscheinend bekommt Xl solche Änderungen nicht mit und es wird wohl auch nur für das reine Senden kein Change-Ereignis ausgelöst, wodurch dann wohl meine letzte Idee hinfällig wäre.
Also scheint es tatsächlich so zu sein, dass Evaluate keine normale Entkopplung bewirkt, sondern sich das alles irgendwo tief in den xl-„Eingeweiden“ abspielt (so etwas wie „xl-Bauchgrimmen“ viell… ;-]) und dadurch eine gewisse Entkopplung, allerdings mit starken Restriktionen für die Objekt- & Code-Manipulation (auch MsgBoxes, VBE-HaltePktt etc!), zustande kommt. Das könnte natürlich wg der unterschiedl CalcEngines (bis xl9 und ab xl10) schon zu etwas unterschiedl xlVerhalten führen, was die Nutzbarkeit zusätzlich einschränken mag.
Immerhin lässt sich AUSWERTEN nicht auf so etwas ein. Da das aber wohl die gleichen Grundlagen nutzt, wird das sicher von der Pgmierung verhindert. In VBA war man da wohl doch etwas „schlampiger“. Allerdings lassen sich FmlTexte mit UDFs auch problemlos AUSWERTEN.
Gruß Luc :-?
PS: Erich, bist du mal meiner Anregung bzgl BedingtFmt-Fmln gefolgt?

AW: Definiert 'Das Bisherige', ...
15.11.2013 08:37:39
bst
Morgen,
ich hatte nur die Formel und den RegExp gemeint, deine UDF hatte ich nicht probiert.
Wie dem aus sei, ich würde das trotzdem mit einem RegExp lösen ;-)
Man braucht dazu vorne einen negativen Loobehind und hinten einen negativen Lookahead.
vbscript.regexp kennt leider nur Lookaheads, deshalb geht das hier nicht so elegant wie z.B. in Perl
In vbscript.regexp funktioniert:
(?:^|\D)(\d{12})(?!\d)

liefert aber u.U. eine führende Nichtziffer mit. D.h. man muss hier den 1. Submatch benutzen.
cu, Bernd

Aha, aber mir war schon klar, dass das beinahe ...
15.11.2013 16:12:16
Luc:-?
…eine „Wissenschaft für sich“ ist, Bernd,
weshalb ich darauf auch nicht weiter eingegangen bin. ;-]
In den RegExp-Patterns würde ich dann ggf nur noch alternativ die in meiner AW an Matti genannten Fälle berücksichtigen wollen.
Gruß Luc :-?

Danke!
14.11.2013 19:07:54
Andy
Hallo zusammen,
vielen Dank erstmal für eure Unterstützung.
Ich habe die einzelne VBA Vorschläge mal getestet und festgestellt, dass für meine Zwecke nur das Script von Luc:-? einwandfrei funktioniert. Beim anderen scheitert es daran, dass grundsätzlich ein Leerzeichen vor und nach der Zahl stehen muss; das kann ich aber nicht grundsätzlich ausschließend.
Mit .Pattern = " \d{12} " kann man zwar genau die 12 stellige Zahl suchen, aber mit .Pattern = "\d{12}" können auch Zahlen größer 12 Stellen als Ergebnis angezeigt werden. Bernd hatte es in seiner Post ja auch angedeutet.
Gruß Andy

Na also, wusst' ich's doch! ;-) Gruß owT
14.11.2013 21:32:41
Luc:-?
:-?
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige
Archiv - Verwandte Themen