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

时间:2012-10-09 09:33:40

标签: excel vba excel-udf

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

例如,输入 100 应返回CV

28 个答案:

答案 0 :(得分:188)

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

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

答案 1 :(得分:80)

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

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

答案 2 :(得分:42)

对我有用的东西是:

Cells(Row,Column).Address 

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

答案 3 :(得分:17)

I'm surprised nobody suggested: **<code></code> <code>Columns(</code>***<code>Column Index</code>***<code>).Address</code> <code></code>**

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

仅返回 专栏(s): Split((Columns( { {1}}的 Column Index

  • 例如: ).Address(,0)),":")(0) 返回 **<code>DAD</code>**

More Examples

答案 4 :(得分:16)

使用递归的解决方案:

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

答案 5 :(得分:16)

还有一种方法可以做到这一点。 Brettdj's answer让我想到了这一点,但是如果你使用这个方法你不必使用变量数组,你可以直接转到字符串。

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

或者可以使它更紧凑

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

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

答案 6 :(得分:9)

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

=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

答案 7 :(得分:8)

这是robartsd's answer的版本(风格为Jan Wijninckx's one line solution),使用递归而不是循环。

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=> ""

答案 8 :(得分:7)

最新更新:请忽略下面的功能,@ SurasinTancharoen设法提醒我它已在n = 53处断开。
对于那些感兴趣的人,以下是n = 200下面的其他破碎值:

Certain values of

Please use @brettdj function for all your needs. It even works for Microsoft Excel latest maximum number of columns limit: 16384 should gives XFD

enter image description here

END OF UPDATE


以下功能由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

来源:How to convert Excel column numbers into alphabetical characters

适用

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

答案 9 :(得分:6)

robertsd's code优雅,但要使其面向未来,请将n的声明更改为long type

如果你想要一个公式来避免使用宏,那么这里的内容可以达到第702列的含义

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

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

答案 10 :(得分:3)

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

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

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

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

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

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

答案 11 :(得分:3)

这是基于上述@DamienFennelly's answer的功能。如果你竖起大拇指,也要竖起大拇指! :P

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

答案 12 :(得分:2)

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

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

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

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

答案 13 :(得分:2)

无论您的一个代码行中哪个列位于第X行的第X行中的单元格,这都将有效:

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)

答案 14 :(得分: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

由于IF测试,这个函数的折衷是它会比brettdj的答案慢得多。但是如果该函数被重复使用了很长时间,就会感觉到这一点。

答案 15 :(得分:1)

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

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

工作原理:

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

答案 16 :(得分: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;

答案 17 :(得分:1)

function sumMakes(a, b, v) {
    for(var i = 0; i < a.length; i++) {
        for(var j = 0; j < b.length; j++) {
            if(a[i] + b[j] == v) {
                return true;
            }
        }
    }
    return false;
}

答案 18 :(得分: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

答案 19 :(得分:1)

来自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

答案 20 :(得分: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

答案 21 :(得分:0)

获取列名称的简便方法

Sub column()

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

End Sub

我希望它有帮助=)

答案 22 :(得分:0)

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

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开始计算第一个$,然后找到第二个{{1 }}使用$出现在字符串中,然后减去2减去该起始位置。

这为您提供了适应所有可能的列范围的好处。因此,InStr返回“ A”,而ColLetter(1)返回“ XFD”,这是我的Excel版本的最后一个可能的列。

答案 23 :(得分:-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

答案 24 :(得分:-1)

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

例如:
1.地址(1000,1000,1)
  结果$ ALL $ 1000
2. = MID(F15,2,FIND(“$”,F15,2)-2)
  结果ALL asuming F15包含步骤1的结果
我们可以一气呵成  MID(ADDRESS(1000,1000,1),2,FIND( “$”,ADDRESS(1000,1000,1),2)-2)

答案 25 :(得分:-2)

上限A是65所以:

MsgBox Chr(ActiveCell.Column + 64)

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

答案 26 :(得分:-2)

如何转换为ascii号并使用Chr()转换回字母呢?

col_letter = Chr(Selection.Column + 96)

答案 27 :(得分:-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

}