열 번호를 문자로 변환하는 기능?


143

누구든지 숫자에서 열 문자를 반환 할 수있는 Excel VBA 기능이 있습니까?

예를 들어 100 을 입력 하면을 반환해야합니다 CV.


4
이 질문을 확인하십시오 : stackoverflow.com/questions/10106465/…
Francis Dean

@FrancisDean이 질문의 반대 인 숫자에서 주소를 찾고 있습니다
brettdj

2
@brettdj 링크 된 답변은 숫자 대 문자와 문자 대 숫자를 모두 표시합니다.
Francis Dean

2
@FrancisDean 공정한 포인트, 나는 대답 대답 대신 링크에서 질문 제목을 보았다
brettdj

답변:


211

이 함수는 주어진 열 번호에 대한 열 문자를 반환합니다.

Function Col_Letter(lngCol As Long) As String
    Dim vArr
    vArr = Split(Cells(1, lngCol).Address(True, False), "$")
    Col_Letter = vArr(0)
End Function

열 100의 테스트 코드

Sub Test()
    MsgBox Col_Letter(100)
End Sub

9
(0)변수 선언과 여분의 코드 줄을 저장하려면 Split 명령 끝에를 추가 할 수 있습니다 . 예Col_letter = Split(Cells(1, lngCol).Address(True, False), "$")(0)
Caltor

3
그것은 정확하지만 여러 줄을 사용하는 것이 더 읽기 쉽다고 생각했습니다.
brettdj

6
이 상황에서 부울 매개 변수를 사용하는 이유는 무엇입니까? 당신은 이것을 할 수 있습니다 : ............................................. ......v = Split(Cells(1, lngCol).Address, "$")(1)
Excel Hero

1
이것은 매우 오래되었지만 약간의 추가 사항이 있습니다. 먼저 숫자가 양수인지 확인하십시오. 그렇지 않으면 오류가 발생하기 때문입니다. lngcol <= 0 인 경우
Selkie

1
VBS를 사용할 때이 .Cells속성은 Excel의 속성이므로 반드시 사용해야한다는 것을 기억하십시오 <excel_object>.Cells(). 그렇지 않으면 유형 불일치 오류가 발생합니다.
Stevoisiak

88

범위 객체를 사용하지 않으려는 경우 :

Function ColumnLetter(ColumnNumber As Long) As String
    Dim n As Long
    Dim c As Byte
    Dim s As String

    n = ColumnNumber
    Do
        c = ((n - 1) Mod 26)
        s = Chr(c + 65) & s
        n = (n - c) \ 26
    Loop While n > 0
    ColumnLetter = s
End Function

1
범위 객체를 사용하지 않으려
brettdj

29
@brettdj 몇 가지 이유를 상상할 수 있습니다. 1)이 방법은 테스트를 통해 약 6 배 빠릅니다. 2) Excel API에 액세스 할 필요가 없습니다. 3) 메모리 공간이 더 작은 것으로 추정됩니다. 편집 : 또한, 왜 내가 1 년 이상 된 답변에 대해 언급했는지 잘 모르겠습니다 : S
Blackhawk

6
그러나 속도가 증가하면 단점이 있습니다. 유효하지 않은 열 번호를 전달하면 범위 개체를 사용하면 오류가 발생합니다. 누군가가 여전히 Excel 2003을 사용하는 경우에도 작동합니다. 이러한 종류의 예외가 필요한 경우 범위 방법을 사용하십시오. 그렇지 않으면, robartsd에 kudos.
엔지니어 토스트

6
IF ColumnNumber <= Columns.Count버전에 대한 가정을 피하는 것이 좋습니다.
brettdj

1
이 코드를 사용하는 또 다른 이유는 VBA가 아닌 VB, .net 등에있는 경우입니다.
Maury Markowitz

46

나를 위해 일하는 것은 다음과 같습니다.

Cells(Row,Column).Address 

그러면 $ AE $ 1 형식 참조가 반환됩니다.


1
이것은 질문에 대답하지 않습니다.
Pochmurnik

33

** <code> </ code> <code> Columns (</ code> *** <code> Column Index </ code> *** <code>). Address </ code> <code> </ code> **

  • 예를 들어, MsgBox Columns( 9347 ).Address Returns ** <code> $ MUM : $ MUM </ code> ** .

열 문자 반환하려면 :Split((Columns(Column Index).Address(,0)),":")(0)

  • 예를 들어, MsgBox Split((Columns( 2734 ).Address(,0)),":")(0) Returns ** <code> DAD </ code> ** .

  더 많은 예



이것은 Office 365에서 나를 위해 작동합니다. string col = Worksheet.Columns [column] .Address; 반환 col.Substring (col.IndexOf ( ":") + 2); 어떤 이유로 Range = Worksheet.Cells [1, column]과 같은 다른 표현식에서 오류가 발생했습니다 (Cells 호출 또는 주소를 취하려고 할 때)-죄송합니다. 특정 사례.)
Sam Azer

19

이 작업을 수행하는 또 다른 방법입니다. Brettdj의 대답 은 이것을 생각하게 만들었지만이 방법을 사용하면 변형 배열을 사용할 필요가 없으므로 문자열로 직접 이동할 수 있습니다.

ColLtr = Cells(1, ColNum).Address(True, False)
ColLtr = Replace(ColLtr, "$1", "")

또는 이것으로 조금 더 작게 만들 수 있습니다.

ColLtr = Replace(Cells(1, ColNum).Address(True, False), "$1", "")

이것은 셀 객체에서 행 1을 참조하는 것에 달려 있습니다.


18

그리고 재귀를 사용하는 솔루션 :

Function ColumnNumberToLetter(iCol As Long) As String

    Dim lAlpha As Long
    Dim lRemainder As Long

    If iCol <= 26 Then
        ColumnNumberToLetter = Chr(iCol + 64)
    Else
        lRemainder = iCol Mod 26
        lAlpha = Int(iCol / 26)
        If lRemainder = 0 Then
            lRemainder = 26
            lAlpha = lAlpha - 1
        End If
        ColumnNumberToLetter = ColumnNumberToLetter(lAlpha) & Chr(lRemainder + 64)
    End If

End Function

676보다 큰 숫자를 변환하기에 완벽하게 잘라서 붙여 넣기. 감사합니다!
David Krider

1
나머지는 26을 넘을 수 없으므로 왜 정수가 아닌 정수가 아닌가?
Caltor 2019

10
@Caltor 예를 들어 하나를 요구하는 API를 호출하는 것과 같이 Integer를 사용하기위한 특별한 목적이 없다면 Long 대신에 정수를 선택해서는 안됩니다. VBA는 Long에 최적화되어 있습니다. VBA는 정수보다 더 빠르게 처리합니다.
Excel Hero

1
@ExcelHero 나는 그것을 몰랐다. Long은 정수보다 많은 메모리를 차지하지 않습니까?
Caltor

6
@Caltor 실제로 Long은 32 비트 인 반면 Integer는 16입니다. 그러나 이것은 현대 컴퓨팅에서는 중요하지 않습니다. 25 년 전 ... 그러나 오늘날 (15 년 전)에도 그 차이는 완전히 중요하지 않습니다.
Excel Hero

9

이것은 공식을 사용하여 사용할 수 있습니다.

=SUBSTITUTE(ADDRESS(1,COLUMN(),4),"1","")

요청 된대로 VBA 함수로 작성할 수도 있습니다.

Function ColName(colNum As Integer) As String
    ColName = Split(Worksheets(1).Cells(1, colNum).Address, "$")(1)
End Function

8

이것은 루프 대신 재귀를 사용 하는 robartsd의 답변 버전입니다 ( Jan Wijninckx의 한 줄 솔루션의 풍미와 함께 ).

Public Function ColumnLetter(Column As Integer) As String
    If Column < 1 Then Exit Function
    ColumnLetter = ColumnLetter(Int((Column - 1) / 26)) & Chr(((Column - 1) Mod 26) + Asc("A"))
End Function

나는 다음 입력으로 이것을 테스트했다.

1   => "A"
26  => "Z"
27  => "AA"
51  => "AY"
702 => "ZZ"
703 => "AAA" 
-1  => ""
-234=> ""

2
나는 이것이 Nikolay Ivanov의 솔루션과 본질적으로 동일하다는 것을 알았습니다. 는 특징점의 몇 가지에 대한 약간 다른 접근 방식을 보여주기 때문에 나는 그것을 떠날거야
alexanderbird

두 가지 이유로 좋은 해결책 : 범위, 셀 등과 같은 객체를 사용하지 않는 것; 매우 컴팩트 한 정의.
loved.by. 예수가

8

robertsd의 코드 는 우아하지만 미래를 하기 위해 n의 선언을 long으로 변경하십시오.

매크로를 피하기 위해 수식을 원할 경우 여기에 702 열까지 작동하는 것이 있습니다.

=IF(A1>26,CHAR(INT((A1-1)/26)+64),"")&CHAR(MOD(A1-1,26)+65)

여기서 A1은 문자로 변환 할 열 번호를 포함하는 셀입니다.


7

최신 업데이트 : 아래 기능을 무시하십시오. @SurasinTancharoen은에서 고장났다는 경고 메시지를 표시했습니다 n = 53.
관심있는 사람들을 위해 아래에 다른 깨진 값이 있습니다 n = 200.

의 특정 가치

모든 요구에 @brettdj 기능을 사용하십시오. 심지어 Microsoft Excel의 최신 최대 열 수 제한에서 작동 16384합니다.XFD

여기에 이미지 설명을 입력하십시오

업데이트 종료


아래 기능은 Microsoft에서 제공합니다.

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

출처 : Excel 열 번호를 알파벳 문자로 변환하는 방법

에 적용

  • Microsoft Office Excel 2007
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Excel 2000 Standard Edition
  • Microsoft Excel 97 Standard Edition

2
참고로, Chr ()은 많은 수를 잘 처리하지 않으므로 더 큰 열 집합을 사용합니다.
Azuvector

2
버그가 있습니다. 'BA'였어야했지만 ConvertToLetter (53)를 시도해보십시오.
Surasin Tancharoen

@SurasinTancharoen이 결함에 대해 대단히 감사합니다. 나는 그들이 Microsoft Excel을 만든 사람이기 때문에 Microsoft가 깨진 기능을 제공 할 것이라고 생각한 적이 없습니다. 지금부터이 기능을 포기하고 최신 Microsoft Excel 최대 열 수 제한까지 수정하는 @brettdj 기능을 사용할 것입니다.Col_Letter(16384) = "XFD"
mtbink.com

4
그리고이 "27로 나누기"는 지구상 어디에서 왔습니까? 마지막으로 26 글자가 있는지 확인했습니다. 이것이이 코드가 깨지는 이유입니다.
ib11

5

의 @DamienFennelly의 답변을 기반으로하는 함수입니다 . 당신이 나에게 엄지 손가락을 포기하면 그에게도 엄지 손가락을 줘! :피

Function outColLetterFromNumber(iCol as Integer) as String
    sAddr = Cells(1, iCol).Address
    aSplit = Split(sAddr, "$")
    outColLetterFromNumber = aSplit(1)
End Function

2
좋은 방법이지만 허용되는 답변과 어떻게 다릅니 까?
Ioannis

@loannis 나는 DamianFennelly의 대답에 기반을 두었다. 그러나 네, 한 줄이 더 읽기 쉽도록 두 줄로 나뉜다는 점을 제외하면 내 대답은 받아 들인 대답과 매우 비슷합니다.
BrettFromLA

3

Excel power를 사용하는 매우 간단한 방법 Range.Cells.Address이 있습니다.

strCol = Cells(1, lngRow).Address(xlRowRelative, xlColRelative)

행 1에서 원하는 열의 주소를 반환합니다 1.

strCol = Left(strCol, len(strCol) - 1)

너무 빠르고 강력하여 존재하는 열 주소를 반환 할 수 있습니다!

속성을 lngRow사용하여 원하는 열 번호로 대체 하십시오 Selection.Column!


2

사용할 수있는 간단한 라이너 하나입니다.

ColumnLetter = Mid(Cells(Row, LastColA).Address, 2, 1)

그것은 1 문자 열 지정에만 작동하지만 간단한 경우에는 좋습니다. 독점적으로 2 글자로 지정 해야하는 경우 다음을 사용할 수 있습니다.

ColumnLetter = Mid(Cells(Row, LastColA).Address, 2, 2)

2

이것은 X 행, Y 열의 셀에 대한 하나의 코드 줄 내부의 열에 관계없이 작동합니다.

Mid(Cells(X,Y).Address, 2, instr(2,Cells(X,Y).Address,"$")-2)

고유하게 정의 된 이름이 "셀 이름"인 셀이있는 경우 :

Mid(Cells(1,val(range("Cellname").Column)).Address, 2, instr(2,Cells(1,val(range("Cellname").Column)).Address,"$")-2)

1

brettdj의 솔루션은 환상적으로 작동하지만 같은 이유로 잠재적 인 솔루션 으로이 문제를 겪고 있다면 대안 솔루션을 제공 할 것이라고 생각했습니다.

내가 겪고 있었던 문제는 MATCH () 함수의 출력을 기반으로 특정 열로 스크롤하는 것입니다. 열 번호를 열 문자 병렬로 변환하는 대신 참조 스타일을 A1에서 R1C1로 일시적으로 전환했습니다. 이렇게하면 VBA 기능을 사용하지 않고도 열 번호로 스크롤 할 수 있습니다. 두 가지 참조 스타일간에 쉽게 전환하려면이 VBA 코드를 사용하십시오.

Sub toggle_reference_style()

If Application.ReferenceStyle = xlR1C1 Then
  Application.ReferenceStyle = xlA1
Else
  Application.ReferenceStyle = xlR1C1
End If

End Sub

1

brettdj 답변에 더 나아가, 열 번호 입력을 선택적으로 만드는 것입니다. 열 번호 입력이 생략되면 함수는 함수를 호출하는 셀의 열 문자를 리턴합니다. 나는 이것을 또한 사용하여 달성 할 수 있다는 것을 알고 ColumnLetter(COLUMN())있지만, 똑똑하게 이해할 수 있다면 좋을 것이라고 생각했습니다.

Public Function ColumnLetter(Optional ColumnNumber As Long = 0) As String
    If ColumnNumber = 0 Then
        ColumnLetter = Split(Application.Caller.Address(True, False, xlA1), "$")(0)
    Else
        ColumnLetter = Split(Cells(1, ColumnNumber).Address(True, False, xlA1), "$")(0)
    End If
End Function

이 기능의 단점은 IF테스트 때문에 brettdj의 답변보다 매우 약간 느리다는 것 입니다. 그러나이 기능을 반복해서 많이 사용하면 이것이 느껴질 수 있습니다.


1

여기에 늦은 대답은 사용하는 단순한 접근 방식입니다 Int()If1-3 문자 컬럼의 경우 :

Function outColLetterFromNumber(i As Integer) As String

    If i < 27 Then       'one-letter
        col = Chr(64 + i)
    ElseIf i < 677 Then  'two-letter
        col = Chr(64 + Int(i / 26)) & Chr(64 + i - (Int(i / 26) * 26))
    Else                 'three-letter
        col = Chr(64 + Int(i / 676)) & Chr(64 + Int(i - Int(i / 676) * 676) / 26)) & Chr(64 + i - (Int(i - Int(i / 676) * 676) / 26) * 26))
    End If

    outColLetterFromNumber = col

End Function

1
Function fColLetter(iCol As Integer) As String
  On Error GoTo errLabel
  fColLetter = Split(Columns(lngCol).Address(, False), ":")(1)
  Exit Function
errLabel:
  fColLetter = "%ERR%"
End Function

1

파스칼 (Delphi)의 간단한 함수입니다.

function GetColLetterFromNum(Sheet : Variant; Col : Integer) : String;
begin
  Result := Sheet.Columns[Col].Address;  // from Col=100 --> '$CV:$CV'
  Result := Copy(Result, 2, Pos(':', Result) - 2);
end;

1

이 공식은 범위를 기반으로 열을 제공합니다 (예 : A1 )를 . 여기서 범위는 단일 셀입니다. 다중 셀 범위가 제공되면 왼쪽 위 셀을 반환합니다. 두 셀 참조는 동일해야합니다.

MID (CELL ( "주소", A1 ), 2, 검색 ( "$", CELL ( "주소", A1) ), 2) -2)

작동 방식 :

CELL ( "property", "range")는 사용 된 속성에 따라 범위의 특정 값을 반환합니다. 이 경우 셀 주소입니다. 주소 속성은 $ [col] $ [row] 값, 즉 A1-> $ A $ 1을 반환합니다. MID 함수는 $ 기호 사이의 열 값을 구문 분석합니다.


0

열 이름을 얻는 쉬운 방법

Sub column()

cell=cells(1,1)
column = Replace(cell.Address(False, False), cell.Row, "")
msgbox column

End Sub

도움이되기를 바랍니다 =)


0
Sub GiveAddress()
    Dim Chara As String
    Chara = ""
    Dim Num As Integer
    Dim ColNum As Long
    ColNum = InputBox("Input the column number")

    Do
        If ColNum < 27 Then
            Chara = Chr(ColNum + 64) & Chara
            Exit Do
        Else
            Num = ColNum / 26
            If (Num * 26) > ColNum Then Num = Num - 1
            If (Num * 26) = ColNum Then Num = ((ColNum - 1) / 26) - 1
            Chara = Chr((ColNum - (26 * Num)) + 64) & Chara
            ColNum = Num
        End If
    Loop

    MsgBox "Address is '" & Chara & "'."
End Sub

0

그래서 나는 여기서 파티에 늦었지만, 아직 아무도 배열에 관련되지 않은 다른 해결책을 제시하고 싶습니다. 간단한 문자열 조작으로 할 수 있습니다.

Function ColLetter(Col_Index As Long) As String

    Dim ColumnLetter As String

    'Prevent errors; if you get back a number when expecting a letter, 
    '    you know you did something wrong.
    If Col_Index <= 0 Or Col_Index >= 16384 Then
        ColLetter = 0
        Exit Function
    End If

    ColumnLetter = ThisWorkbook.Sheets(1).Cells(1, Col_Index).Address     'Address in $A$1 format
    ColumnLetter = Mid(ColumnLetter, 2, InStr(2, ColumnLetter, "$") - 2)  'Extracts just the letter

    ColLetter = ColumnLetter
End Sub

형식으로 입력 한 후 함수를 $A$1사용하고 Mid첫 번째를 설명하기 위해 위치 2에서 시작한 $다음을 $사용하여 두 번째 가 문자열에서 나타나는 위치를 찾은 InStr다음 해당 시작 위치를 설명하기 위해 2를 빼십시오.

이를 통해 가능한 모든 범위의 열에 적응할 수 있다는 이점이 있습니다. 따라서 ColLetter(1)"A" ColLetter(16384)를 돌려주고 "XFD"를 돌려 주는데, 이것은 내 Excel 버전에 가능한 마지막 열입니다.


-1

열 번호의 열 문자는 다음 단계에 따라 수식을 사용하여 추출 할 수 있습니다
. ADDRESS 수식을 사용하여 열 주소를 계산합니다
. 2. MID 및 FIND 함수를 사용하여 열 문자를 추출합니다

. 예 :
1. ADDRESS (1000,1000,1)
결과 $ ALL $ 1000
2 = MID (F15,2, FIND ( "$", F15,2) -2)
results ALL F15는 1 단계의 결과를 포함한다고 가정하면 MID (ADDRESS (1000,1000,1), 2, FIND를

작성할 수 있습니다.
( "$", 주소 (1000,1000,1), 2) -2)


-1

이것은 REFEDIT 전용입니다 ... 일반적으로 코드를 짧은 버전으로 사용하십시오 ... 읽기 쉽고 이해하기 쉽습니다 / $의 poz를 사용합니다

Private Sub RefEdit1_Change()

    Me.Label1.Caption = NOtoLETTER(RefEdit1.Value) ' you may assign to a variable  var=....'

End Sub

Function NOtoLETTER(REFedit)

    Dim First As Long, Second As Long

    First = InStr(REFedit, "$")                 'first poz of $
    Second = InStr(First + 1, REFedit, "$")     'second poz of $

    NOtoLETTER = Mid(REFedit, First + 1, Second - First - 1)   'extract COLUMN LETTER

End Function


-2

ASCII 숫자로 변환하고 Chr ()을 사용하여 문자로 다시 변환하는 것은 어떻습니까?

col_letter = Chr (선택 열 + 96)


-6

다른 방법이 있습니다.

{

      Sub find_test2()

            alpha_col = "A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,W,Z" 
            MsgBox Split(alpha_col, ",")(ActiveCell.Column - 1) 

      End Sub

}

1
알파벳 문자를 나열하는 문자열을 만들 필요가 없습니다. ASCII는 본질적으로 우리를 위해 그렇게했습니다.
Caltor
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.