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 :

Selection de lignes non contigues


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de dj-julio
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 745
    Par défaut Selection de lignes non contigues
    Bonjour,
    Dans une feuille Excel, j'ai besoin de sélectionner plusieurs lignes non contigues.
    J'obtiens le numéro de ces lignes par une variable (qu'on appellera : "LigneASuppr").
    Je boucle afin d'instencier ma variable qui contiendra toutes les lignes à sélectionner (cette variable sera : "RangeTotal").
    Voilà une partie de mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    RangeTotal = ""
    For t = 1 To UBound(TableauValeurs) 'On boucle dans le tableau
      LigneASuppr = TableauValeurs(t) 'On récupère la ligne à vider de la feuille "ARCHIVES"
      RangeTotal = RangeTotal & ", A" & LigneASuppr & ":T" & LigneASuppr
    Next t
    En faisant cela, j'obtiens bien la liste des lignes à sélectionner, sous la forme :
    RangeTotal = A28598:T28598, A28599:T28599, A28600:T28600, A28601:T28601, A28602:T28602
    Si maintenant, je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Range(RangeTotal).Select
    il me renvoi l'erreur :
    "Erreur d'exécution '1004': La méthode 'Range' de l'objet '_Worksheet' a échoué"
    J'ai donc essayé de faire directement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Range("A28598:T28598, A28599:T28599, A28600:T28600, A28601:T28601, A28602:T28602").Select
    J'imagine donc que l'erreur peut venir du fait que dans ma variable "RangeTotal", je n'ai pas les guillemets de début et de
    fin.
    J'ai donc fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    RangeTotal = ""
    For t = 1 To UBound(TableauValeurs) 'On boucle dans le tableau
      LigneASuppr = TableauValeurs(t) 'On récupère la ligne à vider de la feuille "ARCHIVES"
      RangeTotal = RangeTotal & ", A" & LigneASuppr & ":T" & LigneASuppr
    Next t
    RangeTotal = Chr(34) & RangeTotal & Chr(34)
    Range(RangeTotal).Select
    Le Chr(34) étant là pour mettre les guillemets, mais le problème persiste et l'erreur reste la même.
    Merci d'avance de votre aide !!

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Regarde Set Plage = Application.union(Range(Range1),Range(Range2),...) dans l'aide, tu pourras instancier ta plage sans pb.
    Où range1,Range2 sont des string correspondant aux adresses successives (sont des variables, donc pas de guillemets)

  3. #3
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Par défaut
    Bonjour,
    Bonjour Ouskel'n'or, j'étais aussi persuadé qu'il fallait employer Union pour lier des plages non contigües, et ben non! , voulant faire un test j'ai fait une macro automatique et voila ce qu'elle m'a donné...pour des lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub CopieLigne()
        Range("3:3,7:7,11:11,16:16,20:20").Select
        Selection.Copy
        Rows("24:24").Select
        ActiveSheet.Paste
    End Sub
    Et bizarement... cà fonctionne.
    A+

  4. #4
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Bien sûr que ça fonctionne mais...
    Citation Envoyé par dj-julio qui a dit
    Je boucle afin d'instencier ma variable qui contiendra toutes les lignes à sélectionner
    Elle est où l'instance si tu fais ça ?
    Je guette ta réponse
    A+

  5. #5
    Membre chevronné Avatar de dj-julio
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 745
    Par défaut
    Citation Envoyé par LeForestier Voir le message
    Bonjour,
    Bonjour Ouskel'n'or, j'étais aussi persuadé qu'il fallait employer Union pour lier des plages non contigües, et ben non! , voulant faire un test j'ai fait une macro automatique et voila ce qu'elle m'a donné...pour des lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub CopieLigne()
        Range("3:3,7:7,11:11,16:16,20:20").Select
        Selection.Copy
        Rows("24:24").Select
        ActiveSheet.Paste
    End Sub
    Et bizarement... cà fonctionne.
    A+
    Oui ça marche très bien en faisant ça
    Mais c'est à partir du moment où je remplace le " 3:3,7:7,11:11,16:16,20:20 " par "RangeTotal" que ça bug :'(

    J'ai essayé la technique proposée par "ouskel'n'or" mais je n'y arrive pas :s
    je ne comprends pas trop

    Si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Plage = Application.Union(Range("A20:T20"), Range("A28:T28")).Select
    ça fonctionne, mais je ne vois pas comment faire pour l'adapter à mon code :s
    Je vais chercher un peu plus au boulot dans pas longtemps

    merci encore

    P.S : pour "instancier", petite erreur de vocabulaire tu as bien compris ce que je voulais mettre

  6. #6
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Set Plage = Application.union(Range("A28598:T28598"),Range("A28599:T28599"),Range("A28600:T28600"),Range("A28601:T28601"),Range("A28602:T28602 "))
    For each Cel in Plage
         'là je n'ai pas compris ce que tu voulais faire mais pour avoir les lignes
         'dans une variable de type string, c'est ça
         Lignes = Lignes & Cell.rows & ","
    Next
    Lignes = left(Lignes, Len(Lignes) -1)
    Pas testé, tu veux bien le faire pour nous ?
    Maintenant, si tu veux que "Lignes" soit également l'instance d'un range, tu dis
    A+

  7. #7
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Par défaut
    Je crois qu'il y a un qui propos dans sont exposé, il parle de supprimé des lignes... et il détermine la ligne avec des coordonnées de colonnes ?
    Pour moi, une ligne c'est par ex: 3:3 ou encore 7:7, sinon ce n'est pas une ligne mais une sélection.
    Pourrais- tu nous dire si tu a des données passé la colonne T ?
    Sinon, enlève les références aux colonnes et cà fonctionnerra, dans le cas contraire, emploi l'exemple de Ouskel'n'or.
    A+
    EDIT:
    Pour supprimé des lignes (ou des colonnes) pas de problème, mais si tu veux 'SUPPRIME' des plages il faut employer un delete spécial avec le sens de suppression, (j'ai pas la commande en tête)
    EDIT2
    J'obtiens le numéro de ces lignes par une variable (qu'on appellera : "LigneASuppr").
    Si j'interprète ta variable, ces lignes sont à supprimés ?, si oui, pourquoi ne pas les supprimés au fur et à mesure de leurs détections sans passer par un regroupement ?

  8. #8
    Membre chevronné Avatar de dj-julio
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 745
    Par défaut
    Alors ce que je veux faire c'est :

    1) Sélectionner toutes les lignes que me renvoie ma variable "LigneASuppr" (cf mon 1er message).
    2) Supprimer ces lignes

    -> J'arrive bien à récupérer mes lignes
    -> Je n'arrive pas à les sélectionner de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    RangeTotal = ""
    For t = 1 To UBound(TableauValeurs) 'On boucle dans le tableau
          LigneASuppr = TableauValeurs(t) 'On récupère la ligne à vider de la feuille "ARCHIVES"
           If t = 1 Then
                 RangeTotal = "A" & LigneASuppr & ":T" & LigneASuppr
           Else
                 RangeTotal = RangeTotal & ", A" & LigneASuppr & ":T" & LigneASuppr
           End If
    Next t
    Range(RangeTotal).Select
    -> Je sais les supprimer.

    De cette façon je ne sais pas comment faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Plage = Application.Union(??? RangeTotal ???).Select
    Merci

    P.S : je ne supprime pas les lignes au fur et à mesure parce que ça me créait des problèmes :s donc j'ai décidé de le faire à la fin de tout

    Après ma colonne T il n'y a rien effectivement.

    Pour les supprimer je ferais comme ça :

    C'est pour ça que je cherche à selectionner (ça fonctionne pareil, mais ça m'évite d'avoir toutes les données à resaisir après).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Range(RangeTotal).Delete xlShiftUp

  9. #9
    Membre chevronné Avatar de dj-julio
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 745
    Par défaut
    Lol j'ai du mal à me faire comprendre

    Tout ce que tu as fais au dessus j'y arrive très bien
    Je bloque en fait là où il faudrait que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Set Plage = Application.Union(Range("A28598:T28598"), Range("A28600:T28600"))
    Soit en fait rempli grace à ma boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Set Plage = Application.Union(??, ??...)
    Je rappelle que j'ai ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    RangeTotal = ""
    For t = 1 To UBound(TableauValeurs) 'On boucle dans le tableau
                LigneASuppr = TableauValeurs(t) 'On récupère la ligne à vider de la feuille "ARCHIVES"
          If t = 1 Then
                    RangeTotal = "A" & LigneASuppr & ":T" & LigneASuppr
          Else
                     RangeTotal = RangeTotal & ", A" & LigneASuppr & ":T" & LigneASuppr
          End If
    Next t
    Là, la variable "RangeTotal" me ramène bien une suite de lignes comme ça :
    A28598:T28598, A28599:T28599, A28600:T28600, A28601:T28601, A28602:T28602
    Dans mon appli, les lignes ne se suivent pas obligatoirement

  10. #10
    Membre chevronné Avatar de dj-julio
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 745
    Par défaut
    Petit up

    En fait, je ne sais pas pourquoi on est parti sur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Plage = Application.Union(Range("A28598:T28598"), Range("A28600:T28600"))
    Alors que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Range("A28598:T28598, A28599:T28599, A28600:T28600, A28601:T28601, A28602:T28602").Select
    Fonctionne

    Là où ça ne fonctionne pas, c'est si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    For t = 1 To UBound(TableauValeurs) 'On boucle dans le tableau
          LigneASuppr = TableauValeurs(t) 'On récupère la ligne à vider de la feuille "ARCHIVES"
          If t = 1 Then
                RangeTotal = "A" & LigneASuppr & ":T" & LigneASuppr
          Else
                 RangeTotal = RangeTotal & ", A" & LigneASuppr & ":T" & LigneASuppr
          End If
    Next t
    'RangeTotal me ramène : A28598:T28598, A28599:T28599, A28600:T28600, A28601:T28601, A28602:T28602
    Range(RangeTotal).Select

  11. #11
    Membre Expert
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 572
    Détails du profil
    Informations personnelles :
    Âge : 62
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 572
    Par défaut
    si je peux me permettre un petit commentaire a la lumière de la lecture du post dans son ensemble.
    Citation Envoyé par dj-julio
    Alors ce que je veux faire c'est :

    1) Sélectionner toutes les lignes que me renvoie ma variable "LigneASuppr" (cf mon 1er message).
    2) Supprimer ces lignes
    ça c'est un probleme traité des dizaines de fois
    Citation Envoyé par dj-dj-julio également
    P.S : je ne supprime pas les lignes au fur et à mesure parce que ça me créait des problèmes :s donc j'ai décidé de le faire à la fin de tout
    et ça également.
    les problemes en question seraient t'y pas que si on supprime la ligne 2, la ligne 3 deviens la ligne 2 et ça décale tout? parce que si c'est ça, tout le monde ( a part dj-julio peut etre) connais la solution.
    solution 1 on supprime tout ensemble ce qui oblige a selectionner toutes ces plages en, même temps
    solution 2. on part de la fin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    For t =  UBound(TableauValeurs) to 1
    row(TableauValeurs(t) ).entirerow.delete
    Next t
    

  12. #12
    Membre chevronné Avatar de dj-julio
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 745
    Par défaut
    Et je déclare alsimbad chamion de la réponse
    je vais faire ça en commençant par la fin ^^
    j'y avais pas pensé :s
    merci

  13. #13
    Membre chevronné

    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    453
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 453
    Par défaut
    Envoyé par alsimbad :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    For t =  UBound(TableauValeurs) to 1
    row(TableauValeurs(t) ).entirerow.delete
    Next t
    on devrait ajouter Step - 1 à la suite de To 1, non?

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

Discussions similaires

  1. [2010] selection et Trie automatique de ligne non vide
    Par py86acces dans le forum Microsoft Office
    Réponses: 1
    Dernier message: 04/11/2014, 20h04
  2. [XL-2007] Actions sur plages / cellules non contigues définies à partir d'une ligne active
    Par Barbenault dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 06/10/2014, 12h33
  3. [XL-2007] Probleme de selection de lignes et de colonnes non contigues
    Par coco.on.off dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 07/08/2014, 14h55
  4. Boucle If Then avec lignes non contigues
    Par Floflo19 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 04/04/2014, 17h10
  5. VBA Traiter les lignes selectionnées (contigues et non contigues)
    Par 0uistyty dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 16/01/2012, 17h57

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