[Gelöst] Excel Spaltenbezeichung aus Nummern errechnen???

6. Oktober 2009 10:57

Hallo Leute

Seit 2 Stunden tüfteln hier 2 halb studierte Informatiker an einem Problem das nicht direkt was mit NAV zu tun hat ich aber dafür brauche. Ich bekomme eine Nummer übergeben und soll daraus den Buchstaben für die Spalte in Excel errechnen.

Leider klaptt das nicht so ganz weil wir nen Logikfehler haben.

Zur Zeit ist es so programmiert:

Code:
GetColumnName(pColumnNumber : Integer) retval : Text[30]
Chars:='ABCDEFGHIJKLMNOPQRSTUVWXYZ';

times1 := ROUND((pColumnNumber-1) / 702,1,'<');
IF times1 > 0 THEN
  FirstChar:=COPYSTR(Chars,times1,1)
ELSE
  FirstChar:='';

times2 := ROUND((pColumnNumber-(times1*702)-1) / 26,1,'<');
IF times2 > 0 THEN
  SecondChar:=COPYSTR(Chars,times2,1)
ELSE BEGIN
  SecondChar:='';
  IF times1 > 0 THEN
    SecondChar:= 'A'
END;


ThirdChar:=COPYSTR(Chars,pColumnNumber-(times1*702)-(times2*26),1);

retval := FirstChar+SecondChar+ThirdChar;


Problem ist das bis er bis so 1400 richtig rechnet, aber übergebe ich 16384 müsste ja XFD rauskommen aber es kommt WID raus.

Ich denke das es einfach ein Problem ist das das Zahlensystem von 26 auf 27 wechselt. Weiss nicht ob hier Logiker sind die es lösen können weil es doch etwas härtere Nuss ist.

Wenn schon jemand was fertig hat immer her damit.

Danke
Zuletzt geändert von Fishburn am 6. Oktober 2009 14:01, insgesamt 1-mal geändert.

Re: Excel Spaltenbezeichung aus Nummern errechnen???

6. Oktober 2009 11:20

Hi Fishburn,

auch wenn eure Frage damit nicht ganz geklärt wird und ich zugebe euren Code nicht wirklich gelesen zu haben, würde ich die Funktion in der Tabelle "Excel Buffer" enpfehlen. Dort wird im OnValidate() Trigger genau die gleiche Berechnung ausgeführt. Beispiel CU siehe Code. Vielleicht bringt euch das auf den Fehler.

Code:
OBJECT Codeunit 50000 Excel Column ID
{
  OBJECT-PROPERTIES
  {
    Date=06.10.09;
    Time=11:17:42;
    Modified=Yes;
    Version List=;
  }
  PROPERTIES
  {
    OnRun=BEGIN
            MESSAGE('Column Number: ' + FORMAT(16384) + ', ColumnID: ' + GetColumnName(16384));
          END;

  }
  CODE
  {

    PROCEDURE GetColumnName@1(ColumnNumber@1000 : Integer) : Text[10];
    VAR
      ExcelBuffer@1001 : Record 370;
    BEGIN
      ExcelBuffer.VALIDATE("Column No.", ColumnNumber);
      EXIT(ExcelBuffer.xlColID);
    END;

    BEGIN
    END.
  }
}

Re: Excel Spaltenbezeichung aus Nummern errechnen???

6. Oktober 2009 11:43

Hallo fishburn,

hab mal ein wenig programmiert, und das ist dabei raus gekommen. Wie der Code funktioniert müsst Ihr allerdings selbst rausfinden. :lol:
Code:
col:=16384;
div_val:= 26*26;
result_str:='   ';

FOR i:=3 DOWNTO 1 DO BEGIN
  res := (col-1) DIV div_val;
  IF (i=1) OR (res <> 0) THEN
    result_str[4-i] := 65+res-(i DIV 2);
  col -= res *div_val;
  div_val := div_val DIV 26;
END;

MESSAGE(DELCHR(result_str));


Alle Variablen sind integer bis auf resultstr, das ist eine Textvariable.

Gruß, Fiddi

Re: Excel Spaltenbezeichung aus Nummern errechnen???

6. Oktober 2009 12:10

Danke für den Code ... bei 16384 kommt sogar das richtige raus, jedoch muss z.b bei 702 rauskommen ZZ leider rechnet er da falsch ;( Keine ahnung wieso

Aber ab 703 rechnet er komplett richtig, gute Arbeit! Danke dir vielmals.

Re: [Gelöst] Excel Spaltenbezeichung aus Nummern errechnen???

6. Oktober 2009 17:33

Hallo Fishburn,

hab den Code noch mal ein bisschen überarbeitet. Sollte jetzt funktionieren, und etwas einfacher sein (Getreu der alten Regel: Fehler beseitigt man durch weglassen :wink: )

Code:
col:=16384;
result_str:='    ';

FOR i:=3 DOWNTO 1 DO BEGIN
  result_str[i] := 64+ col -((col-1) DIV 26)*26;
  col := (col-1) DIV 26;
END;

MESSAGE(DELCHR(result_str,'<>',' @'));


Bitte mal testen!


Gruß, Fiddi

Re: [Gelöst] Excel Spaltenbezeichung aus Nummern errechnen???

8. Oktober 2009 08:40

Getestet und funktioniert ... Sehr geil, wirklich gute Arbeit vor allem auf die kürze. Dürfte um einiges performater sein als unser Lösung die nur bis 702 rechnen kann.