INSCRIRE NOM

REDGS

XLDnaute Nouveau
Bonjour,
Dans mon programme colonne A, je voudrais inscrire qu'une seule fois un nom qui lui est plusieurs fois dans la colonne D.
Merci de m'aider, cordialement
Redgs
 

JHA

XLDnaute Barbatruc
Bonjour à tous,

A essayer, formule matricielle
Code:
=SIERREUR(INDEX($E$1:$E$100;EQUIV(0;INDEX(NB.SI($A$1:$A1;$E$1:$E$100););0));"")
Valider par Ctrl+Maj+Entrée

JHA
 

Pièces jointes

  • inscrire nom.xlsx
    11.6 KB · Affichages: 22

job75

XLDnaute Barbatruc
Bonjour REDGS, Lone-wolf, JHA,

La question n'est pas très claire mais voyez le fichier joint et cette macro :
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim t, resu(), d As Object, n&, i&
Application.EnableEvents = False 'désactive les évènements
If FilterMode Then ShowAllData 'si la feuille est filtrée
On Error Resume Next 'si aucune SpecialCell
t = Range("E1", Range("E" & Rows.Count).End(xlUp)(2)) 'tableau, plus rapide, au moins 2 éléments
ReDim resu(1 To UBound(t) + 1, 1 To 1)
Set d = CreateObject("Scripting.Dictionary")
d("NOMS") = "": resu(1, 1) = "NOMS": n = 1
For i = 1 To UBound(t)
    If t(i, 1) <> "" And Not d.exists(t(i, 1)) Then
        d(t(i, 1)) = ""
        n = n + 1
        resu(n, 1) = t(i, 1)
    End If
Next
[A1].Resize(n) = resu
Range("A" & n + 1 & ":A" & Rows.Count).ClearContents 'RAZ en dessous
Application.EnableEvents = True 'réactive les évènements
End Sub
La macro se déclenche quand on modifie une cellule.

Edit : On Error Resume Next peut être supprimé ici.

A+
 

Pièces jointes

  • inscrire nom(1).xlsm
    24.3 KB · Affichages: 24
Dernière édition:

job75

XLDnaute Barbatruc
Re,

L'intérêt du VBA c'est qu"on peut facilement compléter le code, par exemple ici pour ignorer la casse et trier :
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim t, resu(), d As Object, n&, i&
Application.ScreenUpdating = False
Application.EnableEvents = False 'désactive les évènements
If FilterMode Then ShowAllData 'si la feuille est filtrée
On Error Resume Next 'si aucune SpecialCell
t = Range("E1", Range("E" & Rows.Count).End(xlUp)(2)) 'tableau, plus rapide, au moins 2 éléments
ReDim resu(1 To UBound(t) + 1, 1 To 1)
Set d = CreateObject("Scripting.Dictionary")
d.CompareMode = vbTextCompare 'la casse est ignorée
d("NOMS") = "": resu(1, 1) = "NOMS": n = 1
For i = 1 To UBound(t)
    If t(i, 1) <> "" And Not d.exists(t(i, 1)) Then
        d(t(i, 1)) = ""
        n = n + 1
        resu(n, 1) = Application.Proper(t(i, 1)) 'nom propre
    End If
Next
[A:A].ClearContents
[A1].Resize(n) = resu
[A1].Resize(n).Sort [A1], xlAscending, Header:=xlYes 'tri alphabétique
Application.EnableEvents = True 'réactive les évènements
End Sub
Fichier (2).

Edit : On Error Resume Next peut être supprimé ici.

A+
 

Pièces jointes

  • inscrire nom(2).xlsm
    24.8 KB · Affichages: 26
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonsoir à tous,

Un autre essai basé sur des formules et instructions Excel (donc un peu moins rapide que le code de @job75 ;)) :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
   If Not Intersect(Target, Columns(5)) Is Nothing Then
      Application.ScreenUpdating = False
      Worksheets("Feuil1").Activate
      Columns(1).Clear: On Error Resume Next
      With Range("a1:a" & Cells(Rows.Count, "e").End(xlUp).Row)
         .FormulaR1C1 = "=IF(RC[4]="""",NA(),TRIM(PROPER(RC[4])))": .Value = .Value
      End With
      Cells(1, 1).Insert xlShiftDown: Cells(1, 1) = "NOMS"
      With Range("a1:a" & Cells(Rows.Count, "a").End(xlUp).Row)
         .Sort key1:=Range("a1"), order1:=xlAscending, Header:=xlYes
         .RemoveDuplicates 1, xlNo
         .SpecialCells(xlCellTypeConstants, xlErrors).Delete xlShiftUp
      End With
      Range("a1:a" & Cells(Rows.Count, "a").End(xlUp).Row).Borders.LineStyle = xlContinuous
   End If
End Sub
 

Pièces jointes

  • REDGS- inscrire nom- v1.xlsm
    19.1 KB · Affichages: 20

job75

XLDnaute Barbatruc
Bonjour mapomme, le forum,

Le code de mon fichier (2) post #8 s'exécute chez moi en 4,6 millisecondes.

Le tien post #9 s'exécute en 4,4 millisecondes.

Et même en 3,3 millisecondes en simplifiant la formule :
Code:
   .FormulaR1C1 = "=TRIM(PROPER(RC[4]))": .Value = .Value
et en supprimant :
Code:
        .SpecialCells(xlCellTypeConstants, xlErrors).Delete xlShiftUp
Bonne journée.
 

job75

XLDnaute Barbatruc
Re,

Notez que la simple création du Dictionary prend du temps (un peu plus de 1 milliseconde).

Cette méthode est quand même la plus rapide sur de grands tableaux.

Sur les derniers fichiers copiez la plage D1:E18 sur D1:E54000 :

- fichier du post #8 => 0,14 seconde

- fichier du post #11 => 0,73 seconde.

A+
 

Discussions similaires

Réponses
5
Affichages
258

Statistiques des forums

Discussions
312 083
Messages
2 085 185
Membres
102 808
dernier inscrit
guo