@ > Home > Inhalt > "Binäres" statt sequentielles Ersetzen führender Füllzeichen Excel 97+

Aufgabe

Ersetze (bis zu 15) führende Nullen in einem String: A1: "000000000000000as000g". 

Lösung:

B1: =WECHSELN( WECHSELN( WECHSELN( WECHSELN( WECHSELN( "#"&A1; "#00000000"; "#"); "#0000"; "#"); "#00" ;"#") ;"#0" ;"#") ;"#";)

also "as000g". Da die Formel keine Matrixformel ist, funktioniert sie sogar bei Pocket Excel. Die vor xl2007 maximal mögliche Ausbaustufe mit 8 Verschachtelungen ermöglicht 127 zu ersetzende führende Nullen:

B1: =WECHSELN( WECHSELN( WECHSELN( WECHSELN( WECHSELN( WECHSELN( WECHSELN( WECHSELN( "#"&A1; "#0000000000000000000000000000000000000000000000000000000000000000"; "#"); "#00000000000000000000000000000000"; "#"); "#0000000000000000"; "#"); "#00000000"; "#"); "#0000"; "#"); "#00"; "#"); "#0"; "#"); "#";)

Ja, ich weiß: Man sollte lieber WIEDERHOLEN("0";64) usw. hier schreiben. Aber das ergäbe eine unzulässige 9. Verschachtelung. Achtung: Die Formel hat mindestens 277 Zeichen. Systeme mit maximal 255 Zeichen als Formel können also nur eine Stufe geringer (mit 63 Nullen) auswerten.

Statt Nullen können natürlich auch andere Füllzeichen in den Lösungen angegeben werden, genauso, wie andere Platzhalter als das "#".

Sequentielles Ersetzen (Matrixformel): http://excelformeln.de/formeln.html?welcher=331

Warum binär? Gegenüber sequentiellem Ersetzen ist theoretisch als Anzahl nur der aufgerundete Logarithmus(2) der Anzahl der Ersetzvorgänge nötig. In der Praxis versucht es die Formel (Langversion) genau 8mal, die Matrixformel genau 255mal, wobei letztere auch doppelt so viele Nullen verarbeitet. Beim Import von Massendaten mag sich die Wahl der binären Ersetzung zeitlich recht positiv auswirken. Zusammenarbeiten könnte diese Formel übrigens gut mit 0043.htm, da sie nur einmal Bezug auf A1 nimmt.

VBA-Lösung (Achtung: Bestimmt noch optimierbar):

Function NoLeadingZero(s As String) As String
  p$ = "#"
  i& = Log(Len(s)) / Log(2#)
  For j& = i& To 0 Step -1
    s = Replace(p$ & s, p$ & String(2 ^ j&, "0"), "")
  Next
  NoLeadingZero = Replace(s, p$, "")
End Function

mit B1: =NoLeadingZero(A1)