Optimisation d'une fonction
skk201
Messages postés
942
Date d'inscription
Statut
Membre
Dernière intervention
-
skk201 Messages postés 942 Date d'inscription Statut Membre Dernière intervention -
skk201 Messages postés 942 Date d'inscription Statut Membre Dernière intervention -
Bonjour à tous,
J'ai trouvé cette fonction dans cette discutions : https://forums.commentcamarche.net/forum/affich-25537064-excel-nb-si-avec-ou
C'est une fonction qui permet de faire un NB.si "OU".
Mais comme le dit son programmeur, elle n'est pas optimisé.
J'aimerais l'utiliser pour compter le nombre de "Oui" dans une colonne dans un fichier avec des résultats en français et en allemand.
Donc j'aimerais que la formule compte les cellules qui contiennent les valeurs "oui" ou "ja".
Mais le problème c'est comme la recherche se fait sur une colonne entière, (comme le nombre de ligne est dynamique) alors le temps de calcule est trop long.
Est-ce que vous avez une idée comment l'optimisé ?
Voici la fonction :
Merci de votre attention
J'ai trouvé cette fonction dans cette discutions : https://forums.commentcamarche.net/forum/affich-25537064-excel-nb-si-avec-ou
C'est une fonction qui permet de faire un NB.si "OU".
Mais comme le dit son programmeur, elle n'est pas optimisé.
J'aimerais l'utiliser pour compter le nombre de "Oui" dans une colonne dans un fichier avec des résultats en français et en allemand.
Donc j'aimerais que la formule compte les cellules qui contiennent les valeurs "oui" ou "ja".
Mais le problème c'est comme la recherche se fait sur une colonne entière, (comme le nombre de ligne est dynamique) alors le temps de calcule est trop long.
Est-ce que vous avez une idée comment l'optimisé ?
Voici la fonction :
Public Function CompterCelMot(plageTexte As Range, listeMots As Range) As Long
Dim cTexte As Range, cMot As Range
For Each cTexte In plageTexte
For Each cMot In listeMots
If InStr(cTexte, cMot) > 0 Then
CompterCelMot = CompterCelMot + 1
Exit For
End If
Next cMot
Next cTexte
End Function
Merci de votre attention
A voir également:
- Optimisation d'une fonction
- Optimisation pc - Accueil - Utilitaires
- Fonction si et - Guide
- Optimisation découpe panneau gratuit - Télécharger - Outils professionnels
- Fonction miroir - Guide
- Fonction moyenne excel - Guide
2 réponses
Bonjour
avec une macro paramètée- on peut transformer en function si on le préfère
avec une macro paramètée- on peut transformer en function si on le préfère
Option Explicit
Dim critère()
'------
Sub test()
Dim Derlig As Long, T_in
With Sheets(1)
critère = Array("Oui", "Ja")
Derlig = .Columns("A").Find("*", , , , , xlPrevious).Row
T_in = Application.Transpose(Range("A2:A" & Derlig))
compterunmotoudeux T_in
End With
End Sub
'-----
Sub compterunmotoudeux(Tablo)
Dim cptr As Long, nbre As Long
For cptr = 1 To UBound(Tablo)
If UCase(Tablo(cptr)) = UCase(critère(0)) _
Or _
UCase(Tablo(cptr)) = UCase(critère(1)) Then nbre = nbre + 1
Next
MsgBox "nombre total de " & critère(0) & " et de " & critère(1) & " : " & nbre
End Sub
Bonjour à tous,
Si tes celulles contiennent ces mots seuls (pas inclus dans des phrases) tu peux tenter ça :
Ca devrait être rapide.
eric
Si tes celulles contiennent ces mots seuls (pas inclus dans des phrases) tu peux tenter ça :
Public Function CompterCelMot(plageTexte As Range, listeMots As Range) As Long
Dim cTexte As Range, cMot As Range
For Each cMot In listeMots
CompterCelMot = CompterCelMot + Application.CountIf(plageTexte, cMot)
Next cMot
End Function
Ca devrait être rapide.
eric
Option Explicit Dim critère() '------ Function NB_OU(Choix1 As String, Optional Choix2 As String = "") As Integer Dim Derlig As Long, T_in With Sheets("Liste") critère = Array(Choix1, Choix2) Derlig = .Columns("BS").Find("*", , , , , xlPrevious).Row T_in = Application.Transpose(Range("BS2:BS" & Derlig)) End With NB_OU = compter(T_in) End Function '----- Function compter(Tablo As Variant) As Integer Dim cptr As Long, nbre As Long For cptr = 1 To UBound(Tablo) If UCase(Tablo(cptr)) = UCase(critère(0)) _ Or _ UCase(Tablo(cptr)) = UCase(critère(1)) Then nbre = nbre + 1 Next compter = nbre End FunctionEst-ce une jolie conversion ? :)
Edit :
Il me dit que critère(0) n'est pas un sub valide O.o (Ligne 18)