如何find与给定整数对应的Excel列名称?

您如何确定Excel中第n列的列名(例如“AQ”或“BH”)?

编辑:一个语言不可知的algorithm来确定这是这里的主要目标。

我曾经写过这个函数来执行这个确切的任务:

public static string Column(int column) { column--; if (column >= 0 && column < 26) return ((char)('A' + column)).ToString(); else if (column > 25) return Column(column / 26) + Column(column % 26 + 1); else throw new Exception("Invalid Column #" + (column + 1).ToString()); } 

这里是我能想到的最干净的正确的解决scheme(在Java中,但随意使用你最喜欢的语言):

 String getNthColumnName(int n) { String name = ""; while (n > 0) { n--; name = (char)('A' + n%26) + name; n /= 26; } return name; } 

但是,请让我知道,如果你在这个代码中发现一个错误,谢谢。

语言不可知论algorithm如下:

 function getNthColumnName(int n) { let curPower = 1 while curPower < n { set curPower = curPower * 26 } let result = "" while n > 0 { let temp = n / curPower let result = result + char(temp) set n = n - (curPower * temp) set curPower = curPower / 26 } return result 

该algorithm还考虑了Excel是否再次升级以处理超过16k列。 如果你真的想过度的话,你可以传递一个额外的价值,并用另一个数字代替26的实例来容纳替代字母

谢谢,Joseph Sturtevant! 你的代码完美工作 – 我需要在VBScript中,所以我想分享我的版本:

 Function ColumnLetter(ByVal intColumnNumber) Dim sResult intColumnNumber = intColumnNumber - 1 If (intColumnNumber >= 0 And intColumnNumber < 26) Then sResult = Chr(65 + intColumnNumber) ElseIf (intColumnNumber >= 26) Then sResult = ColumnLetter(CLng(intColumnNumber \ 26)) _ & ColumnLetter(CLng(intColumnNumber Mod 26 + 1)) Else err.Raise 8, "Column()", "Invalid Column #" & CStr(intColumnNumber + 1) End If ColumnLetter = sResult End Function 

约瑟夫的代码是好的,但是,如果你不想或不需要使用VBAfunction,试试这个。

假设n的值在单元格A2使用此函数:

 =MID(ADDRESS(1,A2),2,LEN(ADDRESS(1,A2))-3) 
 IF(COLUMN()>=26,CHAR(ROUND(COLUMN()/26,1)+64)&CHAR(MOD(COLUMN(),26)+64),CHAR(COLUMN()+64)) 

这工作2字母列(直到ZZ栏)。 你必须嵌套另一个if语句3个字母的列。

上面的公式在列AYAZ和以下每个nYnZ列都失败。 修正的公式是:

 =IF(COLUMN()>26,CHAR(ROUNDDOWN((COLUMN()-1)/26,0)+64)&CHAR(MOD((COLUMN()-1),26)+65),CHAR(COLUMN()+64) 

从wcm:

如果你不想使用VBA,你可以用你想要的数字replacecolnr

 =MID(ADDRESS(1,colnr),2,LEN(ADDRESS(1,colnr))-3) 

请注意,由于使用ADDRESS函数,此公式是不稳定的。 易失性函数是在每次更改后由excel重新计算的函数。 通常,excel仅在其相关参考更改时重新计算公式。

这可能是一个性能杀手,使用这个公式。

这里是从VBScript版本到SQL Server 2000+的转换。

 CREATE FUNCTION [dbo].[GetExcelColRef] ( @col_seq_no int ) RETURNS varchar(5) AS BEGIN declare @Result varchar(5) set @Result = '' set @col_seq_no = @col_seq_no - 1 If (@col_seq_no >= 0 And @col_seq_no < 26) BEGIN set @Result = char(65 + @col_seq_no) END ELSE BEGIN set @Result = [dbo].[GetExcelColRef] (@col_seq_no / 26) + '' + [dbo].[GetExcelColRef] ((@col_seq_no % 26) + 1) END Return @Result END GO 

ruby单行:

 def column_name_for(some_int) some_int.to_s(26).split('').map {|c| (c.to_i(26) + 64).chr }.join # 703 => "AAA" end 

它将整数转换为base26,然后分割它,并做一些math转换每个字符从ascii。 最后join他们全部回来。 没有除法,模数或recursion。

乐趣。

这在MS Excel 2003-2010中工作正常。 应该支持以前的版本支持单元格(…)。 地址function:

  1. 第28栏 – 取columnNumber=28 ; Cells(1, columnNumber).Address返回"$AB$1"
  2. $符号进行拆分将返回数组: ["","AB","1"]
  3. 所以Split(Cells(1, columnNumber).Address, "$")(1)为您提供了列名"AB"

更新:

采取从如何将Excel列号转换成字母字符

 ' The following VBA function is just one way to convert column number ' values into their equivalent alphabetical characters: 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 

这篇文章中的信息适用于:Microsoft Office Excel 2007 SE / 2002 SE / 2000 SE / 97 SE

我想你需要VBA代码:

 Public Function GetColumnAddress(nCol As Integer) As String Dim r As Range Set r = Range("A1").Columns(nCol) GetColumnAddress = r.Address End Function 

这就是你想要的VBA

 Function GetNthExcelColName(n As Integer) As String Dim s As String s = Cells(1, n).Address GetNthExcelColName = Mid(s, 2, InStr(2, s, "$") - 2) End Function 

这似乎在vb.net工作

 Public Function Column(ByVal pColumn As Integer) As String pColumn -= 1 If pColumn >= 0 AndAlso pColumn < 26 Then Return ChrW(Asc("A"c) + pColumn).ToString ElseIf (pColumn > 25) Then Return Column(CInt(math.Floor(pColumn / 26))) + Column((pColumn Mod 26) + 1) Else stop Throw New ArgumentException("Invalid column #" + (pColumn + 1).ToString) End If End Function 

我接受了约瑟夫的testing,然后喂了980-1000,看起来不错。

在VBA中,假定lCol是列号:

 function ColNum2Letter(lCol as long) as string ColNum2Letter = Split(Cells(1, lCol).Address, "$")(0) end function 

所有这些好人都贴的代码示例看起来很好。

有一件事要注意。 从Office 2007开始,Excel实际上最多有16,384列。 这意味着XFD(旧的最大256列是IV)。 你将不得不修改这些方法,使他们的工作三个字符。

不应该那么辛苦…

这是加里沃特斯的解决scheme

 Function ConvertNumberToColumnLetter2(ByVal colNum As Long) As String Dim i As Long, x As Long For i = 6 To 0 Step -1 x = (1 - 26 ^ (i + 1)) / (-25) - 1 ' Geometric Series formula If colNum > x Then ConvertNumberToColumnLetter2 = ConvertNumberToColumnLetter2 & Chr(((colNum - x - 1)\ 26 ^ i) Mod 26 + 65) End If Next i End Function 

通过http://www.dailydoseofexcel.com/archives/2004/05/21/column-numbers-to-letters/

考虑wcm(top = xfd)的评论,你可以这样计算;

 function IntToExcel(n: Integer); string; begin Result := ''; for i := 2 down to 0 do begin if ((n div 26^i)) > 0) or (i = 0) then Result := Result + Char(Ord('A')+(n div (26^i)) - IIF(i>0;1;0)); n := n mod (26^i); end; end; 

字母表中有26个字符,我们有一个hex或二进制的数字系统,只是一个不寻常的字符集(A..Z),表示位置上的26:(26 ^ 2)(26 ^ 1)( 26 ^ 0)。

FYI T-SQL将给定一个序号(从零开始)的Excel列名称,作为单个语句。

低于0或高于16,383(Excel2010中的最大列数)返回NULL。

 ; WITH TestData AS ( -- Major change points SELECT -1 AS FieldOrdinal UNION ALL SELECT 0 UNION ALL SELECT 25 UNION ALL SELECT 26 UNION ALL SELECT 701 UNION ALL SELECT 702 UNION ALL SELECT 703 UNION ALL SELECT 16383 UNION ALL SELECT 16384 ) SELECT FieldOrdinal , CASE WHEN FieldOrdinal < 0 THEN NULL WHEN FieldOrdinal < 26 THEN '' WHEN FieldOrdinal < 702 THEN CHAR (65 + FieldOrdinal / 26 - 1) WHEN FieldOrdinal < 16384 THEN CHAR (65 + FieldOrdinal / 676 - 1) + CHAR (65 + (FieldOrdinal / 26) - (FieldOrdinal / 676) * 26 - 1) ELSE NULL END + CHAR (65 + FieldOrdinal % 26) FROM TestData ORDER BY FieldOrdinal 

我目前使用这个,但我有一种感觉,它可以被优化。

 private String GetNthExcelColName(int n) { String firstLetter = ""; //if number is under 26, it has a single letter name // otherwise, it is 'A' for 27-52, 'B' for 53-78, etc if(n > 26) { //the Converts to double and back to int are just so Floor() can be used Double value = Convert.ToDouble((n-1) / 26); int firstLetterVal = Convert.ToInt32(Math.Floor(value))-1; firstLetter = Convert.ToChar(firstLetterValue + 65).ToString(); } //second letter repeats int secondLetterValue = (n-1) % 26; String secondLetter = Convert.ToChar(secondLetterValue+65).ToString(); return firstLetter + secondLetter; } 

= CHAR(64 + COLUMN())

Interesting Posts