是否有人拥有可以从数字中返回列字母的Excel VBA函数?
例如,输入100应该返回CV
。
是否有人拥有可以从数字中返回列字母的Excel VBA函数?
例如,输入100应该返回CV
。
Answers:
此函数返回给定列号的列字母。
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
最好避免围绕版本进行假设。
MsgBox Columns( 9347 ).Address
return 。仅返回列字母:Split((Columns(
Column Index
).Address(,0)),":")(0)
MsgBox Split((Columns( 2734 ).Address(,0)),":")(0)
return 。
只是执行此操作的另一种方法。Brettdj的回答让我想到了这一点,但是如果您使用此方法,则不必使用变体数组,则可以直接使用字符串。
ColLtr = Cells(1, ColNum).Address(True, False)
ColLtr = Replace(ColLtr, "$1", "")
或者可以使它更紧凑
ColLtr = Replace(Cells(1, ColNum).Address(True, False), "$1", "")
注意,这确实取决于您引用cell对象中的第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=> ""
罗伯茨的代码很优雅,但为了使其适应未来发展,请将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
适用于
Col_Letter(16384) = "XFD"
这是一个基于@DamienFennelly上面的答案的函数。如果您给我竖起大拇指,也给他竖起大拇指!:P
Function outColLetterFromNumber(iCol as Integer) as String
sAddr = Cells(1, iCol).Address
aSplit = Split(sAddr, "$")
outColLetterFromNumber = aSplit(1)
End Function
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
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版本的最后一个可能的列。
这仅用于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