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 :

deplacer une plage en fonction de la valeur d'une cellule [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 17
    Points : 6
    Points
    6
    Par défaut deplacer une plage en fonction de la valeur d'une cellule
    Bonjour,

    Toutes les semaines (le lundi matin) je dois effectuer un copier-coller d'une plage de cellule pour l'incrémenter d'une colonne (nouvelle semaine). Je répète cette action sur 70 pages dans mon fichier, ce qui devient fastidieux... Je suis sous Excel 2007 en anglais.

    J'ai voulu créer la Macro suivante (exemple sur 2 feuilles):

    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
    Sheets("Mara").Select
        Range("FB98:FD112").Select     \sélection de la plage souhaitée sur la semaine précédente S-1
        Selection.Copy
        Range("FC98").Select        \je me décale d'une colonne (semaine en cours)
        ActiveSheet.Paste
        Range("FB98:FB110").Select     \je supprime la plage résiduelle de S-1
        Selection.ClearContents
     
        Sheets("Roma (new)").Select
        Range("CD96:CF110").Select
        Selection.Copy
        Range("CE96").Select
        ActiveSheet.Paste
        Range("CD96:CD112").Select
        Selection.ClearContents
    Je pensais que l'incrémentation serait automatique (chaque semaine, repartir sur la plage en cours, et la décaler d'une colonne, mais malheureuement la macro ne fait que copier-coller les plages que je lui ai indiquees, sans se decaller chaque semaine.

    1/ Sauriez vous comment faire pour que la plage copiée soit incrémentée d'une colonne chaque semaine ?

    2/ J'avais aussi une autre idée pour arriver au résultat : Mes colonnes sont numérotées en fonction des semaines (ex : "18/04>22/04" pour cette semaine qui est sur la cellule FB1 pour ma feuille "Mara" et sur la cellule CD1 pour ma feuille "Roma").

    Est-il possible que la macro réalise un copier-coller de la plage voulue sur la colonne de la semaine en cours ? (p-e via une fonction Address/Match ou Vlookup en cherchant la référence "18/04>22/04" ?)


    Merci pour votre aide et vos suggestions. Vos propositions sont plus que bien venues

  2. #2
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Essaies ceci pour le 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Sheets("Mara").Range("FB98:FD112").Insert
    Sheets("Roma (new)").Range("CD96:CF110").Insert
    Pour le 2, il faut donner plus de précision sur la structuration de ta feuille.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Merci pour la proposition.

    Intéressant et beaucoup plus simple que ce que j avais fait effectivement.

    Cette macro fait bien un "copier-coller" de ma plage, mais comme c'est un insert, ma plage se décale de 3 colonnes (elle-même en fait), au lieu de ne se décaler que d'une seule colonne.

    Est il possible d'affiner cette formule avec par ex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Sheets("Mara (new)").Range("FB98:FD112").Insert(-2)
        Sheets("Roma (new)").Range("CD96:CF110").Insert(-2)
    Pour reculer de 2 colonnes l'insertion ?

    Merci encore pour le coup de main.

    je vais essayer en ajoutant simplement une plage de une colonne et pas 3, juste avant la plage que je veux deplacer. Ca solutionnera p-e ce pb...

  4. #4
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Décale seulement la première colonne (les autres à droite suivront)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Sheets("Mara").Range("FB98:FB112").Insert
    Sheets("Roma (new)").Range("CD96:CD110").Insert

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Alors,

    La macro suivante décale bien ma plage de 1 colonne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Sheets("Mara").Range("FB98:FB112").Insert
    Sheets("Roma (new)").Range("CD96:CD110").Insert


    Par contre, s agissant d'une fonction insert, le formules contenues dans les cellules de la plage a déplacer ne sont pas incrémentées comme le ferait la fonction copier-coller...

    Les formules de ces cellules se rapportent a la colonne de la semaine en cours (gestion de trésorerie), et doivent donc suivre cette incrémentation...

    Merci pour ton aide, ca m a permis de faire évoluer ma réflexion.

    A priori j'ai trouve la solution suivante qui semble marcher pour 1 des feuilles (je vais essayer de l appliquer a mes 70 feuilles maintenant) :

    J'ai écrit ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sheets("Mara").Select
    Range("FA98:ii112").Select
    Selection.Copy
    Range("FB98").Select
    ActiveSheet.Paste

    Comme la sélection de plage est très grande, (jusqu'à ii112, voir plus si jamais j'en ai besoin), je ne suis plus restreint a la plage des 3 colonnes que je souhaite.

    En parallèle, ma colonne FA98 est vierge, lors du copier-coller il décale a chaque fois la colonne précédente qui reste vierge.

    J'essaie d'appliquer ca en grandeur nature pour valider.

  6. #6
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Certes, il est désormais judicieux d'être plus précis (un fichier test sera le bien venu).
    Et vu le nombre de feuilles, combien de lignes de code tu auras à écrire!!!
    Ne serait t-il pas utile de faire un code générique et l'appliquer en boucle à tes feuilles?
    Ça sera plus facile pour le codage et sa maintenance, mais pour cela, la structuration de tes feuilles devra suivre une certaine logique d'organisation.

    PS: Évite les Select, par exemple ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sheets("Mara").Select
    Range("FA98:ii112").Select
    Selection.Copy
    Range("FB98").Select
    ActiveSheet.Paste
    Si on traduit en français ces lignes: Sélectionne la feuille Mara, Sélectionne la plage FA98:II112, Copie la sélection, Sélectionne la cellule FB98, Colle ce qu'a été copié auparavant...

    Alors que ce code est plus efficace:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    With Sheets("Mara")
        .Range("FA98:II112").Copy .Range("FB98")
    End With
    On le traduit aussi: Au sein de (avec) la feuille Mara, copier la plage FA98:II112 vers (à partir de) la cellule FB98.

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Ah oui en effet c'est beaucoup plus simple et compact (et surement plus rapide a l'execution).

    Merci !

    Bon j avais deja fait mes 70 feuilles avec ma precedente formule, mais je vais surement remplacer par cette derniere porposee.



    Pour la boucle malheureusement je ne peux pas en faire, car les 70 feuilles n ont pas tout a fait la meme structure. Je ne peux pas les modifier car il faudrait refondre tout le fichier (3 ans d'historique), et de ce fait une boucle n est malheureusement pas utilisable.

    Mais c est pas grave, je vais m embeter encore une fois 30 min, et apres ce sera 45 minutes de gagnees tous les lundis !

    Merki pour l amelioration de la formule

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 01/02/2013, 15h01
  2. Réponses: 2
    Dernier message: 02/09/2011, 14h25
  3. [AC-2003] Mettre à jour un champ d'une table en fonction de la valeur d'une combobox
    Par Chagui dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 19/11/2010, 18h26
  4. Réponses: 5
    Dernier message: 07/05/2009, 16h41
  5. lancer une macro en fonction de la valeur d'une cellule
    Par arkorrigan dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 11/06/2008, 17h18

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