PDA

Vollständige Version anzeigen : String prüfen


Eschl
20.08.2017, 08:01
Guten Morgen,
den String "xx15x16xx" möchte ich in ein Array(15,16) konvertieren. Wenn man das bei "x" mit "Split" trennt, entsteht ein Array mit 5 Elementen("",15,16,"",""). Wie gelangt man zu dem Array mit 2 Elementen?
Gruß, Eschl

Storax
20.08.2017, 08:11
Vielleicht: Replace von x mit vbCrLF und dann die verbleibenden x mit "" ersetzen, dann sollte Split gehen.
Update: Das war zu "schnell" gedacht, das geht nicht!!

Luschi
20.08.2017, 08:15
Hallo Eschl,

hier mein Vorschlag:
Dim v As Variant, s As String

s = "xx15x16xx"
s = Trim(Replace(s, "x", " ", 1, -1, vbTextCompare))
v = Split(s, " ", -1, vbTextCompare)

Gruß von Luschi
aus klein-Paris

Beverly
20.08.2017, 08:18
Hi,

so vielleicht

Split(Application.Substitute("xx15x16xx", "xx", ""), "x")

<hr width="20%" align="left"><img src="http://excel-inn.de/images/grusz.gif" height=35" align="left" alt="Grußformel"><a href="http://excel-inn.de/"><img border="0" src="http://excel-inn.de/images/logo1.gif" height=35" align="middle" alt="Beverly's Excel - Inn"></a>

Storax
20.08.2017, 08:18
Danke, Luschi. genauso!!
Replace kam mir als erstes in den Sinn und dann habe ich zu "einfach" gedacht.

ransi
20.08.2017, 09:24
Hallo,

Musst einfach alles was kein x ist extrahieren.
Schau mal hier. Funktioniert mit beliebig vielen x hintereinander.
<b>Tabelle1</b><br /><br /><table border="1" cellspacing="0" cellpadding="0" style="font-family:Calibri,Arial; font-size:11pt; background-color:#ffffff; padding-left:2pt; padding-right:2pt; "> <colgroup><col style="font-weight:bold; width:30px; " /><col style="width:154px;" /><col style="width:80px;" /><col style="width:80px;" /><col style="width:80px;" /><col style="width:80px;" /><col style="width:80px;" /></colgroup><tr style="background-color:#cacaca; text-align:center; font-weight:bold; font-size:8pt; "><td >&nbsp;</td><td >A</td><td >B</td><td >C</td><td >D</td><td >E</td><td >F</td></tr><tr style="height:18px ;" ><td style="font-size:8pt; background-color:#cacaca; text-align:center; " >1</td><td >xx15x16xx</td><td style="text-align:right; ">15</td><td style="text-align:right; ">16</td><td >#BEZUG!</td><td >#BEZUG!</td><td >#BEZUG!</td></tr><tr style="height:18px ;" ><td style="font-size:8pt; background-color:#cacaca; text-align:center; " >2</td><td >xxx125dxxxx5xklxx234</td><td >125d</td><td style="text-align:right; ">5</td><td >kl</td><td style="text-align:right; ">234</td><td >#BEZUG!</td></tr><tr style="height:18px ;" ><td style="font-size:8pt; background-color:#cacaca; text-align:center; " >3</td><td >xxx</td><td >#WERT!</td><td >#WERT!</td><td >#WERT!</td><td >#WERT!</td><td >#WERT!</td></tr></table><br /><table style="font-family:Arial; font-size:10pt; border-style: groove ;border-color:#00ff00;background-color:#fffcf9; color:#000000; "><tr><td ><b>Formeln der Tabelle</b></td></tr><tr><td ><table border = "1" cellspacing="0" cellpadding="2" style="font-family:Arial; font-size:9pt;"><tr style="background-color:#cacaca; font-size:10pt;"><td >Zelle</td><td >Formel</td></tr><tr><td >B1</td><td >=INDEX(machs<span style=' color:008000; '>($A1)</span>;SPALTE<span style=' color:008000; '>(A1)</span>)</td></tr></table></td></tr></table> <br /><br /><span style="font-family:Arial; font-size:9pt; font-weight:bold;background-color:#ffffff; color:#000000; ">Excel Tabellen im Web darstellen &gt;&gt; </span><a style ="font-family:Arial; font-size:9pt; color:#fcf507; background-color:#800040; font-weight:bold;" href="http://www.excel-jeanie-html.de" target="_blank"> Excel Jeanie HTML 4 </a>


<div style="background-color:#FFFFFF; border-width:2px; border-style: groove; border-color:#ff9966; padding:4px;"><nobr><span style="font-family:Courier New,Arial; font-size:9pt ;" ><span style="color:#008000"; >' **********************************************************************</span><br /><span style="color:#008000"; >' Modul: Modul1 Typ: Allgemeines Modul</span><br /><span style="color:#008000"; >' **********************************************************************</span><br /><br /><span style="color:#000080"; >Option</span> <span style="color:#000080"; >Explicit</span><br /><br /><b><span style="color:#000080"; >Function</span> machs(strText <span style="color:#000080"; >As</span> <span style="color:#000080"; >String</span>) <span style="color:#000080"; >As</span> <span style="color:#000080"; >Variant</span></b><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >Dim</span> regex <span style="color:#000080"; >As</span> <span style="color:#000080"; >Object</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >Dim</span> objMatches <span style="color:#000080"; >As</span> <span style="color:#000080"; >Object</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >Dim</span> vntArr <span style="color:#000080"; >As</span> <span style="color:#000080"; >Variant</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >Dim</span> i <span style="color:#000080"; >As</span> <span style="color:#000080"; >Integer</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >Set</span> regex = CreateObject(<span style="color:#800000"; >"vbScript.regexp"</span>)<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >With</span> regex<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Pattern = <span style="color:#800000"; >"[^x]+"</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Global = <span style="color:#000080"; >True</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >If</span> .test(strText) = <span style="color:#000080"; >True</span> <span style="color:#000080"; >Then</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >Set</span> objMatches = .Execute(strText)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >Redim</span> vntArr(1 <span style="color:#000080"; >To</span> objMatches.Count)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >For</span> i = 1 <span style="color:#000080"; >To</span> objMatches.Count<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vntArr(i) = objMatches(i - 1)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >Next</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;machs = vntArr<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >End</span> <span style="color:#000080"; >If</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >End</span> <span style="color:#000080"; >With</span><br /><b><span style="color:#000080"; >End</span> <span style="color:#000080"; >Function</span></b><br /><br /></span></nobr></div>

ransi

Eschl
20.08.2017, 13:34
Hallo Ransi,
zunächst danke für die perfekt funktionierende Funktion.
Ich habe eine Tabelle mit 9 Zeilen und 10 Spalten. Das sind 90 Variabeln. Diese können die Ziffern 0 bis 9 und den "Füller" "x" beinhalten. Wenn alle "x" gelöscht werden, bleiben alle Zahlen von 1 bis 16. Diese Zahlen, von oben nach unten und rechts nach links gelesen, geben die genaue Folge 1 bis 16. Also zwei "benachbarte" Zahlen unterscheiden sich genau mit dem Wert 1. Die zweistelligen Zahlen stehen in jeweils zwei "Zellen". Eine Prozedur mit Deiner Funktion könnte weiterhelfen.. Ich habe selber einige Stunden investiert, komme aber nicht weiter. Falls nicht zu viel verlangt...
Beispiel für "wahr":xxx14xx15x; 1x2x3x4x5x; 8xx9x10xxxx; xxxx15xxxx; 10xxxxxxxx; 2xxxxxxxx3; Falsch:xxxxxxxxxx; x123xx54xx.
Gruß, Eschl

Fennek11
20.08.2017, 13:43
Hallo,

eine Frage an die Experten:

Warum gab es keinen Vrschlage mit RegEx?

.global = true
.pattern = "(d+)"

Dier ergint alle Zahlen im String, die dann noch auf größer geprüft werden müßten.

mfg

ransi
20.08.2017, 14:40
Hallo,

SChau mal ob dich das weiter bringt:
<b>Tabelle1</b><br /><br /><table border="1" cellspacing="0" cellpadding="0" style="font-family:Calibri,Arial; font-size:11pt; background-color:#ffffff; padding-left:2pt; padding-right:2pt; "> <colgroup><col style="font-weight:bold; width:30px; " /><col style="width:77px;" /><col style="width:77px;" /><col style="width:84px;" /><col style="width:77px;" /><col style="width:77px;" /><col style="width:77px;" /><col style="width:120px;" /><col style="width:77px;" /><col style="width:80px;" /></colgroup><tr style="background-color:#cacaca; text-align:center; font-weight:bold; font-size:8pt; "><td >&nbsp;</td><td >A</td><td >B</td><td >C</td><td >D</td><td >E</td><td >F</td><td >G</td><td >H</td><td >I</td></tr><tr style="height:18px ;" ><td style="font-size:8pt; background-color:#cacaca; text-align:center; " >5</td><td >xxx14xx15x</td><td >1x2x3x4x5x</td><td >8xx9x10xxxx</td><td >xxxx15xxxx</td><td >10xxxxx11xxx</td><td >2xxxxxxxx3</td><td >xxxxxxxxxx</td><td >x123xx54xx</td><td >&nbsp;</td></tr><tr style="height:18px ;" ><td style="font-size:8pt; background-color:#cacaca; text-align:center; " >6</td><td style="text-align:right; ">WAHR</td><td style="text-align:right; ">WAHR</td><td style="text-align:right; ">WAHR</td><td style="text-align:right; ">WAHR</td><td style="text-align:right; ">WAHR</td><td style="text-align:right; ">WAHR</td><td style="text-align:right; ">FALSCH</td><td style="text-align:right; ">FALSCH</td><td >&nbsp;</td></tr><tr style="height:18px ;" ><td style="font-size:8pt; background-color:#cacaca; text-align:center; " >7</td><td >&nbsp;</td><td >&nbsp;</td><td >&nbsp;</td><td >&nbsp;</td><td >&nbsp;</td><td >&nbsp;</td><td >&nbsp;</td><td >&nbsp;</td><td >&nbsp;</td></tr></table><br /><table style="font-family:Arial; font-size:10pt; border-style: groove ;border-color:#00ff00;background-color:#fffcf9; color:#000000; "><tr><td ><b>Formeln der Tabelle</b></td></tr><tr><td ><table border = "1" cellspacing="0" cellpadding="2" style="font-family:Arial; font-size:9pt;"><tr style="background-color:#cacaca; font-size:10pt;"><td >Zelle</td><td >Formel</td></tr><tr><td >A6</td><td >=test(A5)</td></tr></table></td></tr></table> <br /><br /><span style="font-family:Arial; font-size:9pt; font-weight:bold;background-color:#ffffff; color:#000000; ">Excel Tabellen im Web darstellen &gt;&gt; </span><a style ="font-family:Arial; font-size:9pt; color:#fcf507; background-color:#800040; font-weight:bold;" href="http://www.excel-jeanie-html.de" target="_blank"> Excel Jeanie HTML 4 </a>


<div style="background-color:#FFFFFF; border-width:2px; border-style: groove; border-color:#ff9966; padding:4px;"><nobr><span style="font-family:Courier New,Arial; font-size:9pt ;" ><b><span style="color:#000080"; >Function</span> test(strText <span style="color:#000080"; >As</span> <span style="color:#000080"; >String</span>) <span style="color:#000080"; >As</span> <span style="color:#000080"; >Boolean</span></b><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >Dim</span> regex <span style="color:#000080"; >As</span> <span style="color:#000080"; >Object</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >Dim</span> objMatches <span style="color:#000080"; >As</span> Object, objMatch <span style="color:#000080"; >As</span> <span style="color:#000080"; >Object</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >Dim</span> vntArr <span style="color:#000080"; >As</span> <span style="color:#000080"; >Variant</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >Dim</span> i <span style="color:#000080"; >As</span> <span style="color:#000080"; >Integer</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >Set</span> regex = CreateObject(<span style="color:#800000"; >"vbScript.regexp"</span>)<br />&nbsp;&nbsp;&nbsp;&nbsp;test = <span style="color:#000080"; >True</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >With</span> regex<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Pattern = <span style="color:#800000"; >"d+"</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Global = <span style="color:#000080"; >True</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >Set</span> objMatches = .Execute(strText)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >If</span> objMatches.Count = 0 <span style="color:#000080"; >Then</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test = <span style="color:#000080"; >False</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >Exit</span> <span style="color:#000080"; >Function</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >End</span> <span style="color:#000080"; >If</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >For</span> i = 1 <span style="color:#000080"; >To</span> objMatches.Count - 1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >If</span> <span style="color:#000080"; >Clng</span>(objMatches(i)) &lt;= objMatches(i - 1) <span style="color:#000080"; >Then</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test = <span style="color:#000080"; >False</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >Exit</span> <span style="color:#000080"; >Function</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >End</span> <span style="color:#000080"; >If</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >Next</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >End</span> <span style="color:#000080"; >With</span><br /><b><span style="color:#000080"; >End</span> <span style="color:#000080"; >Function</span></b><br /><br /></span></nobr></div>

ransi

Eschl
21.08.2017, 07:04
Guten Morgen,
danke für die Hilfe. Wenn ich im Direktfenster eingebe: ?test("8xx9x10xxxx") dann erscheint "Falsch". Ebenso mit den anderen von mir agegebenen "wahren" strings. Oder mache ich da was falsch?
Eschl

Fennek11
21.08.2017, 07:13
Hallo,

die Foren-Software "verschluckt" den backslash. Ungeprüft, das .Pattern müßte

"\d+"

sein. mfg

Eschl
21.08.2017, 08:44
Hallo,
?test("xxxxxxxx65") ergibt "Wahr", sollte "Falsch" sein. Der String soll die Zahlen von 1 bis 16 und den"Trenner" "x" beinhalten. Die Größe der Zahlen wächst von Zahl zur nächsten mit genau 1. "Wahr": x1x2x3x4; 10xxx11xx12; xx12x13x14xx
Eschl

EarlFred
21.08.2017, 09:54
Hallo Eschl,

ich bin mir nicht sicher, ob ich die Frage bis ins letzte Detail verstanden habe..

Teste mal:
Function prüfen(ByRef s As String) As Boolean
Dim f As Variant, i As Long, a As Long, last As Long

f = Split(s, "x")
last = -1

For i = LBound(f, 1) To UBound(f, 1)
If f(i) <> vbNullString Then
a = CLng(f(i))
If a > 0 And a <= 16 And (a - last = 1 Or last = -1) Then
last = a
Else
GoTo Nicht_Bestanden
End If
End If
Next i

prüfen = last > -1
Exit Function

Nicht_Bestanden:
prüfen = False
End Function

Grüße
EarlFred

Eschl
21.08.2017, 12:30
Hallo Earl,
das passt perfekt, also war das Them einigermaßen gut beschrieben. Vielen Dank! Es gab nicht die Möglichkeit, den Beitrag meinerseits zu bewerten.
Grüße, Eschl

EarlFred
21.08.2017, 12:38
Hallo Eschl,

also war das Them einigermaßen gut beschrieben
dank der Beispiele wurde es klarer.

Beim Fall "x123x4x5x6" (Wahr oder Falsch?) war ich nicht zu 100% sicher - also ob zwischen den Werten immer ein Trenner "x" stehen muss (dann FALSCH, da 123>16) oder ob die Zahlen auch direkt aneinander grenzen können (dann WAHR, da 1-2-3-4-5-6 immer um 1 größer als der letzte Wert) - das wäre dann noch anders zu lösen gewesen.

Es gab nicht die Möglichkeit, den Beitrag meinerseits zu bewerten.
Der Wille zählt. Danke für die Rückmeldung.

Grüße
EarlFred

Eschl
07.09.2017, 07:29
Hallo Beverly,
danke für Deinen Beitrag. Ich brauche eine Funktion, die auch für andere Strings gilt, so dass ein "normales" Array entsteht. Leider war ich mal wieder nicht genau mit der Themenbeschreibung. Beispiele von Strings:"x1xx2xxx3"; "9xxx10x11x"; "2xxxx3xxx4"; "x12xxx13xx"; "x7xx13xxx2"...eigentlich alle möglichen Kombinationen von Zahlen von 1 bis 13 und "x". Insgesamt 10 Elemente. Ob das überhaupt möglich ist?!
Gruß, Eschl

drambeldier
07.09.2017, 09:20
Moin,
"x7xx13xxx2"
vermutlich wäre die Prüfung etwas einfacher, wenn zu erkennen wäre, wo eine Zahl anfängt und wo sie aufhört. Steht da eine 13 oder sind das eine 1 und eine 3? Zahlen bestehen zwar aus Ziffern, aber nicht alle Ziffern sind auch Zahlen.

Außerdem: Warum die Prüfung zeilenweise und nicht gleich über alles?

Eschl
07.09.2017, 11:42
Hallo drambeldier,
die Zeilen sind Bestandteile eines Rasters. Wenn "über alles" geprüft wird, kann die Gesamtkette fehlerhaft sein, da die letzte Zahl einer Zeile, mit der ersten Zahl der nächsten Zeile zusammen, anstatt getrennt auftreten. Es kommen nur die "Zahlen" von 1 bis 13 zum Einsatz. Es gilt: Die Zahlen von 1 bis N(hier 13) werden vom Separator "x" getrennt. Außerdem sollen die Zahlen genau mit dem Wert 1 steigen, was in meinen Beispielen teils nicht beachtet wurde. Wollte nicht zu viel verlangen und die Arrray's, die wie angedeutet entstehen, nach Größe sortieren.
Gruß, Eschl