Suchen einer Zahl im String

Hallo,

ich habe eine Liste mit Bezeichnungen wie
Platte 1
Platte 2
Platte 3
Platte 10
Platte 11

welche ich sortieren möchte. Bei der Sortierung steht die Platte 10 vor Platte 2.
Nun möchte ich Platte 1 ändern in Platte 01 und suche eine Funktion, die die Zahl hinter dem Wort erkennt.

In der VBA-Hilfe finde ich: Val(" 2 45 7") ’ Liefert 2457

Wenn mein String AS1=„Platte 1“ lautet, liefert mir val(AS1)=0.
Komischerweise gibt es die 0 in dem String aber nicht.
Lediglich liefert val die Zahl bei val(„10“)=10.

Muß hier noch irgendwas berücksichtigt werden, was ich hier übersehen habe?

Ich habe Excel aus Office 2010 unter Windows 7.

Für Hinweise wäre ich dankbar
Gruß
Pauli

einen String „Plattenbox 1“

Hallo Pauli,

Platte 1
Platte 2
Platte 10

welche ich sortieren möchte. Bei der Sortierung steht die
Platte 10 vor Platte 2.
Nun möchte ich Platte 1 ändern in Platte 01 und suche eine
Funktion, die die Zahl hinter dem Wort erkennt.

beschreibe bitte deine Liste genauer, steht da immer Platte,
leerzeichen, Zahl?
Oder aber unterschiedliche Wörter, leerzeichen, zahl?
Oder aber mehrere mit leerzeichen getrennte Wörter, dann
Leerzeichen, Zahl?

Wie willst du sortieren? mit Excel oder via Vba?
Annerster gefragt, reichen dir normale Excelformeln mit denen du
Platte 1 in Platte 01 oder auch Platte 001 umwandeln kannst?

In der VBA-Hilfe finde ich: Val(" 2 45 7") ’ Liefert 2457
Wenn mein String AS1=„Platte 1“ lautet, liefert mir
val(AS1)=0.
Komischerweise gibt es die 0 in dem String aber nicht.
Lediglich liefert val die Zahl bei val(„10“)=10.

Was ist dir an der Hilfe-Aussage unklar:
„Die Val-Funktion liest die Zeichen einer Zeichenfolge bis zum ersten
Zeichen, das nicht als Teil einer Zahl interpretiert werden kann“

Val fängt an, liest „P“ und hört auf. Das vorher gelesene (also nix)
hat den Wert 0.
Leerzeichen ignoriert wohl Val.

Gruß
Reinhard

Hallo Reinhard,

danke für Deine Antwort. Nein, die Liste besteht nicht nur aus dem Wort „Platte“, welches eigentlich „Plattenbox“ heißt, sondern kann auch „CD-Box“ oder „Cassettenbox“ heißen. Allen gemeinsam ist die Leerstelle hinter den Buchstaben, die ich aber manchmal aus Versehen vergessen haben könnte. Daher kam ich auf die Idee mit dem „val“, weil die VBA-Hilfe zu val aussagt „Gibt die in einer Zeichenfolge enthaltenen Zahlen als einen numerischen Wert eines geeigneten Typs zurück“
Die Sortierung läuft unter VBA. Zunächst habe ich eine ausführlichere Lösung gewählt, die auf der Leerstelle basiert:

AS1 = .Cells(i, 11).Text 'AS1 nimmt den Text auf
j = InStr(AS1, " ") 'j zeigt erste Leerstelle
If j > 0 Then 'Leerzeichen ist gefunden
AS2 = Left(AS1, j - 1) 'AS2 nimmt Text vor Leerzeichen
AS3 = Right(AS1, Len(AS1) - j) 'AS3 nimmt Zahl nach Leerstelle
If Len(AS3)

Hallo Pauli,

danke für Deine Antwort. Nein, die Liste besteht nicht nur aus
dem Wort „Platte“, welches eigentlich „Plattenbox“ heißt,
sondern kann auch „CD-Box“ oder „Cassettenbox“ heißen. Allen
gemeinsam ist die Leerstelle hinter den Buchstaben, die ich
aber manchmal aus Versehen vergessen haben könnte.

aha, im Klartext heißt das in den Zellen stehen vorn immer
ein bis mehrere Wörter und dahinter eine Zahl.
Leerzeichen als Trenner ist nicht immer da.
Ist das so?

Die Sortierung läuft unter VBA.

Okay.

Mir ist aufgefallen, daß in den VBA-Beispielen Text immer
hinter den Zahlen kommt, z.B. Val(" 44137 Dortmund").
Ich vermute deshalb, daß val in meinem Fall gar nicht
funktioniert.

Kann es gar nicht. Was ist unklar geblieben was ich schrieb?
" 44137 Dortmund" ergibt 44137
" 44137 2Dortmund" ergibt 441372
" Dortmund 44137" ergibt 0

Meine Anfrage hier bezieht sich nur darauf, ob es eine
Anweisung gibt, die die Positon der Zahl oder die Zahl selbst
sofort erkennt, ohne daß eine mehrzeilige Routine geschrieben
werden muß.

Kennst du den Unterschied zwischen Instr und Instrrev?
Das eine „arbeitet“ von links nach rechts, das andere von rechts nach
links. Was du suchst wäre eine Funktion ValRev.
Die gibt es nicht also mußte dir die selbst backen.

Natürlich wird dann die Funktion mehrzeilig sein, geht nicht
annerster.
Aber im eigentlichen Code benutzt du das genauso wie Val.

1 Like

…prima Idee, das mache ich einmal und kann dann stets darauf zurückgreifen.

schönes Wochenende
Gruß
Pauli

…prima Idee, das mache ich einmal und kann dann stets
darauf zurückgreifen.

Hallo Pauli,

wenn du nicht klar kamst:

Option Explicit

Sub test()
MsgBox RevVal("dortmund 4711")
MsgBox RevVal("dortmund 47 1 1")
MsgBox RevVal("dortmund ")
MsgBox RevVal("4711 dortmund ")
End Sub

Function RevVal(ByVal strAusdruck As String) As Integer
Dim N As Integer, strRV As String
N = Len(strAusdruck)
While InStr("0123456789 ", Mid(strAusdruck, N, 1)) \> 0 And N \> 0
 strRV = Mid(strAusdruck, N, 1) & strRV
 N = N - 1
Wend
RevVal = Val(strRV)
End Function

Gruß
Reinhard

Kleine Ergänzung
Hallo Reinhard,

für Paulis Belange ist das eine wunderschöne Funktion.

wenn du nicht klar kamst:

Option Explicit

Sub test()
MsgBox RevVal(„dortmund 4711“)
MsgBox RevVal(„dortmund 47 1 1“)
MsgBox RevVal("dortmund ")
MsgBox RevVal("4711 dortmund ")
End Sub

Function RevVal(ByVal strAusdruck As String) As Integer
Dim N As Integer, strRV As String
N = Len(strAusdruck)
While InStr("0123456789 ", Mid(strAusdruck, N, 1)) > 0 And N > 0

Wenn’s etwas allgemeiner werden soll, könnte man hier noch etwas erweitern:

While InStr("0123456789 eE.", Mid(strAusdruck, N, 1)) \> 0 And N \> 0

Aber ich gebe zu, dann wird es kompliziert, weil dann auch solche Sachen wie „E.456…“ durchkommen und an Val übergeben werden.

Gruß
Reinhard

Gruß, Andreas