Mettre à jour un tableau

Bonjour à tous,

J’aimerais mettre a jour un tableau dans la feuille "Données", à chaque saisie d'une ligne dans la colonne A de la feuille "BDD".

C'est-à-dire, comparer à chaque entrée dans la colonne A de la feuille "BDD" au éléments du tableau dans la feuille "Données".

La solution va être appliquée sur trois colonnes (A, B et F) dans "BDD" pour trois tableaux dans "Données".

Merci d'avance.

Bonsoir,

Avez-vous un fichier à joindre ?

Sinon une surveillance événementielle sur la colonne A qui lance une procédure de test et recopie sur BDD...

@ bientôt

LouReeD

Bonsoir LouReeD,

Voila un exemple en PJ.

Le tableau "Site" sera maj depuis la colonne A.

Les tableaux "Comm", "Env" et "Trs" seront maj depuis la colonne F mais selon le type saisi en colonne B :

Sur fichier joint

en jaune feuille BDD je rajoute LRD et automatiquement LRD se met à la fin de la colonne A de la feuille Données, c'est bien cela ?

Pouvez-vous finir de remplir la ligne LRD ? Merci

@ bientôt

LouReeD

LouReeD a écrit :

en jaune feuille BDD je rajoute LRD et automatiquement LRD se met à la fin de la colonne A de la feuille Données, c'est bien cela ?

Oui, ceci est valable pour ajouter un nouvel élément depuis la colonne A "BDD" dans le tableau "Site" en colonne A "Données".

Mais, pour la saisie dans la colonne F "BDD", il faut vérifier ce qui a été saisi dans la même ligne en colonne B "BDD" avant de placer ce nouvel élément dans le tableau convenable parmi les trois tableaux "Comm", "Env" et "Trs" présents dans la feuille "Données".

Bonjour,

Une proposition de ce que j'ai compris

A adapter...

Utilisation de tableaux (voir gestionnaire de noms) et d'une procédure événementielle.

Cdlt.

Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim wsS As Worksheet, wsd As Worksheet
Dim loBDD As ListObject
Dim lr As ListRow

    Set wsS = ActiveSheet
    Set loBDD = wsS.ListObjects(1)
    Set wsd = Worksheets("Données")

    If Not Intersect(Target, loBDD.DataBodyRange) Is Nothing Then
        If Target.Count > 1 Then Exit Sub

        Select Case Target.Column
            Case 1
                If Application.CountIf([d.Site], Target.Value) = 0 Then
                    Set lr = wsd.Range("tblSite").ListObject.ListRows.Add
                    lr.Range.Cells(1, 1) = Target.Value
                End If
            Case 2
                '
            Case 6
                If Not Target.Offset(0, -4) = vbNullString Then
                    Select Case Target.Offset(0, -4).Value
                        Case "COMM"
                            If Application.CountIf([d.Comm], Target.Value) = 0 Then
                                Set lr = wsd.Range("tblComm").ListObject.ListRows.Add
                                lr.Range.Cells(1, 1) = Target.Value
                            End If
                        Case "ENV"
                            If Application.CountIf([d.Env], Target.Value) = 0 Then
                                Set lr = wsd.Range("tblEnv").ListObject.ListRows.Add
                                lr.Range.Cells(1, 1) = Target.Value
                            End If
                        Case "TRS"
                            If Application.CountIf([d.Trs], Target.Value) = 0 Then
                                Set lr = wsd.Range("tblTrs").ListObject.ListRows.Add
                                lr.Range.Cells(1, 1) = Target.Value
                            End If
                    End Select
                End If
        End Select
    End If

    Set lr = Nothing
    Set loBDD = Nothing
    Set wsd = Nothing: Set wsd = Nothing

End Sub

Bonjour Jean-Eric,

Merci pour l'exemple.

Je vais essayer de comprendre le code.

Que signifie cette syntaxe :

=tblComm[Comm]

tblComm et le style du tableau "Comm", mais je ne comprend pas le reste ?

Bonsoir

Un essai d'explication :

dans son code il fait appel à une "étiquette" d'Excel par son nom [d.Comm]

On le reconnaît par la valeur entre crochet.

L'étiquette "données tableau comm" a été créée par le menu Formules : gestionaire des noms : nouveau

Le nom de l'étiquette d.comm

Fait référence à : sélection des cellules C2:C3 de la feuille Données, résultat de la référence =tblComm[Comm]

L'étiquette fait donc référence au tableau tblComm avec comme intitulé de colonne Comm

En fait ce qui est trompeur c'est que le tableau tblComm n'a qu'une colonne !

Ensuite dans VBA pour faire référence au données du tableau tblComm il suffit d'appeler d.Comm !

Simplicité assurée, non ?

@ bientôt

LouReeD

Bonsoir LouReeD,

Ce n'est facile de tout comprendre dés le début, mais il s'y habitué.

Je vais relire cette petite explication et ensuite voir ce que ça donne

Merci.

Bonjour,

d.Comm correspond à :

=DECALER(Données!$C$2;;;NBVAL(Données!$C:$C)-1)

quand on utilise des plages (ou listes) traditionnelles.

d.Comm est en fait la plage des données du tableau tblComm et est formulé ainsi : =tblComm[Comm], ou Comm est l'entête du tableau

d.comm permet de travailler avec les listes déroulantes (données validation)., car on ne peut pas utiliser tblComm.

d.comm est dynamique comme tblComm.

Dans le code VBA [d.comm] correspond à Range("d.Comm")

L'utilisation des tableaux depuis EXcel 2007 apportent des améliorations aux versions précédentes, mais sont assez déconcertants.

Cdlt.

Bonsoir Jean-Eric,

Merci pour tes explications.

Je vais essayer de m'y adapter

Rechercher des sujets similaires à "mettre jour tableau"