Microsoft Excel

Das Portal zum Thema Excel-Formeln

Gruppe: Zahlensysteme - BEITRAG: Umwandlung per Matrixformel (mit Zeichenprüfung)


Aufgabe
Die Zahl eines beliebigen Zahlensystems soll per Arrayformel in eine Dezimalzahl umgewandelt werden.
Lösung
Die Zahl steht in A1
In B1 steht das Zahlensystem

Das Ergebnis
{=SUMME(B1^(ZEILE(INDIREKT("a1:a"&LÄNGE(A1)))-1)*(VERGLEICH(LINKS(RECHTS(0&A1;ZEILE(INDIREKT("a1:a"&LÄNGE(A1))));1);ZEICHEN(ZEILE(INDIREKT("1:36"))+47+(ZEILE(INDIREKT("1:36"))>10)*7);0)-1))}

Alternative von Matthias5 (15.08.2005):
{=SUMME((CODE(TEIL(A1;ZEILE(INDIREKT("1:"&LÄNGE(A1)));1))-(55-7*(ISTZAHL(TEIL(A1;ZEILE(INDIREKT("1:"&LÄNGE(A1)));1)*1))))*B1^(LÄNGE(A1)-ZEILE(INDIREKT("1:"&LÄNGE(A1)))))}

Diese Prüfformel
{=UND(VERGLEICH(MTRANS(TEIL(A1;ZEILE(INDIREKT("1:"&LÄNGE(A1)));1));ZEICHEN(ZEILE(INDIREKT("1:36"))+47+(ZEILE(INDIREKT("1:36")) > 10)*7);0)-1 < B1)}

liefert FALSCH, wenn in A1 ein unzulässiges Zeichen steht, z.B. "A" in einem 9er System.
Geprüft werden nur die Zeichen 0-9 und A-Z. Alle anderen Zeichen sind sowieso ungültig.

Wer Ergebnis UND Prüfformel in einer Formel haben möchte, schreibt
{=WENN(UND(VERGLEICH(MTRANS(TEIL(A1;ZEILE(INDIREKT("1:"&LÄNGE(A1)));1));ZEICHEN(ZEILE(INDIREKT("1:36"))+47+(ZEILE(INDIREKT("1:36")) > 10)*7);0)-1 < B1);SUMME(B1^(ZEILE(INDIREKT("a1:a"&LÄNGE(A1)))-1)*(VERGLEICH(LINKS(RECHTS(0&A1;ZEILE(INDIREKT("a1:a"&LÄNGE(A1))));1);ZEICHEN(ZEILE(INDIREKT("1:36"))+47+(ZEILE(INDIREKT("1:36"))>10)*7);0)-1));"nicht def!")}
Erläuterung
Siehe dazu auch Nr 117

In der Nr. 117 wird mit dem Array
{"0";"1";"2";"3";"4";"5";"6";"7";"8";"9";"A";"B";"C";"D";"E";"F"}
eine Hexadezimalzahl in eine Dezimalzahl umgewandelt.

Hier wird das Array mit
{=ZEICHEN(ZEILE(1:36)+47+(ZEILE(1:36)>10)*7)}
bis Z erweitert, also
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"

ZEILE(INDIREKT("1:36")) wird anstelle von ZEILE($1:$36) verwendet, damit durch Zeileneinschübe keine fehlerhaften Berechnungen ausgeführt werden.