Как исправить перевод чисел в буквы (столбцы Excel)?

Мне необходимо иметь возможность проставления букв(английские) в зависимости от позиций в цикле т.е если 1 итерация цикла, то проставляет буква А, если 26, то буква Z. Если 27 итерация, то АА, если 28, то АВ. Если 52 итерация, то ВА и т.д. Суть, я думаю, понятна

Сделал пока следующую функцию без цикла.

procedure TForm1.btn1Click(Sender: TObject);
var
  word, word1: string;
  j: integer;
  strok: string;
begin
  word := 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  j := StrToInt(Ed1.Text);
  if j>26 then
  begin
    if (j mod 26) = 0 then
    begin
      strok := copy(word,j div 27,1) + copy(word,26,1);
    end
    else
    begin
      strok := copy(word,j div 27,1) + copy(word,j mod 26,1);
    end;
  end
  else
  begin
    strok := copy(word,j,1);
  end;
  showmessage(strok);
end;

Но есть в ней один недостаток. Если уж j = 26, то мне выдаёт Z (как и должно). Так же и если j = 52, то выдаст AZ, а должно BA. j = 78 - выдаст BZ, хотя должно CA. Как с этим бороться?


Ответы (2 шт):

Автор решения: MBo

Попробуйте такое:

  function NumToCell(n: Integer): string;
  var
    m: Integer;
  begin
    n := n - 1;
    Result := '';
    repeat
      m := n mod 26;
      Result := Chr(Ord('A') + m) + Result;
      n := n div 26 - 1;
    until n < 0;
  end;

begin
  Memo1.Lines.Add(NumToCell(1));
  Memo1.Lines.Add(NumToCell(26));
  Memo1.Lines.Add(NumToCell(27));
  Memo1.Lines.Add(NumToCell(52));
  Memo1.Lines.Add(NumToCell(53));
  Memo1.Lines.Add(NumToCell(78));
  Memo1.Lines.Add(NumToCell(78+1));
  Memo1.Lines.Add(NumToCell(78+26));
  Memo1.Lines.Add(NumToCell(25*26 + 1));
  Memo1.Lines.Add(NumToCell(25*26 + 26));
  Memo1.Lines.Add(NumToCell(26*26+1));
  Memo1.Lines.Add(NumToCell(26*26+26));
  Memo1.Lines.Add(NumToCell(26*26+26+1));

A Z   AA AZ   BA BZ  CA CZ  YA YZ  ZA ZZ  AAA 
→ Ссылка
Автор решения: Pezdrak

Как бы это глупо не звучало, но ответ был на поверхности. Достаточно было в выполнении else заменить j div 27 на 26

if j mod 26 = 0  then
 begin
  strok := copy(word,j div 27,1) + copy(word,26,1);
 end
 else
 begin
   strok := copy(word,j div 26,1) + copy(word,j mod 26,1);
 end;
→ Ссылка