有人有一段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)
。例如:Col_letter = Split(Cells(1, lngCol).Address(True, False), "$")(0)
。 - Caltorv = Split(Cells(1, lngCol).Address, "$")(1)
- Excel Hero.Cells
是Excel的属性,这意味着您需要使用<excel_object>.Cells()
。否则,您将会得到类型不匹配的错误。 - Stevoisiak如果您不想使用范围对象:
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
,会更好一些,可以避免对版本的假设。 - brettdj对我有用的方法是:
Cells(Row,Column).Address
这将为您返回 $AE$1 格式的引用。
Split(Columns(idx).Address, "$")(2)
- 而不是 *Split((Columns(idx).Address(,0)),":")(0)
*,其中 idx
是表示列索引的长整型。 - T.M.还有一种方法可以实现这个。 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是包含要转换为字母的列号的单元格。
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
适用于