gor*_*ric 30 language-agnostic algorithm excel
您如何确定Excel中第n列的列名(例如"AQ"或"BH")?
编辑:一种语言无关的算法,以确定这是这里的主要目标.
Jos*_*ant 40
我曾经写过这个函数来执行那个确切的任务:
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());
}
Run Code Online (Sandbox Code Playgroud)
Sam*_*det 26
这是我能提出的最清晰的正确解决方案(用Java编写,但随意使用您喜欢的语言):
String getNthColumnName(int n) {
String name = "";
while (n > 0) {
n--;
name = (char)('A' + n%26) + name;
n /= 26;
}
return name;
}
Run Code Online (Sandbox Code Playgroud)
但如果您在此代码中发现错误,请告诉我,谢谢.
Jas*_*n Z 11
语言无关的算法如下:
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
Run Code Online (Sandbox Code Playgroud)
此算法还会考虑Excel是否再次升级以处理超过16k列.如果你真的想要超越,你可以传递一个额外的值,并用另一个数字替换26的实例,以容纳替代字母表
小智 7
谢谢你,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
Run Code Online (Sandbox Code Playgroud)
约瑟夫的代码很好但是,如果你不想或不需要使用VBA函数,试试这个.
假设n的值在单元格中A2
使用此函数:
=MID(ADDRESS(1,A2),2,LEN(ADDRESS(1,A2))-3)
Run Code Online (Sandbox Code Playgroud)