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.
Autor: Klaus Kühnlein
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.