将列号转换为字母的函数?

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

例如,input100应该返回CV

像这样回到第100列的字母

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

testing代码

 Sub Test() MsgBox Col_Letter(100) End Sub 

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

 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 

对我有用的东西是:

 Cells(Row,Column).Address 

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

而使用recursion的解决scheme:

 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 

还有一个方法来做到这一点。 brettdj的回答让我想到了这一点,但如果你使用这种方法,你不必使用variables数组,你可以直接转到一个string。

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

或者可以使它更紧凑一点

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

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

最新更新 :请忽略下面的function,@SurasinTancharoen设法提醒我,它是坏了n = 53
对于那些有兴趣的人来说,下面是n = 200以下的其他值:

某些值

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

在这里输入图像说明

更新结束


以下function由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 

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

适用于

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

这是可以通过使用一个公式:

 =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 

罗伯茨的代码是优雅的,但要使其具有前瞻性,将n的声明改为long

如果你想要一个公式来避免macros,这是一些工作到702列(含)

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

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

这是robartsd的版本(具有Jan Wijninckx的单行解决scheme的味道),使用recursion而不是循环。

 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 

我已经用以下inputtesting了这个:

 1 => "A" 26 => "Z" 27 => "AA" 51 => "AY" 702 => "ZZ" 703 => "AAA" -1 => "" -234=> "" 

有一个非常简单的使用Excel电源的方法:使用Range.Cells.Address属性,这种方式:

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

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

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

请注意,它非常快速而强大,您可以返回即使存在的列地址!

使用Selection.Column属性replacelngRow所需的列号!

这是一个简单的可以使用的单线程。

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

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

 ColumnLetter = Mid(Cells(Row, LastColA).Address, 2, 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) 

这是基于@ DamienFennelly上面的答案的function。 如果你给我竖起大拇指,也给他竖起大拇指! :P

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

来自brettdj的解决scheme非常有效,但是如果您将这个解决scheme作为一个潜在的解决scheme出于同样的原因,我认为我会提供替代解决scheme。

我遇到的问题是根据MATCH()函数的输出滚动到特定列。 我不是将列号转换成平行的列字母,而是select暂时将参考样式从A1切换到R1C1。 这样我就可以滚动到列号,而不必沉迷于VBAfunction。 要轻松切换两种引用样式,您可以使用此VBA代码:

 Sub toggle_reference_style() If Application.ReferenceStyle = xlR1C1 Then Application.ReferenceStyle = xlA1 Else Application.ReferenceStyle = xlR1C1 End If End Sub 

简单的方法来获取列名称

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

我希望它有助于=)

 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 

在brettdj答案进一步,这里是使列号的input可选。 如果省略了列号input,则函数返callback用该函数的单元格的列字母。 我知道这也可以使用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 

这个函数的折衷是因为IFtesting,它会比brettdj的答案慢得多。 但是,如果function被重复使用了很多次,这可能会感觉到。

这是一个迟到的答案,只是简单的方法使用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 
 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 

这里用一个简单的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; 

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

例:
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)

这只是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 

那么只要转换为ASCII码,并使用Chr()转换回一个字母?

col_letter = Chr(Selection.Column + 96)

第A章是65,所以:

MsgBox Chr(ActiveCell.Column + 64)

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

这是另一种方式:

 { 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 }