문제

이 질문에는 이미 답변이 있습니다.

열 이름은 어떻게 결정합니까(예:Excel에서 n 번째 열의 "AQ" 또는 "BH")?

편집하다:이를 결정하는 언어에 구애받지 않는 알고리즘이 여기서 주요 목표입니다.

도움이 되었습니까?

해결책

나는 정확한 작업을 수행하기 위해 다음 함수를 작성한 적이 있습니다.

public static string Column(int column)
{
    column--;
    if (column >= 0 && column < 26)
        return ((char)('A' + column)).ToString();
    else if (column > 25)
        return Column(column / 26) + Column(column % 26 + 1);
    else
        throw new Exception("Invalid Column #" + (column + 1).ToString());
}

다른 팁

여기가 제일 깨끗해요 옳은 내가 생각해낼 수 있는 해결책은 다음과 같습니다(Java로, 좋아하는 언어를 사용해도 됩니다).

String getNthColumnName(int n) {
    String name = "";
    while (n > 0) {
        n--;
        name = (char)('A' + n%26) + name;
        n /= 26;
    }
    return name;
}

하지만 이 코드에서 실수를 발견하면 알려주시기 바랍니다. 감사합니다.

언어에 구애받지 않는 알고리즘은 다음과 같습니다.

function getNthColumnName(int n) {
   let curPower = 1
   while curPower < n {
      set curPower = curPower * 26
   }
   let result = ""
   while n > 0 {
      let temp = n / curPower
      let result = result + char(temp)
      set n = n - (curPower * temp)
      set curPower = curPower / 26
   }
   return result

이 알고리즘은 16,000개가 넘는 열을 처리하기 위해 Excel이 다시 업그레이드되는 경우도 고려합니다.정말로 한계를 뛰어넘고 싶다면 추가 값을 전달하고 26의 인스턴스를 대체 알파벳을 수용할 수 있는 다른 숫자로 바꿀 수 있습니다.

고마워요, 조셉 스터테반트!귀하의 코드는 완벽하게 작동합니다. vbscript에 필요했기 때문에 내 버전을 공유하겠다고 생각했습니다.

Function ColumnLetter(ByVal intColumnNumber)
    Dim sResult
    intColumnNumber = intColumnNumber - 1
    If (intColumnNumber >= 0 And intColumnNumber < 26) Then
        sResult = Chr(65 + intColumnNumber)
    ElseIf (intColumnNumber >= 26) Then
        sResult = ColumnLetter(CLng(intColumnNumber \ 26)) _
                & ColumnLetter(CLng(intColumnNumber Mod 26 + 1))
    Else
        err.Raise 8, "Column()", "Invalid Column #" & CStr(intColumnNumber + 1)
    End If
    ColumnLetter = sResult
End Function

Joseph의 코드는 훌륭하지만 VBA 기능을 사용하고 싶지 않거나 사용할 필요가 없다면 이 코드를 사용해 보세요.

n의 값이 셀에 있다고 가정 A2이 기능을 사용하세요:

=MID(ADDRESS(1,A2),2,LEN(ADDRESS(1,A2))-3)
IF(COLUMN()>=26,CHAR(ROUND(COLUMN()/26,1)+64)&CHAR(MOD(COLUMN(),26)+64),CHAR(COLUMN()+64))

이것은 2개의 문자 열(열까지)에서 작동합니다. ZZ).3개의 문자 열에 대해 또 다른 if 문을 중첩해야 합니다.

위 수식은 열에서 실패합니다. AY, AZ 그리고 다음 각각 nY 그리고 nZ 열.수정된 수식은 다음과 같습니다.

=IF(COLUMN()>26,CHAR(ROUNDDOWN((COLUMN()-1)/26,0)+64)&CHAR(MOD((COLUMN()-1),26)+65),CHAR(COLUMN()+64)

wcm에서:

VBA를 사용하지 않으려면 원하는 번호로 COLNR을 사용할 수 있습니다.

=MID(ADDRESS(1,colnr),2,LEN(ADDRESS(1,colnr))-3)

이 수식은 ADDRESS 함수 사용으로 인해 변동성이 있다는 점에 유의하시기 바랍니다.휘발성 함수는 모든 변경 후에 Excel에서 다시 계산되는 함수입니다.일반적으로 Excel은 종속 참조가 변경될 때만 수식을 다시 계산합니다.

이 공식을 사용하면 성능이 저하될 수 있습니다.

다음은 VBScript 버전에서 SQL Server 2000+로의 변환입니다.

CREATE FUNCTION [dbo].[GetExcelColRef] 
(
    @col_seq_no int
)
RETURNS varchar(5)
AS
BEGIN

declare @Result varchar(5)
set @Result = ''
set @col_seq_no = @col_seq_no - 1
If (@col_seq_no >= 0 And @col_seq_no < 26) 
BEGIN
    set @Result = char(65 + @col_seq_no)
END
ELSE
BEGIN
    set @Result = [dbo].[GetExcelColRef] (@col_seq_no / 26) + '' + [dbo].[GetExcelColRef]  ((@col_seq_no % 26) + 1)
END
Return @Result

END
GO

루비 한 줄짜리:

def column_name_for(some_int)
    some_int.to_s(26).split('').map {|c| (c.to_i(26) + 64).chr }.join # 703 => "AAA"
end

정수를 base26으로 변환한 다음 분할하고 일부 수학을 수행하여 각 문자를 ASCII에서 변환합니다.마침내 모두 다시 합류합니다.분할, 모듈러스 또는 재귀가 없습니다.

재미있는.

이것은 MS Excel 2003-2010에서 잘 작동합니다.다음을 지원하는 이전 버전에서 작동해야 합니다. 세포(...).주소 기능:

  1. 28번째 열의 경우 - 복용 columnNumber=28; Cells(1, columnNumber).Address 보고 "$AB$1".
  2. 분할을 수행합니다. $ sign은 배열을 반환합니다. ["","AB","1"]
  3. 그래서 Split(Cells(1, columnNumber).Address, "$")(1) 열 이름을 제공합니다 "AB".

업데이트:

에서 가져옴 Excel 열 번호를 알파벳 문자로 변환하는 방법

' The following VBA function is just one way to convert column number 
' values into their equivalent alphabetical characters:

Function ConvertToLetter(iCol As Integer) As String
   Dim iAlpha As Integer
   Dim iRemainder As Integer
   iAlpha = Int(iCol / 27)
   iRemainder = iCol - (iAlpha * 26)
   If iAlpha > 0 Then
      ConvertToLetter = Chr(iAlpha + 64)
   End If
   If iRemainder > 0 Then
      ConvertToLetter = ConvertToLetter & Chr(iRemainder + 64)
   End If
End Function

적용 대상:마이크로소프트 오피스 엑셀 2007 SE / 2002 SE / 2000 SE / 97 SE

VBA 코드가 필요하다고 가정합니다.

Public Function GetColumnAddress(nCol As Integer) As String

Dim r As Range

Set r = Range("A1").Columns(nCol)
GetColumnAddress = r.Address

End Function

이것은 VBA에서 원하는 것을 수행합니다.

Function GetNthExcelColName(n As Integer) As String
    Dim s As String
    s = Cells(1, n).Address
    GetNthExcelColName = Mid(s, 2, InStr(2, s, "$") - 2)
End Function

이것은 vb.net에서 작동하는 것 같습니다.

Public Function Column(ByVal pColumn As Integer) As String
    pColumn -= 1
    If pColumn >= 0 AndAlso pColumn < 26 Then
        Return ChrW(Asc("A"c) + pColumn).ToString
    ElseIf (pColumn > 25) Then
        Return Column(CInt(math.Floor(pColumn / 26))) + Column((pColumn Mod 26) + 1)
    Else
    stop
        Throw New ArgumentException("Invalid column #" + (pColumn + 1).ToString)
    End If
End Function

나는 Joseph의 것을 가지고 BH에 테스트한 다음 980-1000을 공급했고 좋아 보였습니다.

VBA에서는 lCol이 열 번호라고 가정합니다.

function ColNum2Letter(lCol as long) as string
    ColNum2Letter = Split(Cells(1, lCol).Address, "$")(0)
end function

좋은 사람들이 게시한 모든 코드 샘플은 괜찮아 보입니다.

한 가지 알아두셔야 할 점이 있습니다.Office 2007부터 Excel에는 실제로 최대 16,384개의 열이 있습니다.이는 XFD로 변환됩니다(기존 최대 256열은 IV였습니다).세 문자에 대해 작동하도록 하려면 이 방법을 다소 수정해야 합니다.

그렇게 힘들면 안 되는데...

Gary Waters 솔루션은 다음과 같습니다.

Function ConvertNumberToColumnLetter2(ByVal colNum As Long) As String
    Dim i As Long, x As Long
    For i = 6 To 0 Step -1
        x = (1 - 26 ^ (i + 1)) / (-25) - 1 ‘ Geometric Series formula
        If colNum > x Then
            ConvertNumberToColumnLetter2 = ConvertNumberToColumnLetter2 & Chr(((colNum - x - 1)\ 26 ^ i) Mod 26 + 65)
        End If
    Next i
End Function

~을 통해 http://www.dailydoseofexcel.com/archives/2004/05/21/column-numbers-to-letters/

wcm(상위값=xfd)의 코멘트를 고려하면 다음과 같이 계산할 수 있습니다.

function IntToExcel(n: Integer); string;
begin
   Result := '';
   for i := 2 down to 0 do 
   begin
      if ((n div 26^i)) > 0) or (i = 0) then
         Result := Result + Char(Ord('A')+(n div (26^i)) - IIF(i>0;1;0));
      n := n mod (26^i);
   end;
end;

알파벳에는 26개의 문자가 있으며 위치적으로 26의 거듭제곱을 나타내는 특이한 문자 세트(A..Z)가 있는 16진수 또는 이진수와 같은 숫자 시스템이 있습니다.(26^2)(26^1)(26^0).

참고로 T-SQL은 단일 문으로 서수(0부터 시작)가 지정된 Excel 열 이름을 제공합니다.

0보다 작거나 16,383(Excel2010의 최대 열)보다 큰 값은 NULL을 반환합니다.

; WITH TestData AS ( -- Major change points
    SELECT -1 AS FieldOrdinal
    UNION ALL
    SELECT 0
    UNION ALL
    SELECT 25
    UNION ALL
    SELECT 26
    UNION ALL
    SELECT 701
    UNION ALL
    SELECT 702
    UNION ALL
    SELECT 703
    UNION ALL
    SELECT 16383
    UNION ALL
    SELECT 16384
)
SELECT
      FieldOrdinal
    , CASE
       WHEN FieldOrdinal < 0     THEN NULL
       WHEN FieldOrdinal < 26    THEN ''
       WHEN FieldOrdinal < 702   THEN CHAR (65 + FieldOrdinal / 26 - 1)
       WHEN FieldOrdinal < 16384 THEN CHAR (65 + FieldOrdinal / 676 - 1)
                                    + CHAR (65 + (FieldOrdinal / 26) - (FieldOrdinal / 676) * 26 - 1)
       ELSE NULL
      END
      + CHAR (65 + FieldOrdinal % 26)
 FROM TestData
 ORDER BY FieldOrdinal

현재 이것을 사용하고 있지만 최적화가 가능하다는 느낌이 듭니다.

private String GetNthExcelColName(int n)
{
    String firstLetter = "";  
    //if number is under 26, it has a single letter name
    // otherwise, it is 'A' for 27-52, 'B' for 53-78, etc
    if(n > 26)
    {
        //the Converts to double and back to int are just so Floor() can be used
        Double value = Convert.ToDouble((n-1) / 26);
        int firstLetterVal = Convert.ToInt32(Math.Floor(value))-1;
        firstLetter = Convert.ToChar(firstLetterValue + 65).ToString();
    }    

    //second letter repeats
    int secondLetterValue = (n-1) % 26;
    String secondLetter = Convert.ToChar(secondLetterValue+65).ToString();

    return firstLetter + secondLetter;
}

=CHAR(64+열())

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top