VBA Excel - fonction UNIQUE

Anonyme
2021-01-12T10:00:26+00:00

Bonjour,

Je cherche désespérément sous VBA comment compter le nombre de dates uniques dans une variable (array) contenant près de 4000 valeurs.

Ma variable se nomme "arrListeDatesOuvertures"

Ainsi que le nom de la variable l'indique, il s'agit d'une liste de dates (souvent avec des doublons) entre début 2014 et, pour l'instant, fin 2020.

J'ai fait une déclaration Dim arrListeDatesOuvertures As Variant

puis un redimensionnement ReDim arrListeDatesOuvertures(intNbDonnees) dans lequel intNbDonnees est une variable qui augmente au fil du temps et est actuellement proche de 4000

Je tente :

WorksheetFunction.Count(WorksheetFunction.Unique(arrListeDatesOuverures))

ou d'autres variations autour de la ligne ci-dessus. Jusqu'à présent rien ne marche alors que les fonctions UNIQUE et NB fonctionnent parfaitement dans mes feuilles Excel.

Où est mon erreur ?

Dans un second temps, je cherche à compter depuis la variable "arrListeDatesOuvertures" le nombre de dates sans doublons durant une période définie (année, trimestre ou autre périodicité).

Merci pour votre aide et Cordialement.

Microsoft 365 et Office | Excel | Pour la maison | Windows

Question verrouillée. Cette question a été migrée à partir de la Communauté Support Microsoft. Vous pouvez voter pour indiquer si elle est utile, mais vous ne pouvez pas ajouter de commentaires ou de réponses ni suivre la question.

0 commentaires Aucun commentaire

5 réponses

  1. DanielCo 107.7K Points de réputation
    2021-01-12T10:27:32+00:00

    Bonjour,

    UNIQUE est une fonction nouvelle dans Excel et elle n'existe pas dans VBA à ce jour.

    Pour extraire les valeurs uniques, le plus rapide est de se servir d'un dictioinnaire :

    Sub test()

      Dim arrListeDatesOuvertures As Variant, Dico As Object, Res(), Ctr As Long

      Set Dico = CreateObject("Scripting.Dictionary")

      arrListeDatesOuvertures = Application.Transpose(Range("I1", Cells(Rows.Count, 9).End(xlUp)))

      Ctr = -1

      ReDim Res(0)

      For i = 1 To UBound(arrListeDatesOuvertures)

        If Not Dico.exists(arrListeDatesOuvertures(i)) Then

          Dico.Add arrListeDatesOuvertures(i), arrListeDatesOuvertures(i)

          Ctr = Ctr + 1

          ReDim Preserve Res(Ctr)

          Res(Ctr) = arrListeDatesOuvertures(i)

        End If

      Next i

      Cells(1, 10).Resize(UBound(Res) + 1) = Application.Transpose(Res)

    End Sub

    Cordialement.

    Daniel

    Cette réponse a-t-elle été utile ?

    3 personnes ont trouvé cette réponse utile.
    0 commentaires Aucun commentaire
  2. DanielCo 107.7K Points de réputation
    2021-03-16T09:10:30+00:00

    Merci du retour. Pour moi, on n'a pas besoin de cocher la référence "Microsoft Scripting Runtime" ("early binding"). On travaille en "late binding" avec la commande CreateObject, ce qui évite d'avoir à la cocher. Fais-moi savoir si tu as un souci avec.

    Daniel

    Cette réponse a-t-elle été utile ?

    2 personnes ont trouvé cette réponse utile.
    0 commentaires Aucun commentaire
  3. Anonyme
    2021-03-15T21:29:33+00:00

    Désolé d'avoir tant tardé pour répondre mais la procédure proposée fonctionne de manière parfaite.

    Juste deux petits détails :

    * Dans VBA il faut que la référence "Microsoft Scripting Runtime" soit activée.

    * En cas d'Option Base 1 il faut écrire ReDim res(1).

    Merci pour votre aide

    Cette réponse a-t-elle été utile ?

    0 commentaires Aucun commentaire
  4. Anonyme
    2021-01-15T11:00:53+00:00

    Bonjour,

    Pouvez-vous s’il vous plait, revenir vers nous, et nous informer si Daniel a pu vous venir en aide avec sa réponse.

    Si cela et le cas, je vous prie de bien vouloir cocher l’option « Marquer comme réponse » à partir du menu déroulant -**Outils avancés,**en-dessous de la réponse respective qui vous a aidé.

    De cette façon, les réponses validées seront promues immédiatement en-dessous de la question initiale, et tous les autres lecteurs ayant le même souci {la même question}, pourront plus aisément retrouver la réponse, lors de leurs recherches dans notre forum et sur internet.

    Cordialement,

    Boris

    MicrosoftEngineer

    Cette réponse a-t-elle été utile ?

    0 commentaires Aucun commentaire
  5. Anonyme
    2021-01-12T10:51:22+00:00

    Merci pour cette prompte réponse. Je vais la tester et, au passage, accroître grâce à cela mes connaissances. Jusqu'à ce jour  je n'avais jamais utilisé de dictionnaire.

    Bien cordialement

    Cette réponse a-t-elle été utile ?

    0 commentaires Aucun commentaire