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 :

Remplacer ou ajouter une ligne d'une feuille à l'autre en fonction d'un dictionnaire [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Homme Profil pro
    Chargé d'Ingénierie et d'Analyses en Ressources Humaines
    Inscrit en
    Novembre 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'Ingénierie et d'Analyses en Ressources Humaines
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2012
    Messages : 63
    Par défaut Remplacer ou ajouter une ligne d'une feuille à l'autre en fonction d'un dictionnaire
    Bonjour,

    J'ai un fichier contenant deux feuilles.
    - Modifications à apporter
    - Liste finale

    Le fichier devrait contenir entre 70 000 et 100 000 lignes dans sa version finale.

    Chacune des deux feuilles contient les mêmes colonnes (allant de A à AE).

    Je voudrais que pour chaque ligne de la feuille "Modifications à apporter" en fonction du code alphanumérique (1 lettre + 5 chriffres) qui se trouve dans la colonne E :
    - La ligne vienne remplacer celle existente dans la feuille "Liste finale" si le code apparaît déjà
    - La ligne vienne s'ajouter dans la feuille "Liste finale" si le code n'apparaît pas encore

    Attention, les lignes de la feuille "Modifications..." doivent être copiées. A la fin de la macro, cette feuille ne doit avoir subie aucune modification.

    Je pense qu'en passant par un dictionnaire des codes, il est possible d'arriver à ce résultat mais je ne m'y connais suffisamment pour faire cette macro.

    Je vous remercie pour l'aide que vous pourrez m'apporter.

    Chtik

  2. #2
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Bonjour,

    Essaie :

    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 MAJ()
    Dim Plage As Range, C As Range, Ligne As Variant
    With Sheets("Modifications")
        Set Plage = .Range(.[E1], .Cells(.Rows.Count, 5).End(xlUp))
    End With
    With Sheets("Liste")
        For Each C In Plage
            Ligne = Application.Match(C.Value, .[E:E], 0)
            If IsNumeric(Ligne) Then
                'modif
                .Cells(Ligne, 1).Resize(, 31).Value = C.Offset(, -4).Resize(, 31).Value
            Else
                .Cells(.Rows.Count, 1).End(xlUp).Offset(1).Resize(, 31).Value = _
                    C.Offset(, -4).Resize(, 31).Value
            End If
        Next C
    End With
    End Sub

  3. #3
    Membre confirmé
    Homme Profil pro
    Chargé d'Ingénierie et d'Analyses en Ressources Humaines
    Inscrit en
    Novembre 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'Ingénierie et d'Analyses en Ressources Humaines
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2012
    Messages : 63
    Par défaut
    Bonjour,

    C'est exactement le résultat escompté sauf que j'ai oublié le troisième point de ma demande.

    Il faudrait également que si la ligne (située sur la feuille " modifications ") contient "suppression" dans la colonne AD, elle soit supprimée de la feuille "liste finale".

    Serait il possible de m'expliquer un peu le code proposé ?

    Merci beaucoup,

    Cordialement,
    Chtik

  4. #4
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Par défaut
    Bonjour,

    J'ai ajouté la suppression et j'ai mis des commentaires dans le code. S'il reste des points obscurs, n'hésite pas à le dire.

    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
    Sub MAJ()
    Dim Plage As Range, C As Range, Ligne As Variant
    With Sheets("Modifications")
        'on définit "Plage" comme la plage des cellules de la colonne E
        Set Plage = .Range(.[E1], .Cells(.Rows.Count, 5).End(xlUp))
    End With
    With Sheets("Liste")
        'boucle sur les cellules de "Plage"
        For Each C In Plage
            'recherche de la ligne correspondant à la ligne de C
            'Equivalent de la fonction Excel EQUIV
            Ligne = Application.Match(C.Value, .[E:E], 0)
            'si on trouve cette ligne, c'est soit une modification soit une suppression
            If IsNumeric(Ligne) Then
                'si la valeur de la colonne AD (en minuscules) est "suppression"
                If LCase(C.Offset(, 25)) = "suppression" Then
                    'suppression de la ligne
                    .Cells(Ligne, 1).EntireRow.Delete
                Else
                    'sinon c'est une modification; on remplace la ligne
                    .Cells(Ligne, 1).Resize(, 31).Value = C.Offset(, -4).Resize(, 31).Value
                End If
            Else
                'si on ne trouve pas d'égalité, c'est un ajout
                '".Cells(.Rows.Count, 1).End(xlUp).Offset(1)" trouve la première cellule vide en dessous
                'de la colonne A
                '".Cells(.Rows.Count, 1).End(xlUp).Offset(1).Resize(, 31)" représente les 31 cellules où
                ' vont être copiées les cellules à additionner
                .Cells(.Rows.Count, 1).End(xlUp).Offset(1).Resize(, 31).Value = _
                    C.Offset(, -4).Resize(, 31).Value
            End If
        Next C
    End With
    End Sub

  5. #5
    Membre confirmé
    Homme Profil pro
    Chargé d'Ingénierie et d'Analyses en Ressources Humaines
    Inscrit en
    Novembre 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'Ingénierie et d'Analyses en Ressources Humaines
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2012
    Messages : 63
    Par défaut
    Bonjour,

    Je vous remercie car c'est exactement ce que je souhaitais et les commentaires sont précis ce qui m'aide bien à comprendre.

    Je classe le fil en résolu.

    Cordialement,
    Chtik

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 18/01/2015, 19h30
  2. [WD18] Metre une colonne d'une Table sur une ligne d'une autre Table
    Par Totophe2 dans le forum WinDev
    Réponses: 2
    Dernier message: 22/11/2013, 13h58
  3. Réponses: 4
    Dernier message: 15/10/2009, 14h33
  4. [E-00] Syntaxe pour insérer une ligne ou une colonne dans une feuille
    Par Benjycool dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 02/02/2009, 10h27
  5. Réponses: 1
    Dernier message: 19/05/2006, 18h33

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