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 habitué
    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
    Points : 169
    Points
    169
    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 éminent sénior
    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
    Points : 14 363
    Points
    14 363
    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 habitué
    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
    Points : 169
    Points
    169
    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 éminent sénior
    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
    Points : 14 363
    Points
    14 363
    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 habitué
    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
    Points : 169
    Points
    169
    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