Convertir un entier en nom de colonne sous Microsoft Excel

Pour un développement professionnel sous Delphi, j’ai eu besoin de pouvoir convertir un entier en nom de colonne sous Microsoft Excel (typique une série de lettre en majuscule).

Donc, j’ai fait chauffer mes petites cellules grises pour produire ceci:

function MakeExcelColumnName(AValue: integer): string;
const
  ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  DIVISEUR = 26;
begin
  Result := '';
 
  if AValue > 0 then
  begin
    if AValue <= DIVISEUR then
      Result := ALPHABET[AValue] 
    else 
    while Avalue > 0 do
    begin
      Result := ALPHABET[AValue mod DIVISEUR] + Result;
      AValue := AValue div DIVISEUR;
    end;
  end;
end;

Quelques explications sur la routine, je fait un premier test pour savoir si la valeur d’entrée est bien supérieur a zéro (vu que dans un chaine de caractères comme l’est ALPHABET) la première valeur a comme index 1.

Ensuite, le deuxième test est fait pour gagner du temps en évitant de rentrer inutilement dans la boucle WHILE DO si la valeur en entrée est inférieur ou égale a 26 (qui est bien entendu la limite maximum de la chaine ALPHABET).

La boucle finale est la pour exploiter la fonction MODULO du langage PASCAL OBJET (que l’on trouve dans Delphi ou dans LAZARUS).

Cette routine prend en entrée, un entier et le transforme en nom de colonne comme sous Microsoft Excel.

Un peu plus tard, j’ai eu besoin de faire le contraire, c’est à dire convertir un nom de colonne sous Microsoft Excel, en son équivalent entier.

Voila la routine qui prend une chaine de caractères en entrée et vous renvoi un entier:

function MakeExcelColumnIndex(const AValue: string): integer;
const
  ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  DIVISEUR = 26;
var
  LX, LP: integer;
begin
  Result := 0;
  LP     := AValue.Length - 1;
 
  for LX := 1 to AValue.Length do
  begin
    Inc(Result, Pos(AValue[LX], ALPHABET) * Trunc(Power(DIVISEUR, LP)));
    Dec(LP);
  end;
end;

La aussi, quelques explications sur l’algorithme utilisé dans cette routine.

On commence par définir la valeur de retour a zéro.

Ensuite on défini la longueur de la chaine en entrée pour servir de valeur pour la fonction qui vas élever à la puissance X (ici la variable LP) la valeur d’index d’un caractère dans le tableau ALPHABET.

Ensuite on balai la chaine de caractère en entrée pour déterminer l’index de chaque caractère que l’on vas élever à la puissance au regard de sa position.

Puis comme on parcours la chaine il faut aussi décrémenter la valeur d’élévation à la puissance à chaque calcul que l’on ajoute au résultat final.

Laisser un commentaire