마음의 안정을 찾기 위하여 - 엑셀의 컬럼네임을 숫자로, 숫자값을 컬럼 네임으로...
2037435
118
267
관리자새글쓰기
태그위치로그방명록
별일없다의 생각
dawnsea's me2day/2010
색상(RGB)코드 추출기(Color...
Connection Generator/2010
최승호PD, '4대강 거짓말 검...
Green Monkey**/2010
Syng의 생각
syng's me2DAY/2010
천재 작곡가 윤일상이 기획,...
엘븐킹's Digital Factory/2010
엑셀의 컬럼네임을 숫자로, 숫자값을 컬럼 네임으로...
Delphi | 2008/01/07 09:40


처음 직장다닐때, 직장 동료였떤 slypuma군이, 엑셀의 OLE Automation을 이용하여 Excel을 제어하던 도중에 컬럼명에 'A'가 들어간 컬럼을 알 수 있는 방법이 없겠느냐고 질문을 해 왔다.

OLE Automation을 이용하여 Excel의 Cell을 접근할때 영문명이 아닌, 숫자 Index값을 이용하여 접근하는 방식이기 때문에, 컬럼명을 알아야 하고, 해당 컬럼명에 'A'가 들어 있는지도 알아야 하는 2가지 문제....

사용자 삽입 이미지

'A' => Index[0] , 'B' => Index[1]......... 의 형태로 진행되고 있고 영문 A~Z까지 사용하는 형태. Index가 25가 넘어가게 되면 컬럼명은 'AA' => Index[26], 'AB' => Index[27]....의 형태로 계속해서 증가하고 있다.

엑셀의 영문 컬럼값을 숫자 Index값으로 변환하거나, 숫자 Index값을 영문 컬럼값으로 변환하는 함수를 델파이로 만들어 보았다.

현재의 함수는 2자리 영문 컬럼까지만 계산이 가능하다. 숫자 인덱스 값으로는 701까지.....
영문 컬럼 값을 숫자 인덱스로 바꾸는거는 가능한데, 숫자를 영문 컬럼값으로 바꾸는건 조금 복잡해서, 기존의 MS에서 제공하는 방식으로 함수를 구현하였고, 현재 3자리 이상의 컬럼명을 상호 변환하는 함수는 차후 다시 공개해야겠다.

아래는 해당 함수 코드이며 JAVA 버젼을 보고 Delphi 버젼으로 만든 것이다.

※ Delphi 버젼
  // Index값을 영문 컬럼네임명으로 변환하여 반환
  Function ColNumToName(ColNum : Integer) : String;
  Var
    iCycleNum  : Integer;
    iWithinNum : Integer;
  Begin
    Result := '';
    iCycleNum  := ColNum Div 26;
    iWithinNum := ColNum - (iCycleNum * 26);
    If (iCycleNum > 0) Then 
        Result := Result + Char((iCycleNum - 1) + Ord('A'));
    Result := Result + Char(iWithinNum + Ord('A'));
  End;
  // 영문 컬럼명을 숫자 Index값으로 변환하여 반환
  Function ColNameToNum(In_StrColName : String) : Integer;
  Var
    I : Integer;
  Begin
    Result := 0;
    In_StrColName := UpperCase(In_StrColName);
    For I := 1 To Length(In_StrColName) Do Begin
      Result := (Result * 26) + (Ord(In_StrColName[I]) - Ord('A') + 1);
    End;
    Dec(Result);
  End;



※ JAVA 버젼
  private int colNameToNum(final String colName)
   {
       int result  = 0;
       String  lcColName   = colName.toLowerCase();
       for (int ctr = 0; ctr < lcColName.length(); ++ ctr)
           result  = (result * 26) + (lcColName.charAt(ctr) - 'a' + 1);
       -- result;
       return (result);
   }

   private String colNumToName(int colNum)
   {
       StringBuffer    sb  = new StringBuffer();
       int cycleNum    = colNum / 26;
       int withinNum   = colNum - (cycleNum * 26);
       if (cycleNum > 0)
           sb.append((char) ((cycleNum - 1) + 'a'));
       sb.append((char) (withinNum + 'a'));
       return (sb.toString());
   }



※ VisualBasic 버젼
Function GetExcelColumn(ByVal iCellNo As Integer) As String 
    Dim iBeg, iEnd As Integer 
    ' If 1-26, then this is an easy conversion 
    If iCellNo < 27 Then 
        GetExcelColumn = Chr$(iCellNo + 64) 
    Else 
    ' Now we have to account for AA-ZZ 
        iBeg = iCellNo \ 26     ' Get the first letter 
        iEnd = iCellNo Mod 26   ' Get the second letter 
        If iEnd = 0 Then        
           ' If iEnd is 0, then it is Z, which should be 26 
            iEnd = 26 
        '** you need to subtract 1 from the initial letter otherwise your lettering will be the next letter in the alphabet
        iBeg = iBeg - 1 
        End If 
        GetExcelColumn = Chr$(iBeg + 64) & Chr$(iEnd + 64) 
    End If 
End Function

2008/01/07 09:40 2008/01/07 09:40
Article tag list Go to top
View Comment 0
Trackback URL :: 이 글에는 트랙백을 보낼 수 없습니다
From. 마음의 안정을 찾기 위하여 2008/01/07 09:56삭제
엑셀의 3자리 이상 영문명을 숫자 Index값으로 바꾸기 위한 함수 - 작업 中
엑셀의 3자리 이상 영문명을 숫자 Index값으로 바꾸기 위한 함수 작업 { 해당 숫자가 몇자리 Column Name으로 구성되어 있는가 Check } Function Loop_Num(IValue : Integer; iLevel : Integer = 1; iDigit : Single = 0) : Int..
 
 
 
 
: [1] ... [623][624][625][626][627][628][629][630][631] ... [860] :
«   2022/08   »
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      
전체 (860)
출판 준비 (0)
My-Pro... (41)
사는 ... (492)
블로그... (22)
My Lib... (32)
게임 ... (23)
개발관... (3)
Smart ... (1)
Delphi (75)
C Builder (0)
Object... (0)
VC, MF... (9)
Window... (1)
Open API (3)
Visual... (0)
Java, JSP (2)
ASP.NET (0)
PHP (4)
Database (12)
리눅스 (28)
Windows (23)
Device... (1)
Embedded (1)
게임 ... (0)
Web Se... (2)
Web, S... (19)
잡다한... (5)
프로젝트 (0)
Personal (0)
대통령... (9)
Link (2)