Avatar billede borrisholt Novice
15. april 2009 - 08:37 Der er 1 løsning

Excel kolonner, konvetere 678 --> ABC

Hej Regne Eksperter

Jeg sidder og leger med noget XML til Excel 2007. Jeg har skrevet en renge formel der kan beregne række nummeret ud fra en bogstavs angivelse fx.
ABC = 678, beregnes således :
(25^2 * 1) + (25^1 * 2)  + (25^0 * 3) = 678

Men hvordan går jeg den anden vej ?
altså finder ud af at 678 = (25^2 * 1) + (25^1 * 2)  + (25^0 * 3)

Jeg kan nemt bruteforce mig frem til den, men jeg vil hellere vide hvordan man gør det rigtigt.

Jens B
Avatar billede borrisholt Novice
15. april 2009 - 10:28 #1
Fandt selv ud af det

function ColumnToNumber(Value: string): Integer;
var
  NumIndex: Integer;
  Ch: Char;
  iC: Integer;
  Exponent: Integer;
begin
  Value := AnsiUpperCase(Value);
  Result := -1;
  NumIndex := IndexOfNumber(Value);

  if NumIndex = 0 then
    Exit;

  Delete(Value, NumIndex, MaxInt);

  Result := 0;

  while Length(Value) > 0 do
  begin
    Ch := Value[1];
    iC := (Ord(ch) - 64);
    Exponent := Length(Value) - 1;
    Result := Result + Trunc(Power(26, Exponent) * iC);
    Delete(Value, 1, 1);
  end;
end;

function NumberToColumn(Value: Integer): string;
const
  Base = 26;
var
  I, Rad: Integer;
  ColValues: array[0..Base - 1] of Char;
begin
  for I := 65 to 65 + Base - 1 do
    ColValues[I - 65] := char(I);

  Result := '';

  I := 0;

  while Value > 0 do
  begin
    Rad := Round(Value / Power(Base, I)) mod Base;
    Dec(Value, Trunc(Rad * Power(Base, I)));
    Result := ColValues[Rad - 1] + Result;
    Inc(I);
  end;
end;


Disse to funktioner er hinandens resiprokke !!

Jens B;
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester