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 :

Etendre ActiveCell à une sélection multiple [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Contrôleur de gestion
    Inscrit en
    Avril 2014
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Contrôleur de gestion
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Avril 2014
    Messages : 31
    Par défaut Etendre ActiveCell à une sélection multiple
    Bonjour à tous,

    J'espère pouvoir trouver sur ce forum des réponses à mes questions. Je vous remercie par avance pour le temps que vous me consacrerez.

    Je dispose d'une macro très simple dont le but est de copier / coller une formule d'une plage aux coordonnées fixes vers une plage définie par l'utilisateur (identifier grâce à Active cell).

    Pour améliorer ma macro, j'aimerais que cette macro ne s'applique pas seulement à la cellule active mais à une sélection d'une à plusieurs celulles.

    Voici un fichier pour illustrer mon problème Test.xlsm

    PS : si l'on se positionne sur une ligne (ligne 9 par exemple), la macro s'applique. J'aimerais pouvoir faire fonctionner la macro en boucle sur l'ensemble des lignes que sélectionnerait l'utilisateur, or si je sélectionne les lignes 9 et 10, la macro ne s'applique que sur la ligne 9.

    Il y a une contrainte (identifiée en colonne B), si il y a une "x", la macro s'arrête. J'aimerais que la commande s'applique sur chaque ligne sélectionnée en intégrant cette contrainte (si "x", tu appliques le code, si pas de "x", tu passes à la ligne suivante... etc jusqu'à la dernière ligne sélectionnée).

    Donc à ce jour, la macro fonctionne mais l'utilisateur doit faire la manipulation ligne à ligne, ce qui est un peu fastidieux.

    Merci d'avance

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 173
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    La sélection d'une cellule ou d'une plage de cellules est représentée par l'objet Selection et ActiveCell est l'objet représentant la cellule active. C'est exactement ce qui se passe lorsque l'on sélectionne manuellement une plage de cellules.
    Il y a une contrainte (identifiée en colonne B), si il y a une "x", la macro s'arrête. J'aimerais que la commande s'applique sur chaque ligne sélectionnée en intégrant cette contrainte (si "x", tu appliques le code, si pas de "x", tu passes à la ligne suivante... etc jusqu'à la dernière ligne sélectionnée).
    Pour cela, il faut utiliser une structure conditionnelle telle que If ou Select...Case
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Membre averti
    Homme Profil pro
    Contrôleur de gestion
    Inscrit en
    Avril 2014
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Contrôleur de gestion
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Avril 2014
    Messages : 31
    Par défaut
    Bonjour Philippe,

    Oui je comprends l'utilisation de ActiveCell que j'exploite dans mon code pour identifier la ligne active sur laquelle appliquer mon code.
    J'ai aussi utilisé IF pour conditionner l'application de ce code.

    Je ne comprends cependant pas comment appliquer ce code sur une sélection "active", je sélectionne les lignes 2 à 10, mon code s'applique sur la ligne 2, puis la ligne 3... jusqu'à la ligne 10...

    C'est là que je bloque.

    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
    Sub Macro()
     
    Dim L As Long, R As Range
    L = ActiveCell.Row
     
    Application.ScreenUpdating = False
     
    If Cells(L, 2) <> "x" Then Exit Sub
     
    For Each R In Range("D7,F7,H7,J7,L7")
    R.Copy Cells(L, R.Column)
     
    Next
     
    Calculate
    Application.ScreenUpdating = True
     
    End Sub

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 173
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    J'ai aussi utilisé IF pour conditionner l'application de ce code.
    Je n'ai pas examiné l'ensemble de ta procédure mais est-ce normal de faire le test de la présence d'un X en dehors de la boucle ?
    D'après moi, non
    Je ne comprends cependant pas comment appliquer ce code sur une sélection "active", je sélectionne les lignes 2 à 10, mon code s'applique sur la ligne 2, puis la ligne 3... jusqu'à la ligne 10...
    D'après ma première lecture, tu sélectionnes une colonne sur deux et seulement la ligne 7 ("Range("D7,F7,H7,J7,L7")").
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  5. #5
    Membre averti
    Homme Profil pro
    Contrôleur de gestion
    Inscrit en
    Avril 2014
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Contrôleur de gestion
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Avril 2014
    Messages : 31
    Par défaut
    Philippe,

    Le test de condition "X" devrait effectivement être intégré dans la boucle, mais pour l'instant je n'arrive pas à créer cette boucle à l'intérieur d'une sélection de plage.

    Donc la plage de référence qui contient les formules à copier est fixe (1 colonne sur 2 et la ligne 7). Pour cela pas de problème. Le code doit donc faire un copier/ coller très basique de cette plage de référence ("Range("D7,F7,H7,J7,L7")"), vers une plage dont les coordonnées sont déterminés par la ligne active.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    For Each R In Range("D7,F7,H7,J7,L7")
    R.Copy Cells(L, R.Column)
    .

    Le défi, c'est de pouvoir copier ces formules vers une première ligne (corresponsant à la première ligne de ma sélection), puis de passer à la ligne suivante et ce jusqu'à la dernière ligne selectionnée par l'utilisateur.

    Si en plus, la condition rentrait dans la boucle, alors ce serait parfait, mais bon ce n'est pas là le véritable enjeu.

    Je suis un bricoleur en VBA, je n'ai aucune formation, donc mes préoccupations peuvent paraître futiles et j'essaie de progresser via des forums comme celui-ci...
    Merci encore du temps que tu consacres à mon post.

  6. #6
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 173
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Si j'ai bien compris, tu voudrais copier des lignes d'une plage de cellules contiguës en les insérant dans des cellules non contiguës. J'avoue ne pas très bien saisir la finalité de cette procédure.
    Voici en guise d'exemple, une procédure qui parcourt des cellules non contiguës (K2, K4, K6 et K8) et qui affiche un message si une de ces cellules contient un "X"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     Dim c As Range
     For Each c In Range("K2,K4,K6,K8")
      If LCase(Trim(c)) = "x" Then MsgBox "Un x à l'adresse " & c.Address
     Next
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 652
    Par défaut
    Bonjour,

    Essayez avec votre code modifié
    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
    Sub Macro()
    Dim Plage As Range
    Dim C As Range
    Dim L As Long
    Dim R As Range
    '---
    If TypeName(Selection) <> "Range" Then Exit Sub
    Set Plage = Selection
    Application.ScreenUpdating = False
    '---
    For Each C In Plage
      L = C.Row
      If Cells(L, 2) = "x" Then
        For Each R In Range("D7,F7,H7,J7,L7")
          R.Copy Cells(L, R.Column)
        Next R
      End If
    Next C
    '---
    Calculate
    Application.ScreenUpdating = True
    End Sub

  8. #8
    Membre averti
    Homme Profil pro
    Contrôleur de gestion
    Inscrit en
    Avril 2014
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Contrôleur de gestion
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Avril 2014
    Messages : 31
    Par défaut
    Merci PMO2017,

    Mille excuses, je n'avais pas vu ton message, toute aide est précieuse, je regarde cela tout de suite.

    C'est exactement ce qu'il me fallait. Je suis confus de n'avoir pas vu ton message plus tôt. Je te remercie encore, tu me rends un grand service. Non seulement mon fichier est optimisé, mais en plus j'ai appris quelquechose.

    Merci

    PS : merci aussi à Philippe d'avoir essayé de me comprendre.

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

Discussions similaires

  1. Utiliser une sélection multiple comme critère de requête
    Par Sébastien Le Goyet dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 03/04/2007, 14h40
  2. Réponses: 2
    Dernier message: 28/02/2007, 20h20
  3. Glisser/Déposer une sélection multiple
    Par mxh77 dans le forum 4D
    Réponses: 1
    Dernier message: 28/09/2006, 11h41
  4. Réponses: 2
    Dernier message: 24/08/2006, 11h33
  5. Réponses: 5
    Dernier message: 04/07/2006, 11h19

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