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.

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.

@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

Statistiques des forums

Discussions
312 839
Messages
2 092 692
Membres
105 510
dernier inscrit
gabgil.