Utiliser une fonctiondans une MFC

Bonjour,

Déjà, est-ce qu'il est possible de lier une fonction à une MFC.

J'ai comme fonction:

Function TrouveDouble(ByRef plage1, plage2) As Boolean
Dim c, cg
For Each c In plage1
   If c <> "" Then
      For Each cg In plage2
         If c = Mid(cg, 7, 50) Then c = True
      Next cg
   End If
Next c
End Function

Dans ma MFC, j'ai placé:

=trouvedouble($B$3:$F$11;$H$3:$N$19) 

et s'applique à

=$B$3:$F$11

Une idée pour solutionner mon souci du jour!

Une MFC directe, une autre fonction ?

Merci

Bonjour,

Il faudrait commencer par écrire une fonction qui fonctionne : ta fonction de retourne pas de résultat.

(teste ta fonction dans la feuille de calcul avant d'essayer dans une MFC)

Il est aussi très vivement conseillé de typer toutes les variables, en particulier dans une fonction personnalisée.

Bonjour Patrice,

Merci pour ta réponse.

Sinon ce dysfonctionnement, tu sais le corriger ? C'est un peu dans ma question.

Une MFC directe, une autre fonction ?

Cdt

Re,

La fonction :

Option Explicit
Function TrouveDouble(ByRef cellule As Range, plage As Range) As Variant
Dim c As Range, trouve As Boolean
  If cellule.Count > 1 Then
    TrouveDouble = CVErr(XlCVError.xlErrRef)
  Else
    For Each c In plage.Cells
      If c.Value <> "" Then
        If cellule.Value = Mid(c.Value, 7, 50) Then trouve = True: Exit For
      End If
    Next c
    TrouveDouble = trouve
  End If
End Function

Le fichier :

Question subsidiaire, pourquoi 50 ; ne suffit-t'il pas de Mid(c.Value, 7)

Re,

Çà c'est de la réponse.

Merciiii

Cdt

Re,

Je reviens vers toi car tu as l'air de bien maitriser les fonctions.

J'ai actuellement deux questions qui tournent sur le forum.

Une question sur une fonction liée au calcul de cellule non vides sur une plage de cellules

L'autre que tu connais bien car tu es à l'origine.

Le problème c'est que lorsque j'ai les deux fonctions sur une même feuille et qui opèrent sur la même plage de cellules, j'ai des boucle qui se font sur la fonction sommeetp(). En tout as sur mon projet original.

Est-ce que tu aurais une idée pour palier à ce problème.

Je joins un fichier où les deux fonctions cohabitent.

A noter que sur mon projet original, j'ai douze feuilles avec 5 zones par feuille où se trouvent ces deux fonctions.

Merci pour tes conseils éclairés.

Çà c'est de la réponse.

J'aurais préféré que ce sois toi qui la construises étape par étape en te corrigeant si besoin.

Il te reste à analyser et comprendre le fonctionnement pour voir ce qui manquait dans ta fonction.

Re,

Tu penses à la première fonction ou à la deuxième?

J'ai tenté application.enableevents=false/true mais rien y fait.

Une piste au moins

Ps Ta fonction dis-tu... alors c'est la 1ere

Le problème c'est que lorsque j'ai les deux fonctions sur une même feuille et qui opèrent sur la même plage de cellules, j'ai des boucle qui se font sur la fonction sommeetp().

Je ne comprends pas ton histoire de boucles !

Ta formule de MFC n'est pas bonne !

J'ai réécris ta seconde fonction : une fonction ne doit jamais désigner nommément une feuille, elle doit recevoir les paramètres nécessaires à son calcul de façon que lorsque les plages changent, il suffise de modifier la formule sur la feuille, sans intervenir dans la macro.

Function SommeETP(ByRef plage As Range, plageBd As Range) As Double
Dim t As Variant, c As Range, i As Long, total As Double
  t = plageBd.Value
  For Each c In plage.Cells
    If c.Value <> "" Then
      For i = 1 To UBound(t)
        If t(i, 1) = c.Value Then total = total + t(i, 2)
      Next i
    End If
  Next c
  SommeETP = total
End Function

Le fichier :

re,

une fonction ne doit jamais désigner nommément une feuille, elle doit recevoir les paramètres nécessaires à son calcul de façon que lorsque les plages changent, il suffise de modifier la formule sur la feuille, sans intervenir dans la macro. 

C'est une bonne précaution et je reconnais l'évidence de ta remarque.

Quand je parle de boucle, passe en pas à pas et tu verras que la fonction s'effectue plusieurs fois, au moins deux fois.

Ou en mettant un arrêt sur la ligne SommeETP=Total (le constat est plus rapide). Tu constateras le problème que je souligne et qui ralentit considérablement surtout quand on a 5 formules sommeetp et 5 mfc trouvedouble dans la même feuille.

Cdt

Re Patrice,

J'ai anonymé le projet pour que tu puisses tester et voir le problème.

Pour tester, se rendre sur la feuille du mois de Mai

Dans la deuxième semaine, sur la droite il y a des noms. Ils sont issus du planning feuille congé.

Dans cette feuille du mois de Mai, dans le tableau de gauche choisir dans les listes de validation un nom. S'il se trouve (TrouveDouble) dans la partie droite il devient rouge selon la MFC. Très bien!

En dessous du n° de semaine càd S20 la somme des ETP (fonction SommeETP() )se fait en lien avec la liste des salariés de la feuille paramètre.

Si comme moi tu as la chance d'avoir deux écrans , ouvre le module ETP où tu trouveras les deux fonctions.

Admire le feu d'artifice dans la barre des titres de l'editeur VBE. Si tu n'as pas deux écrans, le feu d'artifice dure le temps de retrouver ton curseur (flèche durant le feu d'artifice, et croix dès que prêt)

Si tu mets un point d'arrêt sur la ligne sommeetp=total tu constateras 60 passages.

Bizarrement la fonction TrouveDouble ne s'initialise qu'une seule fois comme si elle accordait ses violons avec les 60 MFC. (12 feuilles x5 trouvedouble).

Je cherche mais je ne "trouve" pas!

Si tu as une idée, elle est la bienvenue

Merci

Bonjour,

J'ai retravaillé les fonctions sur mon dernier fichier (je viens juste de voir ton projet) en passant par des tableaux VBA pour en améliorer nettement leur rapidité.

Effectivement, lorsque tu utilises la fonction TrouveDouble dans une MFC, il y a plusieurs passage dans la fonction (2, 3 ou 4 selon le cas) pour chaque cellule. C'est lié au fonctionnement d'Excel, on ne peut rien y changer.

L'option 2 c'est d'utiliser la fonction dans une table de cellules (vrai / faux) et de mettre les MFC par rapport à cette table.

La fonction n'est sollicité qu'une fois par cellule : c'est donc 2 ou 3 fois moins qu'avec la fonction dans la MFC.

Re,

Je suis allé un peu vite, c'est pas rédhibitoire, mais c'est mieux avec le contrôle des plages (bientôt rouvertes ) :

Option Explicit

Function TrouveDouble(ByRef cellule As Range, plage As Range) As Variant
Dim p, v, x As Long, y As Long, trouve As Boolean
  If cellule.Count > 1 Or plage.Count = 1 Then
    TrouveDouble = CVErr(XlCVError.xlErrRef)
  Else
    p = plage.Cells
    v = cellule.Value
    For x = LBound(p) To UBound(p)
      For y = LBound(p, 2) To UBound(p, 2)
        If p(x, y) <> "" Then
          If v = Mid(p(x, y), 7) Then trouve = True: Exit For
        End If
      Next y
    Next x
    TrouveDouble = trouve
  End If
End Function
Function SommeETP(ByRef plage As Range, plageBd As Range) As Variant
Dim p, b, i As Long, x As Long, y As Long, total As Double
  If plage.Count = 1 Or plageBd.Count = 1 Then
    SommeETP = CVErr(XlCVError.xlErrRef)
  Else
    p = plage.Value
    b = plageBd.Value
    For x = LBound(p) To UBound(p)
      For y = LBound(p, 2) To UBound(p, 2)
        If p(x, y) <> "" Then
          For i = 1 To UBound(b)
            If b(i, 1) = p(x, y) Then total = total + b(i, 2)
          Next i
        End If
      Next y
    Next x
    SommeETP = total
  End If
End Function

Je mets tout ça sur le projet et je te tiens au courant.

Merci, merci et merci tu temps que tu accordes à mon problème.

Cdt

Je deviens chèvre!

J'ai l'impression que c'est encore plus long.

Est-ce que tu as essayé de mettre ces fonction sur le projet?

Ou c'est mon pc qui fait comme moi, qui vieillit...

Cdt

Rechercher des sujets similaires à "utiliser fonctiondans mfc"