Bonjour,

Pour ceux qui ont besoin de travailler avec une numérotation "alphabétique", voici une classe statique ainsi que deux méthodes d'extension afin de faire la conversion int => colonne Excel et string => indice de colonne Excel

Comme les noms des méthodes d'extension le montrent, ce sera certainement le plus utile à ceux qui travaillent avec Excel, mais peut-être trouverez-vous d'autres champs d'application.

J'étais initialement parti sur un changement en base 26, mais je me suis heurté à un problème de poids : dans la numérotation A, B, C... Z, AA, AB, ... ZZ, AAA... il n'y a pas de notion de "zéro". Ce n'est donc pas une base à proprement parler. Et il se produit un décallage à chaque fois qu'on devrait rencontrer un chiffre zéro (avant A, entre Z et AA, il devrait y avoir un A0, etc.)

Il est certainement possible d'améliorer l'algo en utilisant des fonctions mathématiques, en prenant en compte le décalage, mais je n'ai plus assez de neurones en état de fonctionner pour chercher.
L'utilisation d'une classe static pour stocker les valeurs allant de A à ZZZ permet d'éviter de ré-générer la liste, ce qui est déjà une bonne optimisation.

Code complet : la première classe, qui m'a servi de test, utilise les éléments des classes suivantes, qui sont celles que vous devez reprendre dans votre code pour l'utiliser.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
 
using System;
using System.Collections.Generic;
 
namespace DigitToChar
{
    class Program
    {
        static void Main(string[] args)
        {
            int n;
            string s;
 
            n = 146;
            s = "EP";
            Console.WriteLine("Le nombre {0} a pour représentation colonne Excel {1}", n, n.ToExcelColumn());
            Console.WriteLine("La colonne Excel {0} a pour indice {1}", s, s.FromExcelColumn());
            Console.WriteLine();
 
            n = 26;
            s = "Z";
            Console.WriteLine("Le nombre {0} a pour représentation colonne Excel {1}", n, n.ToExcelColumn());
            Console.WriteLine("La colonne Excel {0} a pour indice {1}", s, s.FromExcelColumn());
            Console.WriteLine();
 
            n = 27;
            s = "AA";
            Console.WriteLine("Le nombre {0} a pour représentation colonne Excel {1}", n, n.ToExcelColumn());
            Console.WriteLine("La colonne Excel {0} a pour indice {1}", s, s.FromExcelColumn());
            Console.WriteLine();
 
            n = 1;
            s = "A";
            Console.WriteLine("Le nombre {0} a pour représentation colonne Excel {1}", n, n.ToExcelColumn());
            Console.WriteLine("La colonne Excel {0} a pour indice {1}", s, s.FromExcelColumn());
            Console.WriteLine();
 
            n = 18278;
            s = "ZZZ";
            Console.WriteLine("Le nombre {0} a pour représentation colonne Excel {1}", n, n.ToExcelColumn());
            Console.WriteLine("La colonne Excel {0} a pour indice {1}", s, s.FromExcelColumn());
            Console.WriteLine();
 
            Console.WriteLine("Comptage de AP à PI");
            for (int i = "AP".FromExcelColumn(), nb = "PI".FromExcelColumn(); i <= nb; i++)
            {
                Console.Write(i.ToExcelColumn());
                Console.Write(' ');
            }
            Console.WriteLine();
 
            Console.ReadKey(true);
        }
    }
 
    public static class IntExtension
    {
        public static string ToExcelColumn(this int n)
        {
            if (n < 1)
            {
                throw new Exception("Les colonnes Excel sont numérotées à partir de 1.");
            }
            if (n > DigitsToChars.chars.Count)
            {
                throw new Exception(string.Format("Le programme ne sais pas compter au delà de {0} colonnes. Estimez-vous heureux, Excel est limité à 256 !", DigitsToChars.chars.Count));
            }
            return DigitsToChars.chars[n - 1];
        }
    }
 
    public static class StringExtension
    {
        public static int FromExcelColumn(this string s)
        {
            if (s.Length == 0 || s.Length > 3)
            {
                throw new Exception("La chaîne doit faire entre 1 et 3 caractères.");
            }
 
            return DigitsToChars.chars.IndexOf(s) + 1;
        }
    }
 
    public static class DigitsToChars
    {
        public static List<string> chars;
 
        static DigitsToChars()
        {
            chars = new List<string>();
 
            for (int i = 0; i < 26; i++)
            {
                chars.Add(string.Format("{0}", (char)(65 + i)));
            }
 
            for (int i = 0; i < 26; i++)
            {
                for (int j = 0; j < 26; j++)
                {
                    chars.Add(string.Format("{0}{1}", (char)(65 + i), (char)(65 + j)));
                }
            }
 
            for (int i = 0; i < 26; i++)
            {
                for (int j = 0; j < 26; j++)
                {
                    for (int k = 0; k < 26; k++)
                    {
                        chars.Add(string.Format("{0}{1}{2}", (char)(65 + i), (char)(65 + j), (char)(65 + k)));
                    }
                }
            }
        }
    }
}