//****************************************************************
// Routines for formulas.
// Author:  Ruslan V. Neborak
// e-mail:  avemey@tut.by
// URL:     http://avemey.com
// License: zlib
// Last update: 2012.03.31
//----------------------------------------------------------------

unit zeformula;

{$I zexml.inc}
{$I compver.inc}

{$IFDEF FPC}
  {$mode objfpc}{$H+}
{$ENDIF}

interface

uses
  sysutils;  

function ZEGetA1byCol(ColNum: integer; StartZero: boolean = true): string;
function ZEGetColByA1(AA: string; StartZero: boolean = true): integer;

implementation

const
  ZE_STR_ARRAY: array [0..25] of char = ('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z');

//Возвращает номер столбца по буквенному обозначению
//INPUT
//  const AA: string      - буквенное обозначение столбцаs
//      StartZero: boolean  - если true, то счёт начинает с нуля (т.е. A = 0), в противном случае с 1.
//RETURN
//      integer -   -1 - не удалось преобразовать
function ZEGetColByA1(AA: string; StartZero: boolean = true): integer;
var
  i: integer;
  num, t, kol, s: integer;

begin
  result := -1;
  num := 0;
  t := 0;
  AA := UpperCase(AA);
  kol := length(AA);
  s := 1;
  for i := kol downto 1 do
  begin
    case AA[i] of
      'A': t :=  0;
      'B': t :=  1;
      'C': t :=  2;
      'D': t :=  3;
      'E': t :=  4;
      'F': t :=  5;
      'G': t :=  6;
      'H': t :=  7;
      'I': t :=  8;
      'J': t :=  9;
      'K': t := 10;
      'L': t := 11;
      'M': t := 12;
      'N': t := 13;
      'O': t := 14;
      'P': t := 15;
      'Q': t := 16;
      'R': t := 17;
      'S': t := 18;
      'T': t := 19;
      'U': t := 20;
      'V': t := 21;
      'W': t := 22;
      'X': t := 23;
      'Y': t := 24;
      'Z': t := 25;
      else
        exit;
    end;
    num := num + (t + 1) * s;
    s := s * 26;
  end;
  result := num;
  if (StartZero) then
    result := result - 1;
end; //ZEGetColByAA

//Возвращает буквенное обозначение столбца для АА стиля
//INPUT
//      ColNum: integer     - номер столбца
//      StartZero: boolean  - если true, то счёт начинается с 0, в противном случае - с 1.
function ZEGetA1byCol(ColNum: integer; StartZero: boolean = true): string;
var
  t, n: integer;
  s: string;

begin
  t := ColNum;
  if (not StartZero) then
    dec(t);
  result := '';
  s := '';
  while t >= 0 do
  begin
    n := t mod 26;
    t := (t div 26) - 1;
    //ХЗ как там с кодировками будет
    s := s + ZE_STR_ARRAY[n];
  end;
  for t := length(s) downto 1 do
    result := result + s[t];
end; //ZEGetAAbyCol

end.
