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 :

Dernière ligne d'un tableau


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2011
    Messages
    260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2011
    Messages : 260
    Par défaut Dernière ligne d'un tableau
    Apparemment la méthode MonRange.end(xldown) ne marche pas s'il y a des cellules vides entre les cellules remplies... dans ce cas elle va renvoyer la première cellule remplie avant la première cellule vide////

    Ici en admettant que mon_range est cette colonne, mon_range.end(xldown) va renvoyer 2.... or j'attends 3.... Si quelqu'un a une explication simple pour obtenir la valeur 3.. Merci :

    4
    5
    4
    4
    2

    1
    3

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut.

    Le principe est de partir de tout en bas de la feuille et de remonter pour "buter" sur la dernière cellule remplie d'une colonne


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("a1048576").end(xlup)
    Pour être compatible toutes versions, tu peux utiliser le code suivant, avec sh pointant vers une feuille de travail valide.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("a" & sh.Rows.Count).End(xlUp)
    Souvent, pour ce genre de recherche, il est préférable d'utiliser un tableau structuré. La dernière cellule se trouve alors encore plus facilement, et l'ajout d'une nouvelle ligne au tableau aussi.

    Attention avec certains raccourcis que je voie parfois sur les forums!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("a" & Rows.Count).End(xlUp)
    Est un code qui ne fonctionnera que si la feuille active est une feuille de travail. Le code plantera si la feuille active est une feuille de graphe, par exemple. Idem en préfixant Rows avec ActiveSheet, qui doit aussi pointer vers une feuille de travail.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  3. #3
    Membre très actif
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2011
    Messages
    260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2011
    Messages : 260
    Par défaut
    Merci pour cette réponse, effectivement ça marche bien.

    Maintenant, dans la même logique, je souhaiterais trouver le numéro de ligne correspondant à la valeur trouvée. Mais s'il y a d'autres valeurs identiques à celle-ci, range.find me renvoit la première trouvée (en partant du haut) or je souhaite la dernière.

    ex:
    -- A
    1 1648
    2 1345
    3 1922
    4 3000
    5 2100
    6 2033
    7 3000

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lastValue = Range("a" & Rows.Count).End(xlUp)
    me renvoie 3000

    Mais si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RlineFin = Range("a").Find(lastValue)
    me renvoie 4 et non pas 7 comme je souhaite.

    La solution doit être identique (xlUp ou Previous) mais je n'y arrive pas.

  4. #4
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Salut

    Peux-tu expliquer un peu plus globalement ce que tu souhaites faire?

    Si tu veux le numéro de la dernière ligne il te faut écrire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim lgLastRow as long
     
    lgLastRow = Feuil1.Range("a" & Feuil1.Rows.Count).End(xlUp).row
    Je rejoins Pierre (que je salue ) sur l'utilisation des tableaux structurés qui à mon sens facilite grandement l'écriture du code.

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  5. #5
    Membre très actif
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2011
    Messages
    260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2011
    Messages : 260
    Par défaut
    Un grand

    Mais j'ai marqué résolu un peu vite.

    Voici ma situation:
    j'ai une table dans cette feuille, que je redimensionne en fonction de la dernière valeur trouvée dans la première colonne (avec votre méthode).

    Donc quand j'ajoute une donnée à la fin de la première colonne, pas de soucis, elle est détectée, et je peux agrandir ma table.

    Par contre, lorsque je supprime à nouveau cette donnée, votre méthode me renvoie toujours la dernière cellule du tableau, même si elle est vide à présent.
    Donc je pense que cette méthode considère comme remplie toute cellule occupée par un objet (ici la table), même si cette cellule est textuellement vide.

    Je veux donc une méthode qui me renvoie la dernière cellule avec une valeur écrite dedans et non la dernière cellule occupée par un objet.


    Mon code se trouve dans le worksheet change de la feuille en question.

  6. #6
    Membre très actif
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2011
    Messages
    260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2011
    Messages : 260
    Par défaut
    Je m'en suis donc sorti comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
       Set Rc = MaTable.Range ' attention, ici la 1ere ligne est celle des titres
       Set Rtd = MaTable.ListColumns(1).Range
       ncols = MaTable.listColumns.count
     
       derline = Range("A" & Rows.Count).End(xlUp).Row
     
       While IsEmpty(Rtd.Cells(derline))
          derline = derline - 1
       Wend
     
       ' On redimensionne le tableau à partir de la dernière ligne des abscisses remplie
        Set Rc = Rc.Resize(derline, ncols)
        MaTable.Resize Rc
    Mais je trouve pas ça très Tsaresque....

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    C'est parce que tu utilises justement un tableau structuré.

    Au lieu de vider la cellule, supprime la ligne du tableau, et tu n'auras pas ce problème.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Puisque tu travailles avec un tableau structuré, utilise ce tableau en VBA plutôt que la feuille entière.

    Le code suivant renvoie la dernière cellule de la première colonne du tableau appelé Tableau1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    range("tableau1").ListObject.ListColumns(1).databodyrange(range("tableau1").Rows.Count)
    Si tu connais le nom de la colonne dont tu cherches la dernière valeur, tu peux utiliser ceci pour pointer vers la dernière cellule d'une colonne particulière
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    range("tableau1[prénom]")(range("tableau1[prénom]").Count)
    Puisque les codes ci-dessus renvoient une cellule, tu peux utiliser derrière les propriétés et méthodes liées à un objet Range. Tu peux aussi attribuer l'objet à un objet cellule

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim rng As Range
    Set rng = range("tableau1[prénom]")(range("tableau1[prénom]").Count)

    Si tu souhaites supprimer la dernière ligne du tableau, tu peux utiliser ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    range("tableau1").ListObject.ListRows(range("tableau1").Rows.Count).Delete
    Tu peux aussi bien sûr utiliser un objet ListObject qui facilite la manipulation et la lecture du code. Voici un code qui utilise un objet ListObject ET un objet Range
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub Test1()
      Dim ls As ListObject
      Dim rng As Range
     
      Set ls = Range("tableau1").ListObject ' Affectation du tableau structuré à une variable
      Set rng = ls.ListColumns(1).DataBodyRange(ls.ListRows.Count) ' Affectation de la dernière cellule de la première colonne du tableau à un objet
      Debug.Print rng.Address ' Utilisation de l'objet Range récupéré
      Debug.Print rng.Value ' Utilisation de l'objet Range récupéré
      ls.ListRows(ls.ListRows.Count).Delete ' Suppression de la dernière ligne du tableau
    End Sub
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  9. #9
    Membre habitué
    Femme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Décembre 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2018
    Messages : 10
    Par défaut réponse simple et efficace .Offset(1,0)
    Rajoute simplement .offset(1,0) cela décale ta sélection d'une ligne vers le bas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mon_range.end(xldown).offset(1,0)

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

Discussions similaires

  1. Sélectionner l'avant dernière ligne d'un tableau quelconque
    Par Erwan Narcos dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 11/01/2010, 12h25
  2. Réponses: 9
    Dernier message: 25/03/2009, 13h45
  3. 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
  4. 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
  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