델파이

컬럼인덱스 <-> 엑셀의 알파벳컬럼명으로 변환하기

미스터몽키 2018. 3. 22. 01:29


  델파이 스트링그리드에서 엑셀을 제어할 때 컬럼인덱스를 엑셀컬럼명 으로 변환해야할 경우가 있다. 

  1 -> A   26 -> Z   27 -> AA  등으로

  

  또는 반대의 경우도 유용하게 사용할 수 있는 함수이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function TfrmExcelRead.ColIndToAlpha(aInd: integer; aStartIndex: integer = 1): string;
var vMulti, vRest: Integer;
    s: string;
begin
// 인덱스값을 엑셀 영문컬럼명으로 반환  1->A 또는 0->A, 26->Z 또는 25->Z, 27->AA 또는 26->AA
// aStartIndex는 인덱스가 1부터 시작하는지 0부터 시작하는지, 엑셀처럼 0번째 컬럼에 행번호 사용할 경우는 1
 
  s := '';
 
  if aInd >= aStartIndex then
  begin
    aInd := aInd - aStartIndex;
    vMulti  := aInd Div 26;
    vRest   := aInd mod 26;       //aInd - (vMulti * 26);
 
    if (vMulti > 0) Then
        s := Char(Ord('A') + (vMulti - 1));   //Result +
 
    s := s + Char(Ord('A') + vRest);   // (A(65) + 나머지) 를 문자로 변경
  end;
 
  Result := s;
 
end;
cs



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function TfrmExcelRead.ColAlphaToInd(aAlpha : string; aStartIndex: integer=1) : integer;
var  i, k : Integer;
begin
// 영문컬럼명을 숫자 인덱스값으로 반환  A->1 또는 A->0 , Z->26 또는 Z-> 25, AA->27 또는 AA->26
// aStartIndex는 인덱스가 1부터 시작하는지 0부터 시작하는지, 엑셀처럼 0번째 컬럼에 행번호 사용할 경우는 1
 
    k := 0;
 
    aAlpha := UpperCase(aAlpha);
 
    for i := 1 to Length(aAlpha) do
    begin
      k := (k * 26) + (Ord(aAlpha[i]) - Ord('A') + 1);
    end;
 
    Result := k - 1 + aStartIndex;
 
end;
cs