Andreas: Umrechnen Zahl => Excel-Spaltenbezeichnung (A,B,C...)

Hi!

Vermutlich ist es etwas spät, aber habt Ihr ne Idee wie man eine Spalten Zahl in die Excel-Bezeichning umwandeln kann? Bis 26 ja kein Problem, aber dann geht es ja bei Excel weiter mit AA,AB...

Oder kann PERL das vielleicht auch mit irgend nem Modul automatisch?

Wie gesagt

1 => A
2 => B
...
26 => Z
27 => AA
28 => AB
...

Wer hat ne Idee?

Grüße
Andreas

  1. Halihallo Andreas

    Vermutlich ist es etwas spät

    nö, etwas früh ;-)
    G-U-T-E-N   M-O-R-G-E-N :-)))

    aber habt Ihr ne Idee wie man eine Spalten Zahl in die Excel-Bezeichning umwandeln kann? Bis 26 ja kein Problem, aber dann geht es ja bei Excel weiter mit AA,AB...

    Oder kann PERL das vielleicht auch mit irgend nem Modul automatisch?

    Hm. Also, ich hab mir folgendes überlegt:

    1 => A
    2 => B
    ...
    26 => Z
    27 => AA

    irgendwie kam mir das bekannt vor:

    1=>1
    2=>2
    ...
    10=>A
    11=>B
    ...
    15=>F
    16=>10
    ...

    oder

    1=>1
    2=>10
    3=>11
    4=>100
    ...

    Aha, Basisumwandlung: www.cpan.org => Math... Bingo:

    Math::BaseCalc:

    http://www.cpan.org/modules/by-module/Math/Math-BaseCalc-1.009.readme

    http://www.cpan.org/modules/by-module/Math/

    mit den digits ['A'..'Z'] und to_base sollte es dann funktionieren. Oder hab ich irgendwo einen Überlegungsfehler gemacht?

    -- Oh, öm, ja, natürlich -- (ja, ja, 'tschuldigung, schon früh morgens)

    26 => Z
    27 => AA (AA würde dann ja sowas wie 10 entsprechen, ist aber der logik nach 11...). Hm. Vielleicht könnte man hier dennoch etwas dran schrauben. Ach ne, dann lieber selber:

    du wüsstest doch, wie man sowas machen müsste, oder? - Das würde doch nicht allzuviel Zeit in Anspruch nehmen?

    Hm. Leider fällt mir sonst kein Modul/Methode ein, mit der man sowas machen könnte. Vielleicht gibt es intern eine Methode, wo man einen Integer Excel-kodieren lassen kann?

    Mann müsste lediglich eine Schleife machen. Dann mit dem Modulo-Operator etwas basteln und eine Codierungstabelle (einfacher Hash) erstellen.

    Viele Grüsse

    Philipp

    PS: Hoffentlich trotzdem etwas hilfreich.

  2. Wofür brauchst Du das?

    In Excel selbst kannst Du auch mit VBA direkt die Zellen adressieren.
    Du musst nur eine Function bauen.

    Hasenherz hat fast recht, Nur müsste sein Zahlensystem bei Null anfangen.

    A==0
    Z==25

    1. Moin!

      Hasenherz hat fast recht, Nur müsste sein Zahlensystem bei Null anfangen.

      Nicht wirklich...

      A==0
      Z==25

      Wenn A == 0, dann ist auch AA == 0.

      - Sven Rautenberg

      1. Nicht wirklich...

        A==0
        Z==25

        Wenn A == 0, dann ist auch AA == 0.

        • Sven Rautenberg

        Jepp! Wir haben ein Zahlensystem ohne Null!

        A==1
        Z==26

        (Excel setzt eine Grenze bei 256 Spalten, (256 < 26*26)==True)

        if zahl > 26 {
        divisionsergebnis = zahl/26
        divisionsergebnis_rund = abrunden(divisionsergebnis,0)
        ganzteil=divisionsergebnis_rund*26
        mod=zahl-ganzteil
        } else {
        ganzteil=0
        mod=zahl
        }
        Zeichen1=zeichen(ganzteil+65)
        Zeichen2=zeichen(mod+65)

        Buchstabenfolge=verketten(Zeichen1,Zeichen2)

        ***

        Programmiersprache ist imaginär :)

        fastix

        1. Ich mal wieder...

          if zahl > 26 {
          divisionsergebnis = zahl/26

          wir dividieren die Zahl

          divisionsergebnis_rund = abrunden(divisionsergebnis,0)

          runden das Ergebnis ab, ohne Kommastellen

          ganzteil=divisionsergebnis_rund*26
          Ermitten deas Produkt aus aus abgerundeter zahl (unserer ersten Stelle) und 26

          mod=zahl-ganzteil
          #Das ist der Rest der Division

          Zeichen1=zeichen(divisionsergebnis_rund+65)
          #Umkehrung von ASC()

          Zeichen2=zeichen(mod+65)
          #Umkehrung von ASC()

          } else {
          mod=zahl
          Das ist der "Rest", wenn die Zahl =< 26 ist.

          Zeichen1=""
          Und das ist die Folge...

          Zeichen2=zeichen(mod+65)
          #Kennen wir schon...
          }

          Buchstabenfolge=verketten(Zeichen1,Zeichen2)

          Immer wieder Excel :=)

          Programmiersprache ist immer noch imaginär :)

          fastix

          1. kurz zur Info, man kann im Spreadsheet::WriteExcel Modul auch Spalten über Zahlen ansprechen(0,0 entspricht A1), aber ich möchte in ein Feld eine Durchschnitt errechnen lasen, ohne vorher zu wissen wieviele Spalten das werden. Und bei der Formel AVERAGE kann ich nur die original Excel Zellenbezeichnungen verwenden.

            Danke für Eure Ansätze ich habe mir das jetzt mal so für PERL überlegt:

            @buchstaben = (A..Z);
            $divisionsergebnis = $zahl / 26;
            $divisionsrest = $zahl % 26
            if ($zahl < 26){
                $excel_zelle = $buchstaben[$divisionsrest-1];
            }
            elsif ($zahl == 26){
                $excel_zelle = "Z";
            }
            elsif ($divisionsrest = 0){
                $excel_zelle = $buchstaben[$divisionsergebnis-2];
                $excel_zelle .= "Z";
            }
            else {
                $excel_zelle = $buchstaben[$divisionsergebnis-1];
                $excel_zelle .= $buchstaben[$divisionsrest-1];
            }

            Was haltet Ihr davon?

            Grüße
            Andreas

            1. Hallo,

              Was würdest Du zu:
              use Spreadsheet::ParseExcel::Utility qw(int2col);

              print int2col($column);

              sagen;-)

              Grüße
                Klaus

              1. Hallo!

                Was würdest Du zu:
                use Spreadsheet::ParseExcel::Utility qw(int2col);

                print int2col($column);

                sagen;-)

                Das konnte auch nicht sein das es sowas nicht gibt ;-)
                Leider habe ich das modul (noch) nicht zur Verfügung - wobei - warum ParseExcel? Das müßte eigentlich egal sein, hast Recht, und das habe ich auch zur Verfügung!

                Danke Dir! So einfach kann PERL sein ;-) In PHP gäbe es sowas niemals!

                Grüße
                Andreas

                1. Hallo,

                  Das konnte auch nicht sein das es sowas nicht gibt ;-)
                  Danke Dir! So einfach kann PERL sein ;-) In PHP gäbe es sowas niemals!

                  Folgende Vorgangsweise hat sihc in der Vergangenheit als sinnvoll erwiesen, wenn man über ein neues Problem gestoßen ist:

                  1.) Nachsehen, ob Perl es nich von haus aus kann. (perldoc perlfunc)

                  2.) Nachsehen, ob es in Perl nicht einen einfahcen Weg gibt (perldoc perlfaq)

                  3.) Nachsehen, ob nicht eines der Core-Module das sowieso schon kann.
                    (Core-Module sind Module, die bei jeder Perlinstallation dabei sind)

                  4.) Nachsehen, ob eines der bereits nachinstallierten Module das nicht kann. Zur not mußt DU halt den Quelltext der Module durchforsten.

                  5.) Nachsehen, ob es nicht im CPAN ein passendes Modul gibt, das das kann. (http://search.cpan.org) CPAN umfaßt derzeit ca. 1,4 GByte an Modulen, da gibts für fast alles etwas passendes;-)

                  Nach einiger Zeit bekommt man schon ein gutes Gefühl dafür, welche der oben aufgeführten Schritte man getrost überspringen kann. Punkt 5 sollte jedoch immer ausgeführt werden, wenn man nicht vorher schon fündig geworden ist. Außer man hat Lust, das Rad neu zu erfinden;-)

                  Grüße
                    Klaus

                  1. Hallo!

                    Folgende Vorgangsweise hat sihc in der Vergangenheit als sinnvoll erwiesen, wenn man über ein neues Problem gestoßen ist:

                    1.) Nachsehen, ob Perl es nich von haus aus kann. (perldoc perlfunc)

                    So langsam finde ich mich da zu recht, ist ein wenig anmders als das PHp Manual, udn außerdem nur auf englisch, ich benuzte immer perldoc.org

                    2.) Nachsehen, ob es in Perl nicht einen einfahcen Weg gibt (perldoc perlfaq)

                    das ist noch etwas komplex für mich

                    3.) Nachsehen, ob nicht eines der Core-Module das sowieso schon kann.
                      (Core-Module sind Module, die bei jeder Perlinstallation dabei sind)

                    sind die _nicht_ bei CPAN aufgeführt? Wo gucke ich sowas am besten nach? bis jetzt verwende ich nur perldoc.org und cpan.org bzw. search.cpan.org

                    4.) Nachsehen, ob eines der bereits nachinstallierten Module das nicht kann. Zur not mußt DU halt den Quelltext der Module durchforsten.

                    das kann ich bei CPAN nachgucken.

                    5.) Nachsehen, ob es nicht im CPAN ein passendes Modul gibt, das das kann. (http://search.cpan.org) CPAN umfaßt derzeit ca. 1,4 GByte an Modulen, da gibts für fast alles etwas passendes;-)

                    Ja, das ist wirklich unglaublich, sogar ein Grafikmodul um barcode als png zu erzeugen, Wahnsinn!

                    Nach einiger Zeit bekommt man schon ein gutes Gefühl dafür, welche der oben aufgeführten Schritte man getrost überspringen kann. Punkt 5 sollte jedoch immer ausgeführt werden, wenn man nicht vorher schon fündig geworden ist. Außer man hat Lust, das Rad neu zu erfinden;-)

                    Ja, das denke ich auch, aber das ist noch ein gutes Stück, aber erst langsam beginne ich überhaupt die Mächtigkeit von PERL zu verstehen, und ich bin jedes mal aufs neue überwältigt!

                    Nochmal Danke für Eure Hilfe, so einiges habe ich schon verstanden! Vermutlich muß ich mal ein größeres Projekt anstatt in PHP in PERL durchziehen, das dumme ist nur das es dann 3 mal so lange dauert, aber irgendwann muß man wohl da durch ;-)

                    Grüße
                    Andreas

    2. Halihallo fastix

      Wofür brauchst Du das?

      Für ein Perlscript, welches eine Excel-Datei liest/schreibt mit ziemlichen horizontalen Ausmassen.

      In Excel selbst kannst Du auch mit VBA direkt die Zellen adressieren.
      Du musst nur eine Function bauen.

      Das ganze soll serverseitig geschehen, er kann keine Client/Excel-interne Funktionen verwenden.

      Hasenherz hat fast recht, Nur müsste sein Zahlensystem bei Null anfangen.

      weiss ich. Das hab ich auch mit (zugegebenermassen missverständlichen) anderen Worten gesagt. Danke, dass du es auf den Punkt bringst.

      Viele Grüsse

      Philipp Hasenherz