J'ai besoin d'un algorithme pour convertir une lettre de colonne Excel en son bon numéro.
Le langage dans lequel cela sera écrit est C #, mais tout le monde le ferait ou même un pseudo-code.
Veuillez noter que je vais mettre cela en C # et je ne veux pas utiliser la DLL de bureau.
Pour "A", le résultat attendu sera 1
Pour 'AH' = 34
Pour '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();
Parcourez les caractères du dernier au premier. Multipliez la valeur de chaque lettre (A = 1, Z = 26) fois 26 ** N, ajoutez-la au total cumulé. Ma compétence de manipulation de chaînes en C # est inexistante, voici donc un pseudo-code très mélangé:
sum=0;
len=length(letters);
for(i=0;i<len;i++)
sum += ((letters[len-i-1])-'A'+1) * pow(26,i);
Voici une solution que j'ai écrite en JavaScript si quelqu'un est intéressé.
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);
Pourriez-vous peut-être le traiter comme un nombre de base 26, puis substituer des lettres à un nombre de base 26?
Donc en effet, votre chiffre le plus à droite sera toujours un nombre brut compris entre 1 et 26, et le reste du "nombre" (la partie gauche) est le nombre de 26 collecté? Donc A représenterait un lot de 26, B serait 2, etc.
Par exemple:
B = 2 = colonne 2 AB = 26 * 1(A) + 2 = colonne 28 BB = 26 * 2(B) + 2 = colonne 54 DA = 26 * 4(D) + 1 = colonne 105
etc
Je ne suis pas très satisfait de l'une des réponses, alors voici une version courte:
int col = "Ab".Aggregate(0, (a, c) => a * 26 + c & 31); // 28
ou mieux, pour ignorer les non A-Za-z
personnages:
int col = " !$Ab$3 ".Aggregate(0, (a, c) => (uint)((c | 32) - 97) > 25 ? a : a * 26 + c & 31); // 28
dans Excel VBA, vous pouvez utiliser le .Range
Méthode pour obtenir le nombre, comme ceci:
Dim rng as Range
Dim vSearchCol as variant 'your input column
Set rng.Thisworkbook.worksheets("mySheet").Range(vSearchCol & "1:" & vSearchCol & "1")
Utilisez ensuite .column
propriété:
debug.print rng.column
si vous avez besoin du code complet, voir ci-dessous:
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
Je suppose que cela fonctionne essentiellement à peu près de la même manière que certaines des autres réponses, mais cela peut rendre un peu plus clair ce qui se passe avec l'équivalent alpha d'un chiffre numérique. Ce n'est pas tout à fait un système de base 26 car il n'y a pas d'espace réservé 0. Autrement dit, la 26e colonne serait "A0" ou quelque chose au lieu de Z dans la base 26. Et ce n'est pas la base 27 parce que les "alpha-gits" ne représentent pas les pouvoirs de 27. Homme, cela vous fait vraiment apprécier ce bordel l'arithmétique devait être avant que les Babyloniens n'inventent le zéro!
UInt32 sum = 0, gitVal = 1;
foreach (char alphagit in ColumnName.ToUpperInvariant().ToCharArray().Reverse())
{
sum += gitVal * (UInt32)(alphagit - 'A' + 1)
gitVal *= 26;
}
Comme certains autres, j'ai inversé le tableau de caractères, donc je n'ai pas besoin de savoir quoi que ce soit sur les exposants.