将列号转换为字母的功能?

mez*_*hic 134 excel vba excel-udf

有没有人有一个Excel VBA函数可以从一个数字返回列字母?

例如,输入100应该返回CV.

bre*_*tdj 199

此函数返回给定列号的列字母.

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

测试第100列的代码

Sub Test()
    MsgBox Col_Letter(100)
End Sub
Run Code Online (Sandbox Code Playgroud)

  • 如果要保存自己的变量声明和额外的代码行,可以将`(0)`添加到Split命令的末尾.例如`Col_letter = Split(Cells(1,lngCol).Address(True,False),"$")(0)` (9认同)
  • 在这种情况下,为什么还要使用布尔参数.你可以这样做:............................................. ......`v = Split(Cells(1,lngCol).Address,"$")(1)` (6认同)
  • 这是非常正确的,但我认为使用多行更具可读性. (3认同)
  • 虽然这已经很老了,但我有一个小的补充 - 首先检查数字是否为正,否则你会遇到错误。如果 lngcol <=0 那么 (3认同)
  • 使用 VBS 时,请记住“.Cells”是 Excel 的属性,这意味着您需要使用“<excel_object>.Cells()”。否则,您将收到类型不匹配错误。 (2认同)

rob*_*tsd 84

如果您不想使用范围对象:

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
Run Code Online (Sandbox Code Playgroud)

  • @brettdj我可以想象几个原因:1)通过我的测试,这种方法快了大约6倍2)它不需要访问Excel API 3)它可能具有更小的内存占用.编辑:另外,我不确定为什么我评论一年多的回答:S (28认同)
  • 但是,增加速度有一个缺点.如果传入无效的列号,则使用范围对象会引发错误.即使有人仍在使用Excel 2003,它仍然有效.如果您需要这种异常,请使用范围方法.否则,要自欺欺人. (6认同)
  • `IF ColumnNumber <= Columns.Count`会更好地避免对版本的假设. (6认同)
  • @blackhawk,公平点重新加速.-1删除. (5认同)

小智 44

对我有用的东西是:

Cells(Row,Column).Address 
Run Code Online (Sandbox Code Playgroud)

这将为您返回$ AE $ 1格式参考.

  • 这并不能回答问题。 (3认同)

Nik*_*nov 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
Run Code Online (Sandbox Code Playgroud)

  • @Caltor除非你有一个使用Integer的特殊目的,比如调用一个例如需要一个的API,你永远不应该选择一个Integer over long.VBA针对Longs进行了优化.VBA比整数更快地处理Longs. (10认同)
  • @Caltor确实long是32位,而Integer是16.但这在现代计算中并不重要.25年前......这很重要.但是今天(甚至15年前),差异完全无关紧要. (6认同)

OSU*_*rba 18

还有一种方法可以做到这一点.Brettdj的回答让我想到了这一点,但如果你使用这种方法你不必使用变量数组,你可以直接转到字符串.

ColLtr = Cells(1, ColNum).Address(True, False)
ColLtr = Replace(ColLtr, "$1", "")
Run Code Online (Sandbox Code Playgroud)

或者可以使它更紧凑

ColLtr = Replace(Cells(1, ColNum).Address(True, False), "$1", "")
Run Code Online (Sandbox Code Playgroud)

请注意,这取决于您引用单元格对象中的第1行.


Ali*_*ins 9

这可以通过使用公式获得:

=SUBSTITUTE(ADDRESS(1,COLUMN(),4),"1","")
Run Code Online (Sandbox Code Playgroud)

所以也可以按要求写成VBA函数:

Function ColName(colNum As Integer) As String
    ColName = Split(Worksheets(1).Cells(1, colNum).Address, "$")(1)
End Function
Run Code Online (Sandbox Code Playgroud)


ale*_*ird 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
Run Code Online (Sandbox Code Playgroud)

我用以下输入测试了这个:

1   => "A"
26  => "Z"
27  => "AA"
51  => "AY"
702 => "ZZ"
703 => "AAA" 
-1  => ""
-234=> ""
Run Code Online (Sandbox Code Playgroud)

  • 我刚刚注意到,这本质上与Nikolay Ivanov的解决方案相同,这使我的新颖性降低了。我将其保留,因为对于某些细节,它显示出略有不同的方法 (2认同)

Jan*_*ckx 7

robertsd的代码很优雅,但要使其面向未来,将n的声明更改为long类型

如果您希望公式避免使用宏,则可以使用包含在内的第702列

=IF(A1>26,CHAR(INT((A1-1)/26)+64),"")&CHAR(MOD(A1-1,26)+65)
Run Code Online (Sandbox Code Playgroud)

其中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
Run Code Online (Sandbox Code Playgroud)

来源:如何将Excel列号转换为字母字符

适用于

  • Microsoft Office Excel 2007
  • Microsoft Excel 2002标准版
  • Microsoft Excel 2000标准版
  • Microsoft Excel 97标准版

  • 在地球上这个"除以27"来自哪里?最后我检查了26个字母.这就是这段代码破解的原因. (4认同)
  • 作为参考,由于Chr()不能很好地处理大数,因此这会产生更大的列集. (2认同)
  • 这有一个错误。尝试 ConvertToLetter(53) ,它应该是 'BA' 但它会失败。 (2认同)

Bre*_*mLA 5

这是一个基于@DamienFennelly上面的回答的函数。如果你给我一个赞,也给他一个赞!:P

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

  • 很好,但它与接受的答案有什么不同? (2认同)