Ajout de valeur si pas présent dans colonne

ccvr -  
yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   -

Bonjour,

J'ai deux fichiers 

- fichier actuel : nomenclature ( feuille intéressée : STANDARD)

https://www.cjoint.com/c/LGAj1K2SGmR

- fichier secondaire : coûts pieds en cours (feuille intéressée : BD_Catalogue)

https://www.cjoint.com/c/LGAj2u34mRR

Ce que je souhaite :

lorsque une référence est rajoutée au tableau BD catalogue, cette même référence s'ajoute aussi au tableau nomenclature standard ( nom des tableaux cf. fichier)

Voici mon code VBA mais il ne fonctionne pas ( je pense déjà qu'il y a des fautes dans le language):

Private Sub Worksheet_Activate()


    
    
Dim WkExt As Workbook, Wk As Workbook, TabExt As ListObject, Table As ListObject, lnext As Integer, ln As Integer, i As Integer, j As Integer

Set WkExt = Workbooks("C:\Users\clari\Documents\STAGE l\Missions\nomenclature\partie 2\Coûts pieds en cours.xlsm")
    lnext = WkExt.Feuil1.Cells(Rows.Count, 1).End(xlDown).Row
    ln = Cells(Rows.Count, 1).End(xlDown).Row
    
    For i = 1 To lnext Step 1
        For j = 1 To ln Step 1
            If Range("A" & i) = Range("A" & j) Then
                i = i + 1
            Else
                j = j + 1
            End If
        Next
        If j = lnext + 1 Then
            ListObjects("tab_standard").ListRows.Add().Range.Cells(i).Value
            i = i + 1
        End If
    Next
    
    

End Sub

Merci pour votre aide :)

2 réponses

  1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     

    bonjour, les fautes de langages sont habituellement signalées au moment de la compilation.

    0
    1. ccvr
       

      oui j'ai changé mes fautes :

      j'ai mis woksheet(nom de la feuille) au lieu de feuil4 

      mais ca ne fait rien quand le code s'applique 

      0
      1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > ccvr
         

        Tu n'as pas expliqué en quoi ton code répondait à ton souhait.
        Si tu souhaites comprendre ce que fait ton code, tu peux, par exemple, ajouter des instructions "msgbox" dans ton labyrinthe de boucles et de "if". Cela t'aidera à vérifier si ton code se comporte comme tu le souhaites.  Tu peux aussi exécuter ton code pas à pas.

        0
      2. ccvr > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
         

        mon code ne répond pas à mon souhait car lorsque je rajoute une référence dans le tableau catalogue du classeur cout pieds en cours, cette référence ne 'ajoute pas automatiquement en fin du tableau standard dans le classeur nomenclature...

        0
      3. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > ccvr
         

        Il est préférable de ne pas laisser d'ambiguité, et de toujours completement qualifier le classeur et la feuille quand on utilise, par exemple, "range" ou "cells".

        0
  2. ccvr
     

    est ce bon si je mets ce code VBA dans la feuille standard et dan l'onglet "worksheet activate" 

    le code doit automatiquement s'effectuer lorsque je vais sur la feuille standard ?

    0
    1. ccvr
       

      en testant avec les msgbox, mon code fonctionne jusqu'à :

       If j = lnext + 1 Then

      0
      1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > ccvr
         

        que signifie "fonctionner"?
        Tu peux aussi utiliser "debug.print", qui affiche dans la fenêtre immédiate (que tu peux ouvrir via ctrl-G dans l'éditeur de code).

        0
    2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       

      Avec un "msgbox", tu peux facilement vérifier si le code s'exécute quand tu le souhaites.

      0
      1. ccvr > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
         

        alors là avec mes modifications et mes checks à chaque étape je ne comprends pas pourquoi ...

        voici mon code modifié:

        Private Sub Worksheet_Activate()


            
            
        Dim WkExt As Workbook, Wk As Workbook, tblData As ListObject, lnext As Integer, ln As Integer, i As Integer, j As Integer, c As Integer


        Set WkExt = Workbooks("Coûts pieds en cours.xlsm")
            lnext = Workbooks("Coûts pieds en cours.xlsm").Worksheets("BD_Catalogue").Cells(Rows.Count, 1).End(xlUp).Row
            ln = Cells(Rows.Count, 1).End(xlUp).Row
        Set tblData = Worksheets("STANDARD").ListObjects("tab_standard")
            
            For i = 2 To lnext Step 1
                For j = 2 To ln Step 1
                    If Workbooks("Coûts pieds en cours.xlsm").Worksheets("BD_Catalogue").Range("A" & i) = Workbooks("Nomenclature.xlsm").Worksheets("STANDARD").Range("A" & j) Then
                i = i + 1
                    Else
                        j = j + 1
                    End If
                Next
                
                
                If j > Workbooks("Nomenclature.xlsm").Worksheets("STANDARD").Cells(Rows.Count, 1).End(xlUp).Row Then
                   
                    Workbooks("Nomenclature.xlsm").Worksheets("STANDARD").Range("A" & j) = Workbooks("Coûts pieds en cours.xlsm").Worksheets("BD_Catalogue").Cells(i, 1).Value
                    
                i = i + 1
                End If
            Next
        End Sub

        a mon avis, ca ne peut qu'être la ligne en gras qui pose problème...

        Pr contre je ne vois pas pourquoi ...

        Quand je fais fonctionner ce code, des valeurs s'ajoutent ( des références qui figurent dan les deux fichiers donc e aucun cas elles devraient s'affichaient en bas du tableau standard)

        j'ai testé avec un messagebox le résultat de : Workbooks("Coûts pieds en cours.xlsm").Worksheets("BD_Catalogue").Cells(i, 1).Value

        qui est le bon 

        et la cellule Workbooks("Nomenclature.xlsm").Worksheets("STANDARD").Range("A" & j)  est bonne aussi...

        Mais les deux ensemble ca ne va pas ( je veux dire l'égalité)

        avec vous une solution à me proposer car je sèche ... merci!

        0
      2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > ccvr
         

        Voici les instructions pour partager ici un code lisible: https://codes-sources.commentcamarche.net/faq/11288-poster-un-extrait-de-code
        Je vois encore au moins une ligne avec Cells sans spécification du classeur ni de la feuille.
        Tu peux utiliser des variables de type WorkSheet, ce sera plus lisible.
        Les noms de tes variables i et j ne sont pas très utiles.

        .

        As-tu des doutes à propos de l'exécution de l'instruction suivante?

         Workbooks("Nomenclature.xlsm").Worksheets("STANDARD").Range("A" & j) = Workbooks("Coûts pieds en cours.xlsm").Worksheets("BD_Catalogue").Cells(i, 1).Value

        Tu peux alors utiliser msgbox ou, de préférence, debug.print afin de comprendre ce qui se passe:

        debug.print "copie, i: "+cstr(i)+ ",j: "+cstr(j)
        debug.print "valeur à copier: "+Workbooks("Coûts pieds en cours.xlsm").Worksheets("BD_Catalogue").Cells(i, 1).Value
        Workbooks("Nomenclature.xlsm").Worksheets("STANDARD").Range("A" & j) = Workbooks("Coûts pieds en cours.xlsm").Worksheets("BD_Catalogue").Cells(i, 1).Value
        debug.print "valeur après copie: "+Workbooks("Nomenclature.xlsm").Worksheets("STANDARD").Range("A" & j)
        0