XL 2019 Equivalent de sommeprod

Rabeto

XLDnaute Occasionnel
Bonjour,

Bonne et heureuse année 2024 à tous, vous souhaitant à tous du bonheur et surtout santé

j'ai besoin de votre aide svp, j'utilise ce formule pour compter le nombre de valeur distinct dans la colonne M hors les vides, sauf que la formule a rendu mon fichier très lourd et lorsque j'exécute un macro assez simple ne serais ce que effacer des données, l'exécution du macro a pris bcp de temps que d'habitude et ce depuis que j'ai commencé à utiliser cette formule.

SOMMEPROD(1/(NB.SI(M:M;M:M)+(M:M=0)))-NB.VIDE(M:M)

Est ce que vous connaissez une autre méthode svp,

merci d'avance
 
Solution
Re,

Une fonction sans doute un peu plus rapide pour de vastes plages :
VB:
Function NbrUnique&(plage As Range)
Dim xrgReduite As Range, xrg As Range, xrgSpecials As Range, collec As New Collection, xtype, xarea, x
   On Error Resume Next
   Set xrgReduite = Intersect(plage.Parent.UsedRange, plage)
   If xrgReduite Is Nothing Then On Error GoTo 0: Exit Function
   For Each xtype In Array(xlCellTypeFormulas, xlCellTypeConstants)
      Set xrgSpecials = xrgReduite.SpecialCells(xtype, 23)
      For Each x In xrgSpecials
         If Not IsError(x) Then If x <> "" Then collec.Add vbNullString, LCase(x)
      Next x
   Next xtype
   On Error GoTo 0
   NbrUnique = collec.Count
End Function

xUpsilon

XLDnaute Accro
Bonjour,

Belle année à toi également,
Sous Excel 2019 il va être difficile de faire mieux je pense. On pourrait toujours restreindre la plage par contre, je suppose que tu n'utilises pas les 1048576 lignes de la colonne M ?

Bonne journée,

PS : Bonjour JHA :)
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonsoir à tous :),

Sinon une fonction, VBA très rapide utilisable sur PC et Mac : NbrUnique(plage)
Cette fonction accepte une plage à plusieurs colonnes.
Exemple d'utilisation : = NbrUnique(M:M) ou = NbrUnique(M:P) ou = NbrUnique(M10:P9999)

Le code de la fonction :
VB:
Function NbrUnique(plage As Range)
Dim xrg As Range, collec As New Collection, x
   On Error Resume Next
   Set xrg = Intersect(plage.Parent.UsedRange, plage)
   For Each x In xrg.Value
      If x <> "" Then collec.Add vbNullString, LCase(x)
   Next x
   On Error GoTo 0
   NbrUnique = collec.Count
End Function
 
Dernière édition:

Modeste geedee

XLDnaute Barbatruc
Bonjour,

Bonne et heureuse année 2024 à tous, vous souhaitant à tous du bonheur et surtout santé

j'ai besoin de votre aide svp, j'utilise ce formule pour compter le nombre de valeur distinct dans la colonne M hors les vides, sauf que la formule a rendu mon fichier très lourd et lorsque j'exécute un macro assez simple ne serais ce que effacer des données, l'exécution du macro a pris bcp de temps que d'habitude et ce depuis que j'ai commencé à utiliser cette formule.

SOMMEPROD(1/(NB.SI(M:M;M:M)+(M:M=0)))-NB.VIDE(M:M)

Est ce que vous connaissez une autre méthode svp,

merci d'avance
Bonsour®
=SOMMEPROD(1/(NB.SI(MaplageM;MaplageM)+(MaplageM=0)))-NB.VIDE(MaplageM)
définir un nom dynamique pour la plage

1704736768751.png

OUPSS !!!
Bonjour Dunkirk...
Pas rafraîchi
 
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
Re,

Une fonction sans doute un peu plus rapide pour de vastes plages :
VB:
Function NbrUnique&(plage As Range)
Dim xrgReduite As Range, xrg As Range, xrgSpecials As Range, collec As New Collection, xtype, xarea, x
   On Error Resume Next
   Set xrgReduite = Intersect(plage.Parent.UsedRange, plage)
   If xrgReduite Is Nothing Then On Error GoTo 0: Exit Function
   For Each xtype In Array(xlCellTypeFormulas, xlCellTypeConstants)
      Set xrgSpecials = xrgReduite.SpecialCells(xtype, 23)
      For Each x In xrgSpecials
         If Not IsError(x) Then If x <> "" Then collec.Add vbNullString, LCase(x)
      Next x
   Next xtype
   On Error GoTo 0
   NbrUnique = collec.Count
End Function
 

Modeste geedee

XLDnaute Barbatruc
Bonsoir à tous, bonsoir Modeeste geedee.

Est-ce que cela ne serait pas mieux avec un EQUIV(9^9;$M:$M;1) plutôt qu'avec un NBVAL, si la colonne M contient des nombres ?

@ plus
Bonsour®
Oui tout à fait ;)
en l'absence de fichier :rolleyes:, savoir comment est organisée et le contenu de la colonne M (vide, formule, texte, valeur num) ???
NB compte les valeurs numériques ?
NBVAL compte les valeurs alphanumériques non vide ?
dernière ligne renseignée ???
 

Rabeto

XLDnaute Occasionnel
Re,

Une fonction sans doute un peu plus rapide pour de vastes plages :
VB:
Function NbrUnique&(plage As Range)
Dim xrgReduite As Range, xrg As Range, xrgSpecials As Range, collec As New Collection, xtype, xarea, x
   On Error Resume Next
   Set xrgReduite = Intersect(plage.Parent.UsedRange, plage)
   If xrgReduite Is Nothing Then On Error GoTo 0: Exit Function
   For Each xtype In Array(xlCellTypeFormulas, xlCellTypeConstants)
      Set xrgSpecials = xrgReduite.SpecialCells(xtype, 23)
      For Each x In xrgSpecials
         If Not IsError(x) Then If x <> "" Then collec.Add vbNullString, LCase(x)
      Next x
   Next xtype
   On Error GoTo 0
   NbrUnique = collec.Count
End Function
Merci à tous pour votre contribution,
j'ai pris la réponse de mapomme comme étant la solution,
 

Discussions similaires

Réponses
35
Affichages
2 K
Réponses
11
Affichages
458

Statistiques des forums

Discussions
312 213
Messages
2 086 307
Membres
103 174
dernier inscrit
OBUTT