Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2016 Eviter de saisir une valeur plusieurs fois

hamdiby929

XLDnaute Nouveau
Bonjour tout le monde,

J'ai une base de données qui sera alimentée journalièrement. La particularité c'est que le nombre de ligne ne sera pas le même chaque jour.
En effet, pour le poste du matin, l'équipe A peut faire 8 articles, donc 8 lignes, mais le nombre d'ouvrier c'est le même dans chaque ligne soit par exemple 17.
Donc, j'aurai 8 lignes, avec 17 ouvriers dans chaque ligne, alors que réellement, j'ai besoin d'une seule "17". Je rappelle, le nombre de ligne est indéterminable.
J'ai joint mon fichier pour plus de détails.
 

Pièces jointes

  • Fichier.xlsx
    10.6 KB · Affichages: 16

job75

XLDnaute Barbatruc
Bonsoir hamdiby929, sylvanu,

Voyez le fichier .xlsm joint et cette macro dans le code de la feuille :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim d As Object, dd As Object, tablo, i&, x$
Set d = CreateObject("Scripting.Dictionary")
Set dd = CreateObject("Scripting.Dictionary")
d.CompareMode = vbTextCompare 'la casse est ignorée
dd.CompareMode = vbTextCompare 'la casse est ignorée
If FilterMode Then ShowAllData 'si la feuille est filtrée
With Range("A4", Range("A" & Rows.Count).End(xlUp)).Resize(, 4)
    If .Row < 4 Then Exit Sub
    tablo = .Value 'matrice, plus rapide
    For i = 1 To UBound(tablo)
        x = CStr(tablo(i, 4))
        If x <> "" Then d(tablo(i, 2) & tablo(i, 1) & tablo(i, 3)) = x
    Next
    For i = 1 To UBound(tablo)
        x = tablo(i, 2) & tablo(i, 1) & tablo(i, 3)
        If dd.exists(x) Then tablo(i, 4) = "" Else tablo(i, 4) = d(x): dd(x) = ""
    Next
    Application.EnableEvents = False 'désactive les évènements
    .Value = tablo 'restitution
    Application.EnableEvents = True 'réactive les évènements
End With
End Sub
En colonne D entrez 17 pour Jean et 13 pour Sébastien, ces valeurs ne peuvent être entrées qu'une fois.

Bonne nuit.
 

Pièces jointes

  • Fichier(1).xlsm
    18.5 KB · Affichages: 8

hamdiby929

XLDnaute Nouveau
Bonsoir Hamdiby,
Un essai en PJ avec en E4 :
VB:
=SI(NB.SI.ENS($A$1:A4;A4;$B$1:B4;B4)=1;MAX(INDIRECT("D"&LIGNE()&":D"&LIGNE()+NB.SI.ENS(A:A;A4;B:B;B4)));"")
@sylvanu
Pour ceux qui veulent garder le fichier sans macros, c'est une bonne solution je vous remercie beaucoup.


@job75
Je vais choisir cette solution pour éviter des doublons de colonnes, donc merci énormément.
 

job75

XLDnaute Barbatruc
A priori pour la colonne Z il suffit de remplacer le numéro de colonne 4 par 26 :
VB:
With Range("A4", Range("A" & Rows.Count).End(xlUp)).Resize(, 26)
    If .Row < 4 Then Exit Sub
    tablo = .Value 'matrice, plus rapide
    For i = 1 To UBound(tablo)
        x = CStr(tablo(i, 26))
        If x <> "" Then d(tablo(i, 2) & tablo(i, 1) & tablo(i, 3)) = x
    Next
    For i = 1 To UBound(tablo)
        x = tablo(i, 2) & tablo(i, 1) & tablo(i, 3)
        If dd.exists(x) Then tablo(i, 26) = "" Else tablo(i, 26) = d(x): dd(x) = ""
    Next
    Application.EnableEvents = False 'désactive les évènements
    .Value = tablo 'restitution
    Application.EnableEvents = True 'réactive les évènements
End With
 

Discussions similaires

Réponses
0
Affichages
226
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…