IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Comment faire une méthode d'extension pour calculer une cellule Excel?


Sujet :

C#

  1. #1
    Membre éclairé
    Inscrit en
    Novembre 2004
    Messages
    417
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 417
    Par défaut Comment faire une méthode d'extension pour calculer une cellule Excel?
    Bonjour,
    Je souhaite partir de : string pos = "Z3";
    Et, en appliquant pos.Right(4), obtenir le nom de la cellule située à 4 colonnes sur la droite, à savoir "AD3".
    Ou, en appliquant pos.Left(2), obtenir "X3".
    Ou, en appliquant pos.Up(1), obtenir "Z2".
    Ou enfin, en appliquant pos.Down(2), obtenir "Z5".

    Je pense qu'il faut que je parte de cela:
    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
    static class MyExtensionMethods
        {
            public static string Right(this string value, int nb)
            {
                //TODO
            }
            public static string Left(this string value, int nb)
            {
                //TODO
            }
            public static string Up(this string value, int nb)
            {
                //TODO
            }
            public static string Down(this string value, int nb)
            {
                //TODO
            }
        }
    Mais je n'arrive pas à trouver une logique qui ne soit pas une usine à gaz pour faire le calcul.
    Si vous pouvez me donner la logique pour une des méthodes, j'arriverai à le reproduire pour les 3 autres méthodes.
    Merci pour votre aide.

  2. #2
    Membre émérite
    Avatar de dkmix
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    619
    Détails du profil
    Informations personnelles :
    Localisation : Jamaïque

    Informations forums :
    Inscription : Septembre 2007
    Messages : 619
    Par défaut
    Bonjour,
    ici
    soit :
    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
     
    public static class Extensions
    {
        public static string ColumnLabel(this int col)
        {
            var dividend = col;
            var columnLabel = string.Empty;
            int modulo;
     
            while (dividend > 0)
            {
                modulo = (dividend - 1) % 26;
                columnLabel = Convert.ToChar(65 + modulo).ToString() + columnLabel;
                dividend = (int)((dividend - modulo) / 26);
            } 
     
            return columnLabel;
        }
        public static int ColumnIndex(this string colLabel)
        {
            // "AD" (1 * 26^1) + (4 * 26^0) ...
            var colIndex = 0;
            for(int ind = 0, pow = colLabel.Count()-1; ind < colLabel.Count(); ++ind, --pow)
            {
                var cVal = Convert.ToInt32(colLabel[ind]) - 64; //col A is index 1
                colIndex += cVal * ((int)Math.Pow(26, pow));
            }
            return colIndex;
        }
    }
    dans votre code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
     public static string Right(this string value, int nb)
     {
            string col = Regex.Replace(value, "[0-9]", "");
            string li = Regex.Replace(value,@"[^\d]","");   
            int colInt = col.ColumnIndex();
           return    (colInt + nb).ColumnLabel() + li;
     }
    !! Pas testé

  3. #3
    Membre éclairé
    Inscrit en
    Novembre 2004
    Messages
    417
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 417
    Par défaut
    Merci beaucoup pour la réponse. Ca fonctionne pour l'instant!
    J'ai tout de même modifié comme ceci histoire de rester dans les limites des valeurs possibles d'excel:
    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
    public static string Right(this string value, int nb)
            {
                string col = Regex.Replace(value, "[0-9]", "");
                string li = Regex.Replace(value, @"[^\d]", "");
                int colInt = col.ColumnIndex();
                if (colInt + nb <= 16384)
                    return (colInt + nb).ColumnLabel() + li;
                else
                    throw new Exception("Incorrect value");
            }
     
            public static string Left(this string value, int nb)
            {
                string col = Regex.Replace(value, "[0-9]", "");
                string li = Regex.Replace(value, @"[^\d]", "");
                int colInt = col.ColumnIndex();
                if (colInt - nb >= 1)
                    return (colInt - nb).ColumnLabel() + li;
                else
                    throw new Exception("Incorrect value");
            }
     
            public static string Up(this string value, int nb)
            {
                string col = Regex.Replace(value, "[0-9]", "");
                string li = Regex.Replace(value, @"[^\d]", "");
                if (Int32.Parse(li) - nb >= 1)
                    return col + (Int32.Parse(li) - nb).ToString();
                else
                    throw new Exception("Incorrect value");
            }
     
            public static string Down(this string value, int nb)
            {
                string col = Regex.Replace(value, "[0-9]", "");
                string li = Regex.Replace(value, @"[^\d]", "");
                if (Int32.Parse(li) + nb <= 1048576)
                    return col + (Int32.Parse(li) + nb).ToString();
                else
                    throw new Exception("Incorrect value");
            }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2007] Syntaxe pour calculer une valeur et la renvoyer dans une autre feuille
    Par fabdu25 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 24/07/2014, 11h08
  2. Réponses: 0
    Dernier message: 21/11/2013, 17h35
  3. [XL-2000] Créer une oite de dialogue pour remplir des cellules excel
    Par lionel2b dans le forum Excel
    Réponses: 2
    Dernier message: 19/02/2010, 10h39
  4. Comment faire pour avoir une barre de chargement pour un SWF externe?
    Par rigolman dans le forum ActionScript 1 & ActionScript 2
    Réponses: 1
    Dernier message: 10/04/2009, 10h49
  5. Réponses: 1
    Dernier message: 31/10/2006, 11h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo