누구든지 숫자에서 열 문자를 반환 할 수있는 Excel VBA 기능이 있습니까?
예를 들어 100 을 입력 하면을 반환해야합니다 CV
.
누구든지 숫자에서 열 문자를 반환 할 수있는 Excel VBA 기능이 있습니까?
예를 들어 100 을 입력 하면을 반환해야합니다 CV
.
답변:
이 함수는 주어진 열 번호에 대한 열 문자를 반환합니다.
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
(0)
변수 선언과 여분의 코드 줄을 저장하려면 Split 명령 끝에를 추가 할 수 있습니다 . 예Col_letter = Split(Cells(1, lngCol).Address(True, False), "$")(0)
v = Split(Cells(1, lngCol).Address, "$")(1)
.Cells
속성은 Excel의 속성이므로 반드시 사용해야한다는 것을 기억하십시오 <excel_object>.Cells()
. 그렇지 않으면 유형 불일치 오류가 발생합니다.
범위 객체를 사용하지 않으려는 경우 :
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
IF ColumnNumber <= Columns.Count
버전에 대한 가정을 피하는 것이 좋습니다.
나를 위해 일하는 것은 다음과 같습니다.
Cells(Row,Column).Address
그러면 $ AE $ 1 형식 참조가 반환됩니다.
MsgBox Columns( 9347 ).Address
Returns .열 문자 만 반환하려면 :Split((Columns(
Column Index
).Address(,0)),":")(0)
MsgBox Split((Columns( 2734 ).Address(,0)),":")(0)
Returns .
이 작업을 수행하는 또 다른 방법입니다. Brettdj의 대답 은 이것을 생각하게 만들었지만이 방법을 사용하면 변형 배열을 사용할 필요가 없으므로 문자열로 직접 이동할 수 있습니다.
ColLtr = Cells(1, ColNum).Address(True, False)
ColLtr = Replace(ColLtr, "$1", "")
또는 이것으로 조금 더 작게 만들 수 있습니다.
ColLtr = Replace(Cells(1, ColNum).Address(True, False), "$1", "")
이것은 셀 객체에서 행 1을 참조하는 것에 달려 있습니다.
그리고 재귀를 사용하는 솔루션 :
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
이것은 공식을 사용하여 사용할 수 있습니다.
=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
이것은 루프 대신 재귀를 사용 하는 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=> ""
robertsd의 코드 는 우아하지만 미래를 하기 위해 n의 선언을 long으로 변경하십시오.
매크로를 피하기 위해 수식을 원할 경우 여기에 702 열까지 작동하는 것이 있습니다.
=IF(A1>26,CHAR(INT((A1-1)/26)+64),"")&CHAR(MOD(A1-1,26)+65)
여기서 A1은 문자로 변환 할 열 번호를 포함하는 셀입니다.
최신 업데이트 : 아래 기능을 무시하십시오. @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 열 번호를 알파벳 문자로 변환하는 방법
에 적용
Col_Letter(16384) = "XFD"
위 의 @DamienFennelly의 답변을 기반으로하는 함수입니다 . 당신이 나에게 엄지 손가락을 포기하면 그에게도 엄지 손가락을 줘! :피
Function outColLetterFromNumber(iCol as Integer) as String
sAddr = Cells(1, iCol).Address
aSplit = Split(sAddr, "$")
outColLetterFromNumber = aSplit(1)
End Function
Excel power를 사용하는 매우 간단한 방법 Range.Cells.Address
이 있습니다.
strCol = Cells(1, lngRow).Address(xlRowRelative, xlColRelative)
행 1에서 원하는 열의 주소를 반환합니다 1
.
strCol = Left(strCol, len(strCol) - 1)
너무 빠르고 강력하여 존재하는 열 주소를 반환 할 수 있습니다!
속성을 lngRow
사용하여 원하는 열 번호로 대체 하십시오 Selection.Column
!
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
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의 답변보다 매우 약간 느리다는 것 입니다. 그러나이 기능을 반복해서 많이 사용하면 이것이 느껴질 수 있습니다.
여기에 늦은 대답은 사용하는 단순한 접근 방식입니다 Int()
및 If
1-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
이 공식은 범위를 기반으로 열을 제공합니다 (예 : A1 )를 . 여기서 범위는 단일 셀입니다. 다중 셀 범위가 제공되면 왼쪽 위 셀을 반환합니다. 두 셀 참조는 동일해야합니다.
MID (CELL ( "주소", A1 ), 2, 검색 ( "$", CELL ( "주소", A1) ), 2) -2)
작동 방식 :
CELL ( "property", "range")는 사용 된 속성에 따라 범위의 특정 값을 반환합니다. 이 경우 셀 주소입니다. 주소 속성은 $ [col] $ [row] 값, 즉 A1-> $ A $ 1을 반환합니다. MID 함수는 $ 기호 사이의 열 값을 구문 분석합니다.
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
그래서 나는 여기서 파티에 늦었지만, 아직 아무도 배열에 관련되지 않은 다른 해결책을 제시하고 싶습니다. 간단한 문자열 조작으로 할 수 있습니다.
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 버전에 가능한 마지막 열입니다.
열 번호의 열 문자는 다음 단계에 따라 수식을 사용하여 추출 할 수 있습니다
. 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)
이것은 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
캡 A는 65이므로
MsgBox Chr(ActiveCell.Column + 64)
:에서 발견 http://www.vbaexpress.com/forum/showthread.php?6103-Solved-get-column-letter
ASCII 숫자로 변환하고 Chr ()을 사용하여 문자로 다시 변환하는 것은 어떻습니까?
col_letter = Chr (선택 열 + 96)