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 :

Coupé-collé conditionnel d'une plage de donnée en fonction d'une autre


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Mai 2010
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 13
    Par défaut Coupé-collé conditionnel d'une plage de donnée en fonction d'une autre
    Bonjour à tous,

    afin de traiter des données de la manière la plus efficace possible, j'ai besoin de créer une macro me permettant de couper et coller un plage de données en fonction de la valeur d'une autre plage, et mes connaissances VBA sont plutôt basiques.

    Le problème ne vient pas de la commande "copier - coller" que l'on peut retrouver facilement grâce à l'enregistreur de macro, mais plutôt de la syntaxe pour faire comprendre à excel de quelles données il doit sélectionner pour les couper et les coller.

    Voici un exemple de fichier que je voudrais traiter:
    A B C D

    1 2 3 ML
    4 5 6 ML
    7 8 9 ML
    10 11 12 MC
    13 14 15 MC
    16 17 18 MC

    Le but de la macro serait de couper-coller les valeurs des colonnes A, B et C dans une feuille 1 lorsque la colonne D vaut "ML", et dans une autre feuille lorsque la colonne D vaut "MC".
    Attention cependant, lors du couper/coller, les valeurs "ML" et "MC" ne doivent pas être coupées-collées.

    Pourriez-vous me donner une piste pour réaliser ce coupé-collé conditionnel s'il vous plait, peut-être avec quelques explications si possible? (le meilleur moyen pour progresser !)

    Merci à vous,

    Yannick

  2. #2
    Membre confirmé
    Inscrit en
    Avril 2010
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 68
    Par défaut
    comme tu l'a dit
    il suffit de mettre ta commande dans une condition

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    range ("A1").select
    while range(selection) <> ""' a utiliser si tu veux faire toutes les lignes d'un coup (tant que A1 contient quelque chose)
    if selection.offset(0,4).value = "ML"
    range (selection, range(selection).offset(0,3)).copy 'ou cut bref tes action a effectuer quand la colonne 4 = ML
    'activesheet.paste cutcopy mode bref je connais plus la syntaxe exacte =)
    else ' ta derniere commande ne contient pas "ML"
    range(selection).offset(1,0).select 'passage a la ligne d'apres
    endif
    wend
    normalement cela devrait t'aider a avancer bye

  3. #3
    Membre habitué
    Inscrit en
    Mai 2010
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 13
    Par défaut
    Super isfet, merci!

    Si je comprend bien, pour pouvoir ensuite appliquer cette macro avec des valeurs "ML", "MC" etc...il faut que je fasse un "elseif" là où toi tu as marqué "else", et je ré-écris le même code, mais cette fois-ci avec selection.offset(0,4).value = "MC" etc... c'est bien ça ?

    Merci beaucoup pour ton aide, je pensais que la macro allait être immense et trés compliquée, mais c'est vrai que de la voir écrite permet de mieux comprendre la logique.

    Yannick

  4. #4
    Membre habitué
    Inscrit en
    Mai 2010
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 13
    Par défaut erreur 400, qu'est-ce que c'est ?
    Je reviens d'embêter isfet...

    sur la base de ce que tu m'as conseillé, j'ai réalisé la macro ci-dessous, malheureusement à l'exécution, excelle m'affiche "erreur 400" sans ouvrir la console de débogage.
    J'ai fait des recherches pour savoir ce qui correspond à ce type d'erreur, mais il semble que ce soit spécifique à chaque code...

    Est-ce que tu pourrais me dire si tu vois quelques chose qui cloche s'il te plait ?

    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
    Sub MacroAccelero()
        Range("A1").Select
        While Range(Selection) <> ""
            If Selection.Offset(0, 4).Value = "ML" Then
                Range(Selection, Range(Selection).Offset(0, 3)).Cut
                    Sheets("Feuil2").Select
                        Range("A7").Select
                            ActiveSheet.Paste
            ElseIf Selection.Offset(0, 4).Value = "MC" Then
                Range(Selection, Range(Selection).Offset(0, 3)).Cut
                    Sheets("Feuil3").Select
                        Range("A7").Select
                            ActiveSheet.Paste
            Else
                Range(Selection).Offset(1, 0).Select
            End If
        Wend
     
    End Sub
    Merci à toi,

    Yannick

  5. #5
    Expert éminent 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
    Par défaut
    Bonjour
    je propose ceci, à l'aide d'une collection et du filtre automatique
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    Private Sub CommandButton1_Click()
    Dim ws As Worksheet
    Dim Plage As Range
    Dim Kod As Collection
    Dim LastLig As Long, i As Long
    Dim strCode As String
     
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
     
    Set Kod = New Collection
    Set ws = Sheets("Feuil1")                           'à adapter en fonction de la feuille de données
    With ws
        LastLig = .Cells(Rows.Count, 1).End(xlUp).Row   'Dernière ligne
        Set Plage = .Range("A1:D" & LastLig)            'plage données
        For i = 2 To LastLig                            'on crée une collection des différents strCode de la colonne D
            strCode = .Range("D" & i)
            On Error Resume Next
            Kod.Add strCode, strCode
            Sheets(strCode).Delete                         'on supprime les feuilles ayant le même nom que le strCode
            On Error GoTo 0
        Next i
        For i = 1 To Kod.Count
            Sheets.Add after:=Sheets(Sheets.Count)      ' on ajoute une feuille
            ActiveSheet.Name = Kod.Item(i)              ' on la renomme avec le strCode correspondant
            With Plage
                .AutoFilter
                .AutoFilter Field:=4, Criteria1:=Kod.Item(i)                            'On filtre la plage de donnée par rapport aux strCode
                .SpecialCells(xlCellTypeVisible).Copy Sheets(Kod.Item(i)).Range("A1")   'on copie vers la feuille strCode crée
                Sheets(Kod.Item(i)).Columns(4).Delete                                   'on supprime la colonne D copiée
                .AutoFilter                                                             ' on enlève le filtre automatique
            End With
        Next i
        .Select
    End With
    Set Kod = Nothing
    Set Plage = Nothing
    Set ws = Nothing
    Application.DisplayAlerts = True
    End Sub
    La collection Kod contient tous les codes de la colonne D (sans doublons)
    les données peuvent ne pas être triés

  6. #6
    Membre habitué
    Inscrit en
    Mai 2010
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 13
    Par défaut
    Merci Mercatog,

    le problème, c'est que les feuilles sur lesquelles je veux coller mes données sont déjà créées...dès que les données s'insèrent sur ces nouvelles feuilles, elles sont automatiquement traitées par des formules.

    Dans le code que tu as gentiment réalisé (qui pour moi est cet fois ci du charabia complet!) je vois que tu créé et supprime des feuilles, est-ce possible de faire la même chose mais dans des feuilles existantes ?

    Merci à toi,

    Yannick

  7. #7
    Expert éminent 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
    Par défaut
    Oui c'est possible si tu indique où copier et à partir de quelle cellule

  8. #8
    Membre habitué
    Inscrit en
    Mai 2010
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 13
    Par défaut
    Je viens d'essayer de bidouiller la macro, mais beaucoup d'erreurs s'affichent, décidemment il faudra que j'apprenne à bien faire les macros...

    En fait, il faut que je copie à chaque fois l'ensemble des données dans la case de référence A4 dans chaque feuille.

    Mes feuilles se nomment "marche libre" et "marche contrôle" par exemple.

    Comment dois-je modifier ta macro s'il te plait ?

    Yannick

  9. #9
    Membre habitué
    Inscrit en
    Mai 2010
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 13
    Par défaut
    Merci mercatog,

    excel m'affiche un message d'erreur, "erreur d'exécution 9, l'indice n'appartient pas à la sélection", tu sais d'où cela peut provenir ?

  10. #10
    Expert éminent 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
    Par défaut
    ça vient sûrement des noms de tes feuilles.
    dans Tablosht, reprend exactement le nom de tes feuilles

  11. #11
    Membre habitué
    Inscrit en
    Mai 2010
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 13
    Par défaut
    J'ai bien vérifier les noms des feuilles, mais toujours la même erreur qui s'affiche...

Discussions similaires

  1. [XL-2010] Incrémenter une donnée en fonction d'une plage horaire.
    Par sevy1 dans le forum Excel
    Réponses: 2
    Dernier message: 29/04/2013, 09h50
  2. Décaler une plage de cellule en fonction d'une case
    Par Ender007 dans le forum Macros et VBA Excel
    Réponses: 15
    Dernier message: 07/01/2011, 15h41
  3. Réponses: 4
    Dernier message: 21/09/2009, 22h56
  4. copier une plage de donnée d'un fichier à un autre
    Par kristoch91 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 28/10/2008, 10h26
  5. Réponses: 4
    Dernier message: 11/08/2008, 15h29

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