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 :

Mise à jour d'éléments manquants d'un tableau vers un autre


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Avril 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2012
    Messages : 35
    Points : 26
    Points
    26
    Par défaut Mise à jour d'éléments manquants d'un tableau vers un autre
    Bonjour à tous,

    Je me retrouve confronter un petit problème et j'espère que vous pourrez m'aider .
    Contexte:
    Sur une même feuille j'ai deux tableaux:
    - Tableau 1 (colonnes allant de 1 à 11). La première colonne se remplie automatiquement à partir d'une autre feuille (appelée dans ma macro : WsS)
    - Tableau 2 (colonnes allant de 13 à 15)

    But de la macro:
    Je souhaiterais que lorsque je lance la macro pour actualiser la liste de la première colonne du tableau 1 (cette liste peut varier en nb de lignes et contenu) :
    - pour chaque ligne, vérifier si la valeur est déjà présente dans le tableau 2
    - Dans le cas où la valeur n'existerait pas encore dans le tableau 2, je voudrais coller les valeurs des colonnes 1, 10 et 11 du tableau 1 en fin du tableau 2
    (en gros mettre à jour le tableau 2 avec les éléments manquants par rapport au tableau 2.

    J'ai tenté des trucs mais je n'y suis pas du tout. Je vous mets tout de même les lignes de codes que j'ai jusqu'à présent mais je suis preneur de toute proposition (c'est la partie rouge surtout qui pose problème je pense)

    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
    Dim WsS As Worksheet, WsC As Worksheet
    Dim DerLig As Long, R As Long, newLig As Long, R2 As Long, Derlig2 As Long, newLig2 As Long
    Dim a As Integer
    
    newLig = 2
    
    Application.ScreenUpdating = False
    
    Call effacer
    
    Set WsS = Sheets("DATA USERS") 'Feuille source
    Set WsC = Sheets("Siglum") 'Feuille cible
    DerLig = WsS.Cells(WsS.Columns(1).Cells.Count, 1).End(xlUp).Row 'Dernière ligne utilisée
    Derlig2 = Range("M" & Rows.Count).End(xlUp).Row
    newLig2 = Derlig2
     
    WsC.Columns(1).ClearContents 'Vide le contenu de la colonne 1 e la page 2 (évite de garder les noms d'une précédente action)
     
    For R = 2 To DerLig 'Boucle sur toutes les lignes de la Page 1
    
        If UCase(WsS.Cells(R, 7)) = "YES" Then 'Vérifie si le nom est tagé YES (Ucase met en majuscule)
            newLig = newLig + 1 'Permet l'incrémentation de la cible
            WsC.Cells(newLig, 1) = WsS.Cells(R, 1) 'Affecte le nom sur une nouvelle ligne de la page cible
        End If
        
        For R2 = 2 To Derlig2 'Vérifie si l'utilisateur n'est pas dans l'historique pour le rajouter en fin de liste
            While WsC.Cells(newLig, 1) <> WsC.Cells(R2, 13)
            a = a + 1
        Next R2
            If a > Derlig2 Then
            WsC.Cells(newLig2, 13) = WsC.Cells(R, 1)
            End If
          
    Next R
    Merci par avance de l'aide que vous pourrez m'apporter sur le sujet.

  2. #2
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    191
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2012
    Messages : 191
    Points : 324
    Points
    324
    Par défaut
    Bonjour,

    Je te suggère une méthode sans donner de code précis pour l'instant:

    1. Tu récupères le nombre de lignes que tu as
    2. Tu parcours tes lignes à l'aide d'une boucle for
    3. Pour chaque ligne, Si valeur<> Cells(N° ligne,13) ou Si valeur<> Cells(N° ligne,14) ou Si valeur <> Cells(N° ligne,15) alors copie des valeurs des colonnes 1,10,11 vers 13,14,15.

    Cordialement.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Avril 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2012
    Messages : 35
    Points : 26
    Points
    26
    Par défaut
    Bonjour Mr.Mof,

    Si je comprends ton idée d'algorithme, je vais régénérer tout mon tableau 2 non ? Ou alors venir copier plusieurs fois la ligne de mon tableau 1 que je compare..

    Pour le résultat que je souhaite, je pense que pour chaque ligne de mon tableau 1, je vienne checker si les valeurs ne sont pas déjà présentes dans le tableau 2 (donc le parcourir entièrement avant de coller les valeurs en fin du tableau 2).
    En réalité le tableau 2 me sert "d'historique" donc je ne voudrais pas toucher aux lignes déjà présentent dans ce tableau. L'idée est vraiment d'incrémenter les nouvelles valeurs décelées dans le tableau 1.

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    191
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2012
    Messages : 191
    Points : 324
    Points
    324
    Par défaut
    Il te suffit de modifier l'idée de l'algorithme, au lieu de checker ta valeur de colonne1, tu fais quelque chose du genre :

    Si Cells(1,1) <> Cells(1,13) alors tu copie ta valeur
    Si Cells(1,10) <> Cells(1,14) alors tu copie ta valeur
    Si Cells(1,11) <> Cells(1,15) alors tu copie ta valeur

    Si tes valeurs sont modifiées, tu les incrémentes sinon elles ne sont pas modifiées.

    C'est cela que tu souhaites faire ?

  5. #5
    Membre chevronné Avatar de rvtoulon
    Homme Profil pro
    Agent Technique
    Inscrit en
    Mars 2009
    Messages
    1 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Agent Technique
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 042
    Points : 2 003
    Points
    2 003
    Par défaut
    bonjour,
    tout d'abord tu dis bien :
    Sur une même feuille j'ai deux tableaux:
    - Tableau 1 (colonnes allant de 1 à 11). La première colonne se remplie automatiquement à partir d'une autre feuille (appelée dans ma macro : WsS)
    - Tableau 2 (colonnes allant de 13 à 15)
    alors voici une autre approche à adapter bien évidemment
    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
    With Sheets("La feuille ou se trouve les tableaux")
    'je parcours chaque cellule utilisée de la colonne A
    For Each cel In .Range("A2:A" & Range("A" & Rows.Count).End(xlUp).Row)
        'je recherche dans la colonne 13 la valeur de la cellule
        Set vrech = .Columns(13).Find(cel.Value)
        'si elle n'existe pas alors
        If vrech Is Nothing Then
         'je récupère le N° de la dernière ligne non utilisée de la colonne 13
         derlign = .Range("M2:M" & Range("M" & Rows.Count).End(xlUp).Row + 1)
     
        'je copie les valeurs concernées
        .Cells(derlign, 13).Value = cel.Value
        .Cells(derlign, 14).Value = cel.Offset(0, 9).Value
        .Cells(derlign, 15).Value = cel.Offset(0, 10).Value
        End If
    Next cel
    End With

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Avril 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2012
    Messages : 35
    Points : 26
    Points
    26
    Par défaut
    Salut rvtoulon,

    Effectivement ton approche me semble tout à fait adéquate par rapport à ce que je souhaite avoir comme solution. Cependant je me retrouve confronter à quelques soucis pour adapter tes lignes de codes... après avoir évite les différentes erreurs lorsque je lance ma macro, je me retrouve avec un code qui tourne mais j'ai du mal à voir le résultat car aucune nouvelle ligne n'est générée dans le tableau 2...
    Je vous mets mon code actuel en espérant que vous puissiez me dire ce qui pourrait ne pas être bon

    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    Sub GenererListeUsersSiglum()
     
    Dim WsS As Worksheet, WsC As Worksheet
    Dim DerLig As Long, R As Long, newLig As Long, R2 As Long, Derlig2 As Long, newLig2 As Long, derlign As Long
    Dim a As Integer
     
    newLig = 1
     
    Application.ScreenUpdating = False
     
    Call effacer
     
    Set WsS = Sheets("DATA USERS") 'Feuille source
    Set WsC = Sheets("Siglum") 'Feuille cible
    DerLig = WsS.Cells(WsS.Columns(1).Cells.Count, 1).End(xlUp).Row 'Dernière ligne utilisée
    'Derlig2 = Range("M" & Rows.Count).End(xlUp).Row
    'newLig2 = Derlig2
     
    WsC.Columns(1).ClearContents 'Vide le contenu de la colonne 1 e la page 2 (évite de garder les noms d'une précédente action)
     
    For R = 2 To DerLig 'Boucle sur toutes les lignes de la Page 1
        If UCase(WsS.Cells(R, 7)) = "YES" Then 'Vérifie si le nom est tagé YES (Ucase met en majuscule)
            newLig = newLig + 1 'Permet l'incrémentation de la cible
            WsC.Cells(newLig, 1) = WsS.Cells(R, 1) 'Affecte le nom sur une nouvelle ligne de la page cible
        End If
    Next R
     
    Call listuserssiglum2 'j'actualise les colonnes de mon tableau 1 en fonction de la liste générée colonne 1
     
    Application.ScreenUpdating = True
     
    Call listmanquants 'j'identifie les lignes du tableau 1 ayant soit #N/A soit 0 dans la colonne 10 et je les copie en fin du tableau 2
     
    'j'identifie les nouveaux noms dans la colonne 1 du tableau et copies les infos souhaités en fin du tableau 2
     
    With WsC 'Sheets("Siglum") 'WsC
    'je parcours chaque cellule utilisée de la colonne A
    For Each cel In WsC.Range("A2:A" & Range("A" & Rows.Count).End(xlUp).Row)
        'je recherche dans la colonne 13 la valeur de la cellule
        Set vrech = WsC.Columns(13).Find(cel.Value)
        'si elle n'existe pas alors
        If vrech Is Nothing Then
         'je récupère le N° de la dernière ligne non utilisée de la colonne 13
         'derlign = WsC.Range("M2:M" & Range("M" & Rows.Count).End(xlUp).Row + 1)
        derlign = Range("M" & Rows.Count).End(xlUp).Row
     
        'je copie les valeurs concernées
        WsC.Cells(derlign, 13).Value = cel.Value
        WsC.Cells(derlign, 14).Value = cel.Offset(0, 9).Value
        WsC.Cells(derlign, 15).Value = cel.Offset(0, 10).Value
        End If
    Next cel
    End With
     
    End Sub
    Pour répondre à ta question Mr.Mof, cela ne correspond pas réellement car, je ne l'ai pas spécifié dans mon énoncé (c'est de ma faute toute mes excuses), comme je génère une nouvelle liste de personnes classée par ordre alphabétique, il n'y a plus aucune correspondance, pour une ligne donnée, entre les colonnes (1 et 13), (10 et 14) et (11 et 15) c'est pourquoi la comparaison doit ce faire en recherchant la valeur dans tout le tableau 2 (donc solution de rvtoulon finalement)

  7. #7
    Membre chevronné Avatar de rvtoulon
    Homme Profil pro
    Agent Technique
    Inscrit en
    Mars 2009
    Messages
    1 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Agent Technique
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 042
    Points : 2 003
    Points
    2 003
    Par défaut
    J'ai corrigé deux trois choses dans ton code regarde ce que ça donne:
    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
    With WsC 'Sheets("Siglum") 'WsC
    'je parcours chaque cellule utilisée de la colonne A
    For Each cel In .Range("A2:A" & .Range("A" & Rows.Count).End(xlUp).Row)
        'je recherche dans la colonne 13 la valeur de la cellule
        Set vrech = .Columns(13).Find(cel.Value)
        'si elle n'existe pas alors
        If vrech Is Nothing Then
         'je récupère le N° de la dernière ligne non utilisée de la colonne 13
         'derlign = WsC.Range("M2:M" & Range("M" & Rows.Count).End(xlUp).Row + 1)
        derlign = .Range("M" & Rows.Count).End(xlUp).Row + 1
     
        'je copie les valeurs concernées
        .Cells(derlign, 13).Value = cel.Value
        .Cells(derlign, 14).Value = cel.Offset(0, 9).Value
        .Cells(derlign, 15).Value = cel.Offset(0, 10).Value
        End If
    Next cel
    End With

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Avril 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2012
    Messages : 35
    Points : 26
    Points
    26
    Par défaut
    Ha je vois mon erreur je n'aurais pas dû rajouter le nom de la sheet devant .cells et .range ! (bon à savoir pour la prochaine fois )

    Maintenant ça marche nickel ! merci beaucoup pour ta solution rvtoulon et merci à vous deux d'avoir pris le temps de me répondre.

    bonne journée à vous

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

Discussions similaires

  1. [XL-2003] Mise à jour de données d'un fichier excel vers un autre
    Par meumeu73.1 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 24/03/2010, 14h37
  2. Exception sur mise à jour d'éléments en cascade
    Par sixmillespieds dans le forum Hibernate
    Réponses: 2
    Dernier message: 25/06/2008, 21h17
  3. [MySQL] Mise à jour dynamique des lignes d'un tableau
    Par woodyfrance dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 29/02/2008, 11h50
  4. [Hibernate] mise à jour des éléments des détails
    Par neuromencien dans le forum Hibernate
    Réponses: 9
    Dernier message: 16/02/2007, 14h47

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