将Excel列字母转换为其数字的algorithm是什么?
我需要一个algorithm来将Excel列字母转换为适当的数字。
这将被写入的语言是C#,但任何会做,甚至伪代码。
请注意,我将把这个在C#中,我不想使用办公室的DLL。
对于'A'预期的结果将是1
对于'AH'= 34
对于“XFD”= 16384
public static int ExcelColumnNameToNumber(string columnName) { if (string.IsNullOrEmpty(columnName)) throw new ArgumentNullException("columnName"); columnName = columnName.ToUpperInvariant(); int sum = 0; for (int i = 0; i < columnName.Length; i++) { sum *= 26; sum += (columnName[i] - 'A' + 1); } return sum; }
int result = colName.Select((c, i) => ((c - 'A' + 1) * ((int)Math.Pow(26, colName.Length - i - 1)))).Sum();
int col = colName.ToCharArray().Select(c => c - 'A' + 1). Reverse().Select((v, i) => v * (int)Math.Pow(26, i)).Sum();
循环遍历从最后到第一个字符。 乘以每个字母的值(A = 1,Z = 26)乘以26 ** N,加上一个正在运行的总数。 我在C#中的string操作技巧是不存在的,所以这里是一些非常混合的伪代码:
sum=0; len=length(letters); for(i=0;i<len;i++) sum += ((letters[len-i-1])-'A'+1) * pow(26,i);
你可能会把它看作是一个基数为26的数字,然后用一个基数为26的数字来替代字母?
所以实际上,你最右边的数字总是一个1到26之间的原始数字,“数字”的剩余部分(左边部分)是26个数字的收集数量? 所以A代表26个中的一个,B代表2个等等。
举个例子:
B = 2 =第2列 AB = 26 * 1(A)+ 2 =第28列 BB = 26 * 2(B)+ 2 =第54列 DA = 26 * 4(D)+1 = 105列
等等
如果有人感兴趣,这是我用JavaScript写的一个解决scheme。
var letters = "abc".toUpperCase(); var sum = 0; for(var i = 0; i < letters.length;i++) { sum *= 26; sum += (letters.charCodeAt(i) - ("A".charCodeAt(0)-1)); } alert(sum);
我对任何答案都不满意,所以这里是一个简短的版本:
int col = "Ab".Aggregate(0, (a, c) => a * 26 + c & 31); // 28
或更好,忽略非A-Za-z
字符:
int col = " !$Ab$3 ".Aggregate(0, (a, c) => (uint)((c | 32) - 97) > 25 ? a : a * 26 + c & 31); // 28
在Excel VBA中,您可以使用.Range
方法获取数字,如下所示:
Dim rng as Range Dim vSearchCol as variant 'your input column Set rng.Thisworkbook.worksheets("mySheet").Range(vSearchCol & "1:" & vSearchCol & "1")
然后使用.column
属性:
debug.print rng.column
如果你需要完整的代码见下面:
Function ColumnbyName(vInput As Variant, Optional bByName As Boolean = True) As Variant Dim Rng As Range If bByName Then If Not VBA.IsNumeric(vInput) Then Set Rng = ThisWorkbook.Worksheets("mytab").Range(vInput & "1:" & vInput & "1") ColumnbyName = Rng.Column Else MsgBox "Please enter valid non Numeric column or change paramter bByName to False!" End If Else If VBA.IsNumeric(vInput) Then ColumnbyName = VBA.Chr(64 + CInt(vInput)) Else MsgBox "Please enter valid Numeric column or change paramter bByName to True!" End If End If End Function
我想这基本上和其他一些答案一样,但是它可能会更清楚地说明一个数字的阿尔法相当于什么。 这不是一个基地26系统,因为没有0占位符。 也就是说,第26列将是“A0”,或者是基数26中的Z而不是基数。而且它不是基数27,因为“alpha-gits”不代表27次方。男人真的让你明白什么是混乱算术必定是在巴比伦人发明零之前!
UInt32 sum = 0, gitVal = 1; foreach (char alphagit in ColumnName.ToUpperInvariant().ToCharArray().Reverse()) { sum += gitVal * (UInt32)('A' - alphagit + 1); gitVal *= 26; }
像其他人一样,我将字符数组反转,所以我不需要知道指数的任何内容。
你们需要在广场外思考。 你不需要这样复杂的编码。 以下公式提供了相同的答案
= MID(ADDRESS(ROW(),COLUMN()); 2,FIND( “$”,ADDRESS(ROW(),COLUMN()),2)-2)
此公式将为您提供您所在的任何列的列字母。轻松适应,将参考更改为另一列。