164

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

例如,输入100应该返回CV

4

28 回答 28

235

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

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
于 2012-10-09T09:44:55.073 回答
100

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

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
于 2013-03-12T16:37:04.687 回答
49

对我有用的是:

Cells(Row,Column).Address 

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

于 2013-11-21T21:00:41.657 回答
38

我很惊讶没有人建议:**<code></code> <code>Columns(</code>***<code>Column Index</code>***<code>).Address</code> <代码></代码>**

  • 例如: MsgBox Columns( 9347 ).Address 返回 **<code>$MUM:$MUM</code>**

返回列字母(s):Split((Columns(Column Index).Address(,0)),":")(0)

  • 例如: MsgBox Split((Columns( 2734 ).Address(,0)),":")(0) 返回 **<code>爸爸</code>**

  <img src="https://i.stack.imgur.com/7lg2r.gif" alt="More Examples" title="当然,我手头的时间可能有点太长了...... . 或者也许我看到了一个测试的机会,看看 ScreenToGif 的图像褪色过渡有多平滑/明显。毕竟,Stack Overflow *是一个学习的地方,对吧?(它*与编程相关,所以我*是*技术上的主题!)你可能甚至不知道你可以在 Stack Overflow 帖子中为图像添加工具提示,对吗?你是那个盯着动画足够长的时间来注意到这个工具提示的人 - 并且现在,看,你*仍然*坐在这里,阅读所有内容!现在来吧,'可怜的投票'怎么样?你永远不知道,它可能只会为你赢得一些宝贵的业力积分!:)“ />


于 2018-03-30T15:22:56.157 回答
19

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

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

或者可以让它更紧凑一点

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

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

于 2014-05-23T15:22:58.413 回答
19

以及使用递归的解决方案:

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
于 2013-11-27T10:31:57.907 回答
10

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

=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
于 2014-12-09T12:08:47.240 回答
9

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

如果您想要一个公式来避免宏,这里有一个适用于第 702 列的东西

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

其中 A1 是包含要转换为字母的列号的单元格。

于 2014-02-17T03:29:01.740 回答
9

这是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=> ""
于 2015-02-04T16:18:07.783 回答
7

最新更新:请忽略下面的功能,@SurasinTancharoen 设法提醒我它在n = 53.
对于那些感兴趣的人,以下是其他损坏的值n = 200

的某些值

请使用@brettdj 功能满足您的所有需求。它甚至适用于 Microsoft Excel 最新的最大列数限制:16384应该给出XFD

在此处输入图像描述

更新结束


以下功能由微软提供:

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 列号转换为字母字符

适用于

  • 微软办公软件Excel 2007
  • Microsoft Excel 2002 标准版
  • Microsoft Excel 2000 标准版
  • Microsoft Excel 97 标准版
于 2014-07-20T14:46:53.813 回答
5

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

Function outColLetterFromNumber(iCol as Integer) as String
    sAddr = Cells(1, iCol).Address
    aSplit = Split(sAddr, "$")
    outColLetterFromNumber = aSplit(1)
End Function
于 2014-03-20T18:43:32.647 回答
3

有一个非常简单的使用 Excel 功能的方法:使用Range.Cells.Address属性,这样:

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

这将返回第 1 行所需列的地址。取它的1

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

请注意,它是如此快速和强大,以至于您可以返回甚至存在的列地址!

使用属性替换lngRow所需的列号Selection.Column

于 2014-07-29T12:39:52.723 回答
2

无论位于 X 行、Y 列的单元格的一个代码行中的哪一列,这都将起作用:

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

如果您有一个具有唯一定义名称“Cellname”的单元格:

Mid(Cells(1,val(range("Cellname").Column)).Address, 2, instr(2,Cells(1,val(range("Cellname").Column)).Address,"$")-2)
于 2014-11-05T17:30:41.840 回答
2

这是一个简单的可以使用的衬里。

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

它只适用于 1 个字母的列名称,但它适用于简单的情况。如果您需要它专门用于 2 个字母的名称,那么您可以使用以下内容:

ColumnLetter = Mid(Cells(Row, LastColA).Address, 2, 2)
于 2014-08-26T14:15:33.093 回答
2

所以我在这里聚会迟到了,但我想提供另一个没有人解决但不涉及数组的答案。您可以通过简单的字符串操作来做到这一点。

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 版本的最后一个可能的列。

于 2018-12-27T23:51:48.537 回答
1

Easy way to get the column name

Sub column()

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

End Sub

I hope it helps =)

于 2014-11-11T12:09:03.123 回答
1

brettdj 的解决方案非常有效,但是如果您出于与我相同的原因将其视为潜在的解决方案,我想我会提供我的替代解决方案。

我遇到的问题是根据 MA​​TCH() 函数的输出滚动到特定列。我没有将列号转换为平行的列字母,而是选择暂时将参考样式从 A1 切换到 R1C1。这样我就可以滚动到列号,而不必使用 VBA 函数。要在两种参考样式之间轻松切换,您可以使用此 VBA 代码:

Sub toggle_reference_style()

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

End Sub
于 2015-02-12T18:07:37.113 回答
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
于 2017-03-04T22:36:16.400 回答
1

这里是 Pascal (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;
于 2017-09-08T11:00:21.290 回答
1

这是一个较晚的答案,仅用于使用 1-3 个字符列的简单Int()方法If

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
于 2016-05-28T21:56:30.297 回答
1

此公式将根据范围(即A1)给出列,其中范围是单个单元格。如果给出了多单元格范围,它将返回左上角的单元格。请注意,两个单元格引用必须相同:

MID(CELL("地址", A1 ),2,SEARCH("$",CELL("地址", A1 ),2)-2)

这个怎么运作:

CELL("property","range") 根据使用的属性返回范围的特定值。在这种情况下,单元格地址。address 属性返回一个值 $[col]$[row],即 A1 -> $A$1。MID 函数解析出 $ 符号之间的列值。

于 2018-01-31T18:49:22.100 回答
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

这个函数的权衡是,由于测试,它会比 brettdj 的答案慢得多IF。但是,如果该功能被重复使用很多次,就会感觉到这一点。

于 2016-03-19T04:52:09.697 回答
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
于 2016-02-04T11:16:16.450 回答
-1

这仅适用于 REFEDIT ...通常使用短版本的 uphere 代码...易于阅读和理解/它使用 $ 的 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
于 2016-03-19T17:02:41.703 回答
-1

列号中的列字母可以通过以下步骤使用公式提取
1. 使用 ADDRESS 公式计算列地址
2. 使用 MID 和 FIND 函数提取列字母

示例:
1. ADDRESS(1000,1000,1)
结果 $ALL$1000
2 . =MID(F15,2,FIND("$",F15,2)-2)
结果全部假设 F15 包含步骤 1 的结果

我们可以一口气写
MID(ADDRESS(1000,1000,1),2,FIND ("$",地址(1000,1000,1),2)-2)

于 2015-09-22T20:54:34.047 回答
-2

仅转换为 ascii 数字并使用 Chr() 转换回字母怎么样?

col_letter = Chr(Selection.Column + 96)

于 2016-07-15T15:41:06.353 回答
-2

Cap A 为 65,因此:

MsgBox Chr(ActiveCell.Column + 64)

发现于:http ://www.vbaexpress.com/forum/showthread.php?6103-Solved-get-column-letter

于 2016-03-30T09:31:28.440 回答
-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

}
于 2014-07-28T14:17:37.523 回答