XL 2019 Ajout dans une liste déroulante.

Paulle

XLDnaute Occasionnel
Bonjour,

Est-ce possible ?

Dans Microsoft Money, l'ajout de valeurs dans les listes déroulantes se fait directement dans la liste déroulante.

Je me suis fait un fichier en pièce jointe, mais là si je veux ajouter des valeurs, il faut que je complète dans la feuille "Listes".

Merci.
 

Pièces jointes

  • Compte01B .xlsm
    17.5 KB · Affichages: 22

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

Dans le fichier joint vous verrez, votre liste de validation faire référence au noms "Liste_Tiers" lui-même définit comme : =Tbl_Tiers[Tiers]. Les alertes d'erreur de validation quant la valeur n'existe pas dans la liste sont inhibées.

Dans le code de la feuille sur évènement Change vous verrez ces lignes :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.CountLarge > 1 Or IsEmpty(Target(1, 1)) Then Exit Sub
    If Intersect(Target, Range("Tableau5[Prénom]")) Is Nothing Then Exit Sub
    If IsError(Application.Match(Target.Value, Sheets("Listes").Range("Tbl_Tiers[Tiers]"), 0)) Then
        Sheets("Listes").ListObjects("Tbl_Tiers").ListRows.Add().Range(1, 1) = Target.Value
    End If
End Sub

qui ajoute l'item saisit dans la liste des tiers s'il n'existait pas déjà.

Par contre si vous utilisez excel, oubliez complètement microsoft money dont les comportements et fonctionnalités sont différentes.
 

Pièces jointes

  • Compte01B .xlsm
    24.8 KB · Affichages: 16

Hasco

XLDnaute Barbatruc
Repose en paix
Voici.

Remplacez le code de la feuille par ce dernier.
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.CountLarge > 1 Or IsEmpty(Target(1, 1)) Then Exit Sub
    If Intersect(Target, Range("Tableau5[Prénom]")) Is Nothing Then Exit Sub
    If IsError(Application.Match(Target.Value, Sheets("Listes").ListObjects("tbl_Tiers").ListColumns(1), 0)) Then
        With Sheets("Listes").ListObjects("Tbl_Tiers")
            .ListRows.Add().Range(1, 1) = Target.Value
            .Range.Sort key1:=.DataBodyRange(2, 1), order1:=xlAscending
        End With
    End If
End Sub

Cordialement
 

ChTi160

XLDnaute Barbatruc
Bonjour Paulle
Bonjour le Fil (Roblochon) ,le Forum

une question à Roblochon
quand tu mets :
VB:
key1:=.DataBodyRange(2, 1)
si j'ai bien compris lol
le DataBodyRange , représente la plage des données du Tableau Structuré sans la Ligne d'entête
lorsque tu mets : .DataBodyRange(2, 1) , cela veut il dire la deuxième Ligne première colonne de la plage (.DataBodyRange) ? soit la deuxième Ligne de la DataBodyRange
ne doit on pas trier à partir de la .DataBodyRange(1, 1) 'soit la première Ligne
je n'ai peut^tre pas compris le principe de la prise en compte de la Ligne d'entête du Tableau Structuré.
merci par avance de tes explications !
Bonne journée
Jean marie
 

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

Il n'y a pas d'explication, .DataBodyRange(1,1) fonctionnerait tout aussi bien, c'est moi, je ne sais pour quelle raison qui ai laissé trainer ça.

Je viens de tester avec (5,1) ça marche aussi,

Même après suppression des lignes du tableau, mais le premier item ajouté devient l'entête.
Il faut donc préciser à ce moment là Header:=xlYes, pour qu'il soit ajouté en première ligne de données

Je suppose, (ce n'est qu'une supposition) qu' il y a derrière une sorte de .End(xlUp) interne pour déterminer la première et la dernière ligne de données dans la colonne.

cordialement
 

Hasco

XLDnaute Barbatruc
Repose en paix
J'ai remplacé l'entête de la liste Tiers par un 0 et maintenant elle ne fait plus partie du tri et n'apparait pas dans la liste déroulante.

Re,

vous nous dites cela mais nous ne savons pas où vous en êtes, ce que vous avez fait entre temps. Car l'exemple fournit, fonctionnait bien. Comme je le disais à @ChTi160, vous pouvez ajouter le paramètre Header := xlyes la méthode .Sort.

.Range.Sort key1:=.DataBodyRange(1, 1), order1:=xlAscending , Header:=xlYes

Cordialement
 

Paulle

XLDnaute Occasionnel
J'ai ajouté la ligne ".Range.Sort key1:=.DataBodyRange(1, 1), order1:=xlAscending , Header:=xlYes",
renommer l'entête en List_Tiers et c'est bon.

Ce que je souhaite, quand le nom ne fait pas parti de la liste c'est qu'il puisse y être ajouté.
Mais si c'est un nom qui fait parti de la liste déroulante, qu'il ne soit pas ajouté en doublon dans la liste déroulante.
Je ne sais pas si j'ai été clair.
 

Pièces jointes

  • Compte02ABCDE.xlsm
    27.2 KB · Affichages: 11

Hasco

XLDnaute Barbatruc
Repose en paix
Re,

Rajoutez .Range après .Columns(1) :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.CountLarge > 1 Or IsEmpty(Target(1, 1)) Then Exit Sub
    If Intersect(Target, Range("Tableau5[Tiers]")) Is Nothing Then Exit Sub
    If IsError(Application.Match(Target.Value, Sheets("Listes").ListObjects("tbl_Tiers").ListColumns(1).Range, 0)) Then
        With Sheets("Listes").ListObjects("Tbl_Tiers")
            .ListRows.Add().Range(1, 1) = Target.Value
            .Range.Sort key1:=.DataBodyRange(1, 1), order1:=xlAscending, Header:=xlYes
        End With
    End If
End Sub

Cordialement
 

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 321
Messages
2 087 266
Membres
103 501
dernier inscrit
talebafia