Как исправить перевод чисел в буквы (столбцы 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;