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

时间:2020-03-05 18:42:05  来源:igfitidea点击:

我们如何确定Excel中第n列的列名(例如" AQ"或者" BH")?

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

解决方案

回答

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

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());
}

回答

我目前正在使用它,但是我感觉可以对其进行优化。

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

回答

约瑟夫的代码不错,但是,如果我们不想或者不需要使用VBA函数,请尝试一下。

假设n的值在单元格" A2"中
使用此功能:

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

回答

我想我们需要VBA代码:

Public Function GetColumnAddress(nCol As Integer) As String

Dim r As Range

Set r = Range("A1").Columns(nCol)
GetColumnAddress = r.Address

End Function

回答

这些好人发布的所有这些代码示例看起来都不错。

有一件事情要注意。从Office 2007开始,Excel实际上最多有16,384列。转换为XFD(以前的256列最大值为IV)。我们将不得不对这些方法进行一些修改,以使它们适用于三个字符。

不应该那么难...

回答

语言不可知算法将如下所示:

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

如果再次升级Excel以处理超过16k的列,该算法也将考虑在内。如果我们确实想过高,可以传入一个添加值,并用另一个数字替换26个实例,以适应其他字母

回答

这就是我们在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

回答

这是加里·沃特斯(Gary Waters)的解决方案

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的注释(最高值= 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个字符,并且我们有一个类似于十六进制或者二进制的数字系统,只是带有一个不寻常的字符集(A..Z),在位置上表示26的幂:(26 ^ 2)(26 ^ 1)( 26 ^ 0)。

回答

这似乎在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

我拿了约瑟夫(Joseph's)并将其测试到BH,然后以980-1000喂食,看起来不错。

回答

= CHAR(64 + COLUMN())

回答

在VBA中,假设lCol是列号:

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

回答

IF(COLUMN()>=26,CHAR(ROUND(COLUMN()/26,1)+64)&CHAR(MOD(COLUMN(),26)+64),CHAR(COLUMN()+64))

这适用于2个字母列(直到" ZZ"列)。我们必须为3个字母列嵌套另一个if语句。

上面的公式在" AY"," AZ"列以及以下每个" nY"和" nZ"列中均无效。校正后的公式为:

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

回答

这是我可以提出的最干净正确的解决方案(使用Java,但可以使用自己喜欢的语言):

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

但是请让我知道如果我们在此代码中发现错误,谢谢。