XL 2016 Extraire liste de date sans doublon - Pb format date 00/01/00

loulourav

XLDnaute Occasionnel
Bonjour à tous,

j'ai parcouru le forum à la recherche d'une formule me permettant d'extraire automatiquement une liste de date sans doublon.
je pense avoir trouvé la bonne formule, mais le résultat qu'il en ressort n'est pas bon, je n'ai que des 00/01/00 (ou 00/01/99 j'ai changé le format)

je joins un fichier avec un extrait de ma base de donnée et la formule que j'utilise

merci d'avance pour votre aide précieuse !


edit1: de même j'ai dans mon rapport un TCD qui n'est pas lié à mes segments (source de donnée différente), est-il possible via un code VBA de faire Actualiser ce TCD lorsque l'on clic sur un segment ?

merci +++
 

Pièces jointes

  • Extraire-liste-valeurs-uniques.xlsx
    184.3 KB · Affichages: 15
Dernière édition:

job75

XLDnaute Barbatruc
Bonsoir loulourav,

Votre formule est erronée, de plus le 1er tableau est défini sur la colonne A entière, c'est une hérésie !

De toute façon sur de grands tableaux il ne faut pas utiliser des formules matricielles, elles pédalent dans la choucroute.

Voyez le fichier joint et cette macro dans le code de la feuille, c'est une solution très classique :
VB:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim tablo, d As Object, i&
tablo = [Tableau3].Resize(, 2).Value2 'matrice, plus rapide, au moins 2 éléments
Set d = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(tablo)
    If tablo(i, 1) <> "" Then d(tablo(i, 1)) = ""
Next
'---restitution---
[Tableau4].Resize(d.Count) = Application.Transpose(d.keys)
[Tableau4].Sort [Tableau4], xlAscending, Header:=xlYes 'tri
End Sub
Avec un tableau VBA et le Dictionary c'est très rapide.

Bonne nuit.
 

Pièces jointes

  • Liste VBA(1).xlsm
    196.4 KB · Affichages: 8

loulourav

XLDnaute Occasionnel
Bonjour Job75,

merci beaucoup pour cette macro ! je vais essayer de l'adapter sur mon TDB mais en tout cas elle répond parfaitement a ce que je souhaite !
Puis-je abuser ? est ce possible de n'extraire, tjs sans doublon, que les données entre 2 dates ?
j'ai ailleurs dans le fichier mes dates Min et Max qui sont relié à des segments de TCD, et j'aimerai extraire directement toutes les dates comprises entre ces 2 cellules (min et max inclus).
Enfin est ce que la MAJ de ce tableau peut ce faire à chaque changement de ces 2 cellules (Min et Max)

merci beaucoup !
 

job75

XLDnaute Barbatruc
Pour extraire entre 2 dates voyer ce fichier (2) et la macro :
VB:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Application.CutCopyMode Then Exit Sub 'permet le copier-coller
Dim mini, maxi, tablo, d As Object, i&, x
mini = [E2]: maxi = [F2] 'à adapter
tablo = [Tableau3].Resize(, 2).Value2 'matrice, plus rapide, au moins 2 éléments
Set d = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(tablo)
    x = tablo(i, 1)
    If x <> "" Then If x >= mini And x <= maxi Then d(x) = ""
Next
'---restitution---
With [Tableau4]
    If d.Count Then .Resize(d.Count) = Application.Transpose(d.keys)
    If .Rows.Count > d.Count Then .Rows(d.Count + 1).Resize(.Rows.Count - d.Count).Delete xlUp 'RAZ en dessous
    .Sort .Columns(1), xlAscending, Header:=xlYes 'tri
End With
End Sub
Même avec des segments il est mieux d'utiliser l'évènement Worksheet_SelectionChange pour exécuter le code.

A+
 

Pièces jointes

  • Liste VBA(2).xlsm
    198 KB · Affichages: 6

job75

XLDnaute Barbatruc
Non, pas parfaitement.

Avec la macro du fichier (2) il y a un bug quand le tableau des résultats est vide.

Ce fichier (3) y remédie en ajoutant un élément vide :
VB:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Application.CutCopyMode Then Exit Sub 'permet le copier-coller
Dim mini, maxi, tablo, d As Object, i&, x
mini = [E2]: maxi = [F2] 'à adapter
tablo = [Tableau3].Resize(, 2).Value2 'matrice, plus rapide, au moins 2 éléments
Set d = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(tablo)
    x = tablo(i, 1)
    If x <> "" Then If x >= mini And x <= maxi Then d(x) = ""
Next
If d.Count = 0 Then d("") = "" 'ajout d'un élément vide
'---restitution---
With [Tableau4]
    .Resize(d.Count) = Application.Transpose(d.keys)
    If .Rows.Count > d.Count Then .Rows(d.Count + 1).Resize(.Rows.Count - d.Count).Delete xlUp 'RAZ en dessous
    .Sort .Columns(1), xlAscending, Header:=xlYes 'tri
End With
End Sub
A+
 

Pièces jointes

  • Liste VBA(3).xlsm
    199.4 KB · Affichages: 6

job75

XLDnaute Barbatruc
Bonjour loulourav,le forum,

Pour peaufiner je viens d'ajouter cette macro dans le fichier précédent :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim sa$
With Application
    .ScreenUpdating = False
    .EnableEvents = False 'désactive les évènements
    On Error Resume Next
    .Undo 'annule l'entrée
    sa = Selection.Address 'mémorise
    .Undo 'rétablit l'entrée
    If Target.Address = sa Then Worksheet_SelectionChange Target 'lance la macro
    .EnableEvents = True 'réactive les évènements
End With
End Sub
Elle se déclenche quand on modifie ou valide une cellule quelconque.

Bonne journée.
 

loulourav

XLDnaute Occasionnel
Bonjour loulourav,le forum,

Pour peaufiner je viens d'ajouter cette macro dans le fichier précédent :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim sa$
With Application
    .ScreenUpdating = False
    .EnableEvents = False 'désactive les évènements
    On Error Resume Next
    .Undo 'annule l'entrée
    sa = Selection.Address 'mémorise
    .Undo 'rétablit l'entrée
    If Target.Address = sa Then Worksheet_SelectionChange Target 'lance la macro
    .EnableEvents = True 'réactive les évènements
End With
End Sub
Elle se déclenche quand on modifie ou valide une cellule quelconque.

Bonne journée.

Re !

le code fonctionne parfaitement pour le moment ! je n'ai pas eu encore le temps de l'éprouver totalement mais les quelques test effectués sont concluants ! merci beaucoup !

en revanche n'y a-t-il tout de même pas une solution permettant le déclenchement de la macro lorsque les valeurs contenues dans les cellules Min et Max changent ?
la problématique est que mon tableau de bord contient un onglet de restitution avec des segments pour interagir sur les dates librement.
dans un onglet caché j'y insère toutes mes datas dont mes valeurs des dates min et max et cette macro (entres autres), il faut donc revenir sur cet onglet, qui est censé ne pas apparaître, pour que la macro s’exécute ce qui n'est pas optimal dans l'utilisation que j'envisage ...

je mets en PJ une V4 avec ces éléments.

merci

cdlt
 

Pièces jointes

  • Liste VBA(4).xlsm
    790.1 KB · Affichages: 5

job75

XLDnaute Barbatruc
Bien sûr j'ai modifié :
VB:
mini = [H2]: maxi = [I2] 'à adapter
et j'ai ajouté cette macro :
VB:
Private Sub Worksheet_Calculate()
Application.EnableEvents = False 'désactive les évènements
Worksheet_SelectionChange [A1]
Application.EnableEvents = True 'réactive les évènements
End Sub
Elle se déclenche quand une formule est recalculée.
 

Pièces jointes

  • Liste VBA(4).xlsm
    798.1 KB · Affichages: 5

Discussions similaires

Réponses
3
Affichages
310
Réponses
5
Affichages
716

Statistiques des forums

Discussions
311 720
Messages
2 081 899
Membres
101 834
dernier inscrit
Jeremy06510