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

Macros et VBA Excel Discussion :

Sélectionner l'avant dernière ligne d'un tableau quelconque


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Janvier 2010
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Sélectionner l'avant dernière ligne d'un tableau quelconque
    Bonjour,

    Alors voilà, à la suite d'un cours en Informatique sur Excel, on nous a demandé de commencer à manipuler les macros, mais non pas seulement en les enregistrant, mais aussi en écrivant en VBA.

    Après avoir fait l'exercice normal, j'ai voulu compliquer la chose - et oui, je suis casse-tête. En effet, j'aimerais pouvoir sélectionner l'avant dernière ligne du tableau que j'ai créé, sans connaître son rang, parce que je vais ajouter des lignes dans ce dernier, et non pas après.

    J'ai déjà réussi à insérer une ligne avant cette dernière ligne du tableau en utilisant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Cells(16384, 2).End(xlUp).Select
    Selection.EntireRow.Insert
    Maintenant, j'aimerais pouvoir faire un collage spécial - d'incrémentation - dans une case d'une colonne spécifique, mais dans la ligne qui a été insérée. Je sais faire l'incrémentation avec des cases définies, mais pour aller jusqu'à cette ligne que l'on a insérée, je ne sais pas ni ne vois pas comment faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Range("A4:A5").Select
    Selection.AutoFill Destination:=Range("A4:A7"), Type:=xlFillDefault
    Si quelqu'un a une idée pour m'aider... ^^

    Merci d'avance !

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Points : 2 443
    Points
    2 443
    Par défaut
    Salut Erwan Narcos et le forum
    Bienvenue
    Alors voilà, à la suite d'un cours en Informatique sur Excel, on nous a demandé de commencer à manipuler les macros, mais non pas seulement en les enregistrant, mais aussi en écrivant en VBA.
    C'est comme ça que tout le monde commence : en enristrant des macros, puis en écrivant le code directement. Le fait de suivre un cours ne fait malheureusement pas tout. Certains enseignants devraient combleraient certaines de leurs lacunes

    Par principe, quand tu viens demander des améliorations, je te conseillerais de donner toute ta macro : pas la peine d'aider sur une partie, si le reste pose un problème. Excel a toujours une infinité de manières de résoudre un problème, et la macro en intégralité permet soit de continuer sur la même idée, soit de la remanier intégralement.
    On va partir du principe que tu débute complêtement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Cells(16384, 2).End(xlUp).Select
    Selection.EntireRow.Insert
    Ouais, ouais, et ton prof ne t'a même pas corrigé ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cells(16384, 2).End(xlUp).
    Litteralement : dernière cellule de la colonne B avant un changement d'état (vide ou non) en partant de la ligne 16384 et en remontant.
    En règle générale, on part d'une cellule dont on est sûr de l'état, ainsi que la ligne précédente : la dernière cellule de la colonne : 65536, pour les versions précédente et Rows.count, pour la version 2007 et plus.
    Pour faire court :
    si les lignes 16384 et 16383 sont vides, on a la dernière ligne non vide de la colonne B
    Si les lignes 16384 et 16383 ne sont pas vides, on a la dernière cellule vide avant la ligne 16383.

    Tu utilises un Select/selection : ça ralentit ta macro, ce n'est que rarement utile et ça peut induire une erreur.
    Ce que j'aurais mis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cells(Rows.Count, "B").End(xlUp).EntireRow.Insert
    On ne peut pas dire que ce soit fondamentalement différent.
    après, on doit choisir la ligne qu'on vient d'insérer : Il y a plusieurs solutions, qui tournent toutes autour de la dernière ligne : en reprenant ton exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("A4:A5").AutoFill Destination:=Range("A4:A7")
    Deux remarques :
    - On vient de créer une ligne en nous servant de la colonne B en référence et ça n'apparaît nulle part.
    - On recopie avec incrémentation 2 lignes, à partir de la ligne 4
    Mais comme on a qu'un extrait de macro, je ne vais m'occuper que de la destination : début : A4
    Fin : avant dernière ligne en B : on peut l'écrire de différente manière, passer par des variables, etc... mais comme on a pas toute la macro, je propose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Destination:=Range("A4:A" & Cells(Rows.count, "B").end(XlUp).row-1)
    Ça marche dans pratiquement tous les cas, comme notation. On peut utiliser aussi d'autres notations :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Destination:=Range("A4:A" & Cells(Rows.count, "B").end(XlUp)(0).row)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Destination:=Range([A4], Cells(Rows.count, "B").end(XlUp).Offset(-1,0))
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Destination:=Range([A4], Cells(Rows.count, "B").end(XlUp)(0))
    Pour me répéter, les méthodes et les notations dépendent de celui qui fait le code. Certains préfèrent telle ou telle manière de rédiger le code, et toutes sont plus ou moins similaires. Elles dépendent surtout de leurs lisibilités pour le codeur.
    A+
    PS Comme c'est une simple explication, je n'ai pas testé. Et des oublis de parenthèses ne sont pas à exclurent.

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Janvier 2010
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    Merci pour cette réponse, en effet, mon prof ne m'avait pas corrigé, car avec ma partenaire, on avait cherché sur Internet et qu'il ne connaissait pas : ce n'est pas un expert en Excel.

    Voici mon code en entier, en fait il n'y a pas grand chose de plus que ce que j'avais déjà donné :

    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
     
        Range("D3").Select
        ActiveCell.FormulaR1C1 = "0"
        Selection.AutoFill Destination:=Range("D3:D6"), Type:=xlFillDefault
     
        Range("E3").Select
        ActiveCell.FormulaR1C1 = "0"
        Selection.AutoFill Destination:=Range("E3:E6"), Type:=xlFillDefault
     
        Range("A4:A5").Select
        Selection.AutoFill Destination:=Range("A4:A7"), Type:=xlFillDefault
    'Avant modification
     
         Range("D7").Select 'Ici, la case D7 se rempli avec "0", mais cela sera la case D(avant dernière ligne) qui devrait se remplir
        ActiveCell.FormulaR1C1 = "0"
     
         Range("B7").Select 'Idem
        ActiveCell.FormulaR1C1 = "Nouveau"
     
        Range("D6:G6").Select 'Pour coller les formules dans ces cases jusqu'en G(avant dernière ligne aussi)
        Selection.AutoFill Destination:=Range("D6:G7"), Type:=xlFillDefault

    Voilà ce qui était.

    Mais maintenant, avec ceci :

    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
    Range("D3").Select
        ActiveCell.FormulaR1C1 = "0"
        Selection.AutoFill Destination:=Range("D3:D6"), Type:=xlFillDefault
     
        Range("E3").Select
        ActiveCell.FormulaR1C1 = "0"
        Selection.AutoFill Destination:=Range("E3:E6"), Type:=xlFillDefault
     
        Cells(Rows.Count, "B").End(xlUp).EntireRow.Insert
     
        X = Cells(Rows.Count, "B").End(xlUp).Row - 1
     
        Range("A4:A5").Select
        Selection.AutoFill Destination:=Range("A4:A" & X), Type:=xlFillDefault
     
        Range("B" & X).Select
        ActiveCell.FormulaR1C1 = "Nouveau"
     
        Range("D" & X).Select
        ActiveCell.FormulaR1C1 = "0"
     
        Range("D6:G6").Select
        Selection.AutoFill Destination:=Range("D6:G" & X), Type:=xlFillDefault
    J'ai fait un peu des recherches sur le net, puisque tu as parlé de variable, et j'ai réussi à faire ceci. Je ne suis pas du tout expert en programmation, je ne savais pas qu'on pouvait stocker des cellules dans une variable ^^'

    Tout fonctionne donc, merci beaucoup pour ton aide !

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Points : 2 443
    Points
    2 443
    Par défaut
    Salut Erwan Narcos et le forum

    Le premier truc qu'on apprend avec Excel, c'est... qu'il faut être feignant : moins tu écris, moins il y a d'erreurs et plus c'est lisible. La lisibilité d'un code est essentielle : tu corriges les erreurs beaucoup plus vite. Et, à moins d'être un génie... t'en auras besoin.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Range("D3").Select
        ActiveCell.FormulaR1C1 = "0"
        Selection.AutoFill Destination:=Range("D3:D6"), Type:=xlFillDefault
    Tu inscris le chiffre "0" en formule dans ta cellule D3 que tu rend active, puis tu la recopie jusqu'en D6.

    Pourquoi sélectionner ? ça sert pas à grand chose.
    Pourquoi utiliser la propriété FormulaR1C1 ? Tu veux juste mettre un 0 en D3.

    Ma macro :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub test_1()
    Dim X As Long
    Cells(Rows.Count, "B").End(xlUp).EntireRow.Insert
    X = Cells(Rows.Count, "B").End(xlUp).Row - 1
     
    Range("B" & X) = "Nouveau"
    Range("D" & X) = 0
    Range("A4:A5").AutoFill Destination:=Range("A4:A" & X)
    Range("D6:G6").AutoFill Destination:=Range("D6:G" & X)
    End Sub
    Pas de différences essentielles dans le code, à part l'organisation du code.

    En premier les définitions (pour moi, associées avec l'obligation de les définir) : dans ton code, tu ne définis pas la nature de X : ce n'est pas une cellule mais une ligne => elle peut donc avoir une valeur supérieure à 32767 et donc est définie en Long.

    Puis la Mise à l'État Initial : on fixe les variables

    Puis le traitement

    Puis la remise en état

    Toujours pareil : on pourrait parler d'esthérique, mais ce qui m'interesse, c'est toujours la lisibilité. Et reprendre une macro complexe et longue, des années après, t'apprend que plus s'est organisé, plus c'est facile. Plus le code est complexe, plus je le documentes. Les commentaires aident beaucoup, pour comprendre une astuce "géniale" .

    La même macro en utilisant la cellule et non la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub test_1()
    Dim X As Range
    Cells(Rows.Count, "B").End(xlUp).EntireRow.Insert
    Set X = Cells(Rows.Count, "B").End(xlUp)(0)
     
    Cells(X.Row, "B") = "Nouveau"
    Range("D" & X.Row) = 0
    Range("A4:A5").AutoFill Destination:=Range("A4:A" & X.Row)
    Range("D6:G6").AutoFill Destination:=Range("D6:G" & X.Row)
    End Sub
    Je n'utilise les "Formula" que lorsque j'ai besoin d'une formule, pas lorsque j'injecte une valeur. Et comme je suis français, avec un Excel en français, j'utilise ".FormulaLocal" et ".FormulaR1C1Local". Là, pas besoin, la propriété par défaut d'une plage (Range) étant ".Value", je mets directement la valeur.

    J'utilise de préférence toujours la même notation des cellules : Range("A" et X). Quand j'ai un compteur pour les colonnes, ou que je veux attirer l'attention sur une cellules, j'utilise Cells(X, Y). pour la colonne, si elle est fixe, j'utilise les lettres : perso, 68 et moins "parlant" que "BP".
    Quand j'ai besoin de raccourcir, j'utilise [A1], mais outre que je ne sais pas coder de variable avec (sauf avec Offset), Excel boude et ne donne pas de listes.

    Pour progresser, une fois la base plus ou moins connue, je te conseille de lire des sujets et de voir comment ils sont résolus. Poser des questions sur le sujet ne devrait pas poser de problème (sauf si c'est un sujet trop ancien). On est tous pareils : expliquer en quoi on est extraordinaire ne rebute personne . Tant que ça ne devient pas trop fastidieux.
    A+

Discussions similaires

  1. Sélectionner l'avant dernière ligne
    Par hammag dans le forum SQL
    Réponses: 8
    Dernier message: 20/07/2011, 10h11
  2. Comment trouver la dernière ligne de mon tableau?
    Par thenico35 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 03/03/2009, 14h35
  3. Tester quelle est la dernière ligne d'un tableau pour la remplir ?
    Par drthodt dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 29/07/2008, 13h26
  4. [MySQL] Sélectionner les 5 dernières lignes
    Par Empty_body dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 08/07/2007, 12h04
  5. [CSS] Dernière ligne d'un tableau
    Par GLDavid dans le forum Mise en page CSS
    Réponses: 6
    Dernier message: 28/07/2006, 15h23

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