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 habitué
    Inscrit en
    Novembre 2004
    Messages
    415
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 415
    Points : 138
    Points
    138
    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 éprouvé
    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
    Points : 924
    Points
    924
    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 habitué
    Inscrit en
    Novembre 2004
    Messages
    415
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 415
    Points : 138
    Points
    138
    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