Ajout de valeur si pas présent dans colonne

Fermé
ccvr - 26 juil. 2022 à 11:59
yg_be Messages postés 22779 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 12 mai 2024 - 26 juil. 2022 à 17:49

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

yg_be Messages postés 22779 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 12 mai 2024 1 481
26 juil. 2022 à 12:50

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

0

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
yg_be Messages postés 22779 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 12 mai 2024 1 481 > ccvr
26 juil. 2022 à 13:32

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
ccvr > yg_be Messages postés 22779 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 12 mai 2024
26 juil. 2022 à 13:34

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
yg_be Messages postés 22779 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 12 mai 2024 1 481 > ccvr
Modifié le 26 juil. 2022 à 13:52

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

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

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

 If j = lnext + 1 Then

0
yg_be Messages postés 22779 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 12 mai 2024 1 481 > ccvr
26 juil. 2022 à 13:57

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
yg_be Messages postés 22779 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 12 mai 2024 1 481
26 juil. 2022 à 13:59

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

0
ccvr > yg_be Messages postés 22779 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 12 mai 2024
26 juil. 2022 à 15:53

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
yg_be Messages postés 22779 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 12 mai 2024 1 481 > ccvr
26 juil. 2022 à 17:49

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