Clever-Excel-Forum

Normale Version: Ersetzen von Zeichen an bestimmter Stelle
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2 3
Es geht tatsächlich ausschließlich in einer Zeichenfolgenvariable, wie es ja auch in der Hilfe steht.
Dies funzt:
Code:
Dim txt
txt = String(100, "a")
Mid(txt, 15) = "b"
Debug.Print txt

Dies liefert falsch:
Code:
Debug.Print Mid(String(100, "a"), 15) = "b"

Ich bin ehrlich:
Nie gesehen, nie benutzt.

Gruß Ralf
Hallo,

es geht auch mit
Code:
cells(1,1).chracters,Insert
cells(1,1).characters.Replace


aber mein Eindruck war, dass dieser Befehl extrem langsam ist.

mfg
Hallöchen,

da wäre noch die Frage, warum das nicht funktioniert:

Debug.Print Replace(String(100, "a"), "a", "b", 5, 1)

Obwohl anscheinend laut IntelliSense festgelegt ist, dass das a erst ab Position 5 ersetzt werden soll, wird anscheinend das a an Position 1 ausgetauscht Sad

Wenn man einen kürzeren String nimmt etwas genauer hinschaut, erkennt man die unlogische Logik ...

Debug.Print Replace("abcabcabcabc", "a", "b", 2, 1)

Als Ergebnis entsteht

bcbbcabcabc

Replace lässt hier also das erste a verschwinden und ersetzt das zweite a wie gewollt durch ein b. Aber - das erste a sollte doch nicht verschwinden ...
Bei dem String 100 ist es analog. Excel lässt die ersten 4 a verschwinden und ersetzt das 5. durch ein b. Logisch, oder?  :16:

Angeblich lesen wir Herren der Schöpfung nur ungern Bedienungsanleitungen. Aber auch hier ist wieder die Hilfe gefragt:

Replace-Funktion ist eine Zeichenfolge, die an der durch Start festgelegten Position beginnt

Also geht es so:

Debug.Print Left("abcabcabcabc", 1) & Replace("abcabcabcabc", "a", "b", 2, 1)

oder etwas konsterniert vervariablisiert oder so ähnlich ...

Code:
Const strTxt$ = "abcabcabcabc"
Const lRep& = 2
Debug.Print Left(strTxt, lRep - 1) & Replace(strTxt, "a", "b", lRep, 1)

oder eben
Code:
strTxt = String(100, "a")
lRep = 15
Debug.Print Left(strTxt, lRep - 1) & Replace(strTxt, "a", "b", lRep, 1)
Hallo Andre,

darauf bin ich auch reingefallen, und hab deswegen Substitude genutzt.
Aber Uwe hat ja gezeigt, wie Replace richtig anzuwenden ist.

Aus der Hilfe:
Ausdruck.Replace(Arg1, Arg2, Arg3, Arg4)
Ausdruck   Eine Variable, die ein WorksheetFunction-Objekt darstellt.
Parameter
Name
Erforderlich/Optional
Datentyp
Beschreibung
Arg1
Erforderlich
String
Text (die Zeichenfolge), in dem (der) Sie einige Zeichen ersetzen möchten.
Arg2
Erforderlich
Double
Die Position des Zeichens in Arg1, das durch Arg4 ersetzt werden soll.
Arg3
Erforderlich
Double
Die Anzahl der Zeichen in Arg1, die von der Replace-Methode durch Arg4 ersetzt werden soll.
Arg4
Erforderlich
String
Text, der Zeichen in Arg1 ersetzen soll.


Wenn ich das nicht falsch verstehe, machst Du den Fehler dass Du Arg2 falsch besetzt? Komischerweise habe ich das auch so im Kopf.
Hallo atilla,

ich habe mich auf das direkte VBA-Replace bezogen, Uwe auf WorksheetFunction.Replace Das muss man getrennt betrachten
Es handelt sich bei der gezeigten Mid-Anwendung tatsächlich um eine reguläre Verwendung, Leute,
denn Mid gibt's ebenso wie Replace als VBA-Funktion und als -Anweisung. Allerdings funktioniert dieses Mid im Gegensatz zur zuvor getroffenen Feststellung und der Variant-Bemerkung in der VBE-Hilfe auch, nicht nur mit String-Variablen. In Fenneks Bsp handelt es sich bei txt ja auch um einen Variant, der einen String enthält. Mit Dim txt$ und Mid$ funktioniert's aber ebenfalls.
Da die Mid-Anweisung anders wirkt als die Replace-Anweisung, ist das eine sinnvolle, wenn auch offensichtlich wenig bekannte Ergänzung bzw Alternative zu letzterer.
Gruß, Castor
@Quantum
Hallöchen,
Du merkst, Deine Frage hat zu einer Diskussion geführt, die sich vielleicht tiefer mit den Grundlagen Deines Ansinnens beschäftigt, als Du gehen wolltest, ansonsten aber fachlich ok ist. Lass Dich davon nicht beirren Smile Ich denke, so ab 16:56 hatten wir es im Kasten Smile

Hallo Castor,

ich denke, es ging in der Antwort von Fennek generell um die Verwendung von Mid mit einer Variable. Siehe der zweite Code mit der Aussage ... liefert Falsch. Das ist ja letztendlich kein Fehler, sondern ein ordentliches, wenn auch unerwartetes Ergebnis. Eventuell könnte man das mit einer Funktion vergleichen, der eine Variable byRef übergeben wird. Da muss man auch eine Variable übergeben, deren Inhalt dann von der Funktion verändert wird. Die bringt aber ggf. einen Fehler, wenn was nicht passt Smile
Hallo André,

aus der Hilfe zur VBA-Replace-Funktion:

Replace(expression, find, replace[, start[, count[, compare]]])

Die Syntax der Replace-Funktion besteht aus folgenden Teilen:

start Optional. Position in expression, an der die Suche nach der untergeordneten Zeichenfolge beginnt. Wird diese Angabe ausgelassen, wird bei 1 begonnen.

Dies ist offensichtlich so gemeint, dass

MsgBox Replace(String(100, "a"), "a", "b", 5, 1)

das Gleiche ist wie

MsgBox Replace(Mid(String(100, "a"), 5), "a", "b", 1, 1)

Gruß Uwe
Hallo Uwe,

Dann ist das offensichtlich ein Unterschied zwischen den Versionen 2010 und 2016. Ich habe für meinen Beitrag die 2016 genutzt. In der Regel nutze ich diese für meine Antworten.
Hallo Uwe,

habe gerade meinen alten Laptop mit Office 2000 zum Laufen gebracht und dort Replace getestet unter 2000 ist es wie unter 2016, Replace schneidet, wie ich es aus der Hilfe zitiert habe, die vorderen Zeichen vom String ab und bginnt dann mit der programmierten Stelle im String, hier 5.

Sub test()
Debug.Print Replace("abcabcabcabcabc", "a", "x", 5, 1) 'String mit 15 Stellen
End Sub

bringt

bcxbcabcabc (11 Stellen).

HIermit wird es noch deutlicher:

Sub test()
Debug.Print Replace("abcdefghijklmno", "a", "x", 5, 1)
End Sub

bringt

efghijklmno

und ersetzt wird nix ...
Seiten: 1 2 3