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 cellules non contigues avec une variable sur le n°ligne [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2017
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mars 2017
    Messages : 68
    Points : 42
    Points
    42
    Par défaut Selection de cellules non contigues avec une variable sur le n°ligne
    Bonjour à tous,
    Je voudrais selectionner des cellules non contiguës dans une même ligne définie par une variable.

    Exemple :
    J'utilise la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    selig = Selection.row
    Range(cells(selig,5)).select
    Je voudrais selectionner dans la même ligne (selig) les cellules de la colonne A,E,F,G,H,I,M,N par exemple.
    Je voudrais écrire ce code sur une seule ligne: comment écrire ce code ?

    Merci !

  2. #2
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    en les unissant une par une

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub toto()
    Dim Colonne(), Ligne As Long, Plage As Range
    Colonne = Array("A", "E", "B")
    Ligne = 3
        For Each c In Colonne
            If Not Plage Is Nothing Then
                Set Plage = Application.Union(Plage, Range(c & Ligne)) ' rattacher une feuille au Range()
            Else
                Set Plage = Range(c & Ligne) ' rattacher une feuille au Range()
            End If
        Next c
    Plage.Select
    End Sub

  3. #3
    Membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2017
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mars 2017
    Messages : 68
    Points : 42
    Points
    42
    Par défaut
    Cela me parait bien compliqué, je pensais aussi à
    Range(cells(selig,1,5-9)).select mais la syntaxe est incorecte
    ou
    Range("A1;E1").select mais cela ne marche pas comme je voudrais

  4. #4
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    il n'y a rien de compliqué, c'est le strict minimum si tu veux que ta procédure soit dynamique et facile à maintenir, puisque tout se passe dans tes deux variables Colonne et Ligne

    mais si c'est pas ton objectif, avec uniquement la ligne 7 de ma proposition, tu peux écrire une looooongue ligne de code qui remplace tout le reste et qui inclus tout tes Range(Colonne & Ligne) dans le Application.Union (attention aux limites, regarde bien l'aide ), une méthode pour unir des plages qui est impérative.


    tu peux même en faire une fonction de base, tu lui passes les colonnes et la ligne où faire l'union, très facile à utiliser

    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
    Sub toto()
    Dim MaPlage As Range
    Set MaPlage = Unis(Array("A", "E", "B"), 3)
        MaPlage.Select
    End Sub
     
    Function Unis(Colonne As Variant, Ligne As Long) As Range
    Dim Plage As Range
        For Each c In Colonne
            If Not Plage Is Nothing Then
                Set Plage = Application.Union(Plage, Range(c & Ligne))
            Else
                Set Plage = Range(c & Ligne)
            End If
        Next c
    Set Unis = Plage
    End Function

  5. #5
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    Bonjour,

    en une ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set pl = Intersect(Selection.EntireRow, [A:A, E:I, M:N])
    eric

  6. #6
    Membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2017
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mars 2017
    Messages : 68
    Points : 42
    Points
    42
    Par défaut
    Bonjour Eriic et merci pour ta réponse.
    Vu les réponses que vous me faites, çà ne répond pas à mes attentes, ou,j'ai du mal présenter mon problème.

    J'ai une liste d'adhérents dans un classeur classée par ordre alpha, avec sur la même ligne, le nom, prénom,adresse, code postal ,tel, catégorie, fonction, @mail, etc ...
    Je voudrais extraire un certain nombre de données concernant 1 adhèrent (donc sur la même ligne).
    Je sélectionne la cellule contenant le nom et en appuyant sur un bouton j'exécute une macro qui va extraire certaines données (pas toutes)de cet adhèrent.
    Copier ces données et les coller dans une autre feuille de calcul toujours sur une même ligne et sans "blancs".
    Début de la macro:
    (me donne le n° ligne de la cellule sélectionnée)
    Si je lance un apprentissage de la macro çà donne çà:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("A66,D66:I66,P66,S66:T66,W66").Select
    (selection manuelle des données à extraire de la ligne 66))
    Je voudrais écrire cette fonction en lui incluant la variable "selig" pour le n° de ligne.
    J'ai essayer avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range(cells(selig,1),cells(selig,5),cells(selig,6))
    mais suis très vite limité par le nombre d'élément et je ne sais comment m'y prendre pour inclure des éléments qui se suivent et/ou qui ne se suivent pas. la commande doit être envoyée en une seule fois pour avoir une sélection simultanée de ces cellules.
    En fin de compte je cherche la syntaxe de cette commande.
    Merci

  7. #7
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    Si c'est pour copier pas besoin de les sélectionner.
    Et si c'est pour les coller sans blanc il faut le faire par bloc de cellules contiguës :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Intersect(Selection.EntireRow, [A:C]).Copy Sheets("Feuil2").[A2]
    eric

  8. #8
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour (et un salut à eriic)

    Si tu avais compris le code que t'as montré eriic, tu l'aurais immédiatement adapté, ainsi, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set pl = Intersect(Rows(sellig), Range("A:A, E:I, M:N"))
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  9. #9
    Membre émérite
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 703
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Indre et Loire (Centre)

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

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 703
    Points : 2 813
    Points
    2 813
    Par défaut
    Bonjour,
    est-ce que ce sont toujours les mêmes colonnes qui doivent être copiées?
    Alors, si on copie de la feuil1 ver la feuil2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dim i As Long
        Dim n As Long
        i = ActiveCell.Row     'ligne à copier
        n = Sheets("feuil2").Cells(Rows.Count, 1).End(xlUp).Row + 1  'première ligne vide de feuil2
        With Sheets("feuil1")
            Sheets("feuil2").Range("A" & n).Value = .Range("A" & i).Value     'copie de feuil1 ver feuil2
            Sheets("feuil2").Range("B" & n).Value = .Range("D" & i).Value
        End With
    Cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("feuil2").Range("B" & n).Value = .Range("D" & i).Value
    doit être adaptée avec les bonnes colonnes. Il faut une ligne de code par colonne à recopier.

  10. #10
    Membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2017
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mars 2017
    Messages : 68
    Points : 42
    Points
    42
    Par défaut
    Merci à tous,
    Vous avez raison je n'ai pas tout compris mais la réponse de Unparia me convient parfaitement et fonctionne très bien

    Cela à parfaitement fonctionner au premier essai,
    Sauf que pour les essais suivants seule la première cellule est prise en compte, est copiée vers l'autre feuille.

  11. #11
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663

  12. #12
    Membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2017
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mars 2017
    Messages : 68
    Points : 42
    Points
    42
    Par défaut
    J'ai recopié en adaptant comme il est expliqué le code de Riaolle et çà marche très très bien.
    Je commence à en comprendre l'architecture.

    Merci à vous tous
    Cordialement

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 12/09/2014, 15h02
  2. Réponses: 2
    Dernier message: 13/02/2007, 17h40
  3. [debutant] get image avec une variable non static
    Par laguna dans le forum Langage
    Réponses: 2
    Dernier message: 06/03/2006, 15h57
  4. Requête selection avec une variable de date
    Par kahmsin dans le forum Access
    Réponses: 7
    Dernier message: 20/11/2005, 19h38
  5. Couleur de cellule XSL dynamique avec une variable
    Par Steff1985 dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 27/10/2005, 11h10

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