Macro MFC et renvoi de resultat

jokerfidelio

XLDnaute Occasionnel
Bonjour a tous,

J'utilise dans mon fichier une macro de Mr Didier FOURGEOT qui permet une multitude de MFC non limite par ecxel.
Mon probleme, je pense, que cette macro m’empêche de faire pointé le résultat d'une cellule sur un autre onglet

exemple ; onglet "PLANNING PREPARATION JOUR" celllule en" F32" qui renvoi le resultat sur "LUNDI" en "E10"

merci de votre aide je n'arrive pas a trouver de solution.
 

Pièces jointes

  • PROJET ATTRIB V2-2017_ V4 - Copie (2).xlsm
    3.1 MB · Affichages: 47
Solution
Bonjour

J'ai laissé tomber cette restriction.
J'ai suivi mon idée et cela fonctionne. J'utilise une fonction personnalisée pour détecter les cellules qui sont recalculées.
En utilisant une fonction personnalisée et la méthode ThisCell (assez peu utilisée en général), on peut récupérer l'adresse de la cellule recalculée.
Pour la feuille, je suis obligé de renvoyer directement le nom car une fonction type Cellule("NomFichier") renvoie la feuille active mais ce la ne pose pas de problème. La contrainte est de sélectionner les valeurs 1 à 1, pas de copier coller de valeurs multiples, il faudrait pour cela une macro dédiée ou construire un tableau des cellule recalculées.
Quand tu modifies la feuille planning préparation jour, la cellule...

Bernard_XLD

XLDnaute Barbatruc
Membre du Staff
Bonjour

Sois plus précis dans ta demande, quelle est précisément l'action, que doit il se passer?
Il est plus compliqué d'analyser un code si on ne sait pas ce qu'il est censé faire précisément, ==> bug ou erreur de prog.

Cordialement, @+
 

jokerfidelio

XLDnaute Occasionnel
Sur l onglet "PLANNING PRÉPARATION JOUR" en F15 avec le menu déroulant je sélectionne par exemple "REPOS". J aimerais que sur l'onglet "LUNDI" en E15 apparaisse le même résultat. Mais la valeur en E15 sur "LUNDI" n'apparaît pas.
En utilisant =PLANNING PRÉPARATION JOUR'!F15 dans la cellule où doit apparaître le résultat, mais rien....
Alors que si je met cette valeur sur une autre zone de la feuille cela fonctionne correctement. Sauf sur cette colonne ou la MFC et en macro
 

Bernard_XLD

XLDnaute Barbatruc
Membre du Staff
Bonsoir

ta valeur change bien mais la MFC ne fonctionne pas sur les cellules dépendantes d'une cellule modifiée par la MFC.
Mets ta formule en lundi e15, changes la valeur sur planning préparation jour en f15
Reviens sur ta feuille lundi et redéfinis la couleur de police en standard ou toute autre que blanche, la valeur a bien été modifiée.

Cordialement
 

Bernard_XLD

XLDnaute Barbatruc
Membre du Staff
Bonjour

Voila une modif du code, elle se base sur l'événement Workbook_SheetCalculate qui est déclenché par le recalcul des formules.
En cas de recalcul d'un feuille, cette proc récupère les cellules de la feuille qui sont à la fois en formule et en format MFC et leur applique la MFC,.
On a donc deux proc pour contourner le problème, une qui applique la MFC aux changements des cellules en MFC, une autre qui applique la MFC sur les cellules en formules et en MFC qui sont recalculées.
Il faut juste ajouter la proc Workbook_SheetCalculate dont voici le code dans Thisworkbook , tu as ton classeur exemple modifié en pièce jointe.

Bien cordialement, @+
Code:
'---------------------------------------------------------------------------------------
' Auteur    : Didier FOURGEOT (myDearFriend!)
' Date      : 18/09/2005
' Sujet     : MFC multiples
' Modification    : Yeahou
' Date      : 18/09/2018
' Sujet     : application des MFC multiples aux formules
'---------------------------------------------------------------------------------------
Private Sub Workbook_SheetCalculate(ByVal Sh As Object)
    Dim TabTemp As Variant
    Dim L As Long
    Dim V As Variant
    Dim Cellules_en_MFC  As Range, Cellules_en_Formule As Range, Formule_et_MFC As Range, Cellule_en_Cours As Range
    'trouve les cellules en MFC de la feuille
    Set Cellules_en_MFC = Sh.Cells.SpecialCells(xlCellTypeAllFormatConditions)
    'trouve les cellules en formule de la feuille
    Set Cellules_en_Formule = Sh.Cells.SpecialCells(xlCellTypeFormulas, 23)
    If Not Application.Intersect(Cellules_en_MFC, Cellules_en_Formule) Is Nothing Then
        'désactive l'affichage écran
        Application.ScreenUpdating = False
        'Lance pour chaque cellule trouvée
        Set Formule_et_MFC = Application.Intersect(Cellules_en_MFC, Cellules_en_Formule)
        For Each Cellule_en_Cours In Formule_et_MFC
            'Vérifie la présence du format conditionnel "spécial"
            If Cellule_en_Cours.FormatConditions.Count > 0 Then
                If Cellule_en_Cours.FormatConditions(1).Formula1 = "=mDF" Then
                    With Sheets("MFC")
                        'Charge les préférences dans un tableau variant temporaire
                        L = .Range("A65536").End(xlUp).Row
                        TabTemp = .Range(.Cells(1, 1), .Cells(L, 1)).Value
                        'Détermine le format à utiliser suivant la valeur de la cellule
                        If Cellule_en_Cours.Value = "" Then
                            L = 1
                        Else
                            For L = 2 To UBound(TabTemp, 1)
                                'Fonctionne en minuscule/majuscule pour les chaines de caractères
                                If UCase(Cellule_en_Cours.Value) = UCase(TabTemp(L, 1)) Then Exit For
                            Next L
                        End If
                        'Gestion des erreurs (impératif, compte tenu de la désactivation des évènements)
                        On Error GoTo Fin
                        Application.EnableEvents = False
                        'Applique le format (sauf les bordures)
                        .Cells(L, 2).Copy
                        V = Cellule_en_Cours.Formula
                        Cellule_en_Cours.PasteSpecial Paste:=xlPasteAllExceptBorders, Operation:=xlNone, _
                                SkipBlanks:=False, Transpose:=False
                        Cellule_en_Cours.Formula = V
                        'Il semble que sur Mac et dans certaines situations (non ciblées) le format
                        'conditionnel "spécial" d'origine ne soit pas écrasé par le nouveau, il convient
                        'donc de s'en assurer avant de réimposer ce format spécial.
                        If Cellule_en_Cours.FormatConditions.Count < 1 Then Cellule_en_Cours.FormatConditions.Add Type:=xlExpression, Formula1:="=mDF"
                        Application.CutCopyMode = False
                        Application.EnableEvents = True
                    End With
                End If
            End If
        Next Cellule_en_Cours
        Set Cellules_en_MFC = Nothing
        Set Cellules_en_Formule = Nothing
        Set Formule_et_MFC = Nothing
        Set Cellule_en_Cours = Nothing
        'réactive l'affichage écran
        Application.ScreenUpdating = True
    End If
Exit Sub
Fin:
    'En cas d'erreur dans le code, il convient impérativement de rétablir la gestion des
    'évènements d'application pour la suite. Par une gestion d'erreur, on réaffecte la
    'valeur True à la propriété Application.EnableEvents et on informe l'utilisateur qu'une
    'erreur non gérée est survenue
    MsgBox "Erreur non gérée dans la procédure Workbook.SheetChange()" & vbLf & "Erreur : " & _
        Err & " " & Err.Description, vbOKOnly, "myDearFriend!"
    Application.EnableEvents = True
End Sub
 

Pièces jointes

  • PROJET ATTRIB V2-2017_ V4 - Soluce.xlsm
    3 MB · Affichages: 26

Bernard_XLD

XLDnaute Barbatruc
Membre du Staff
Bonjour

Pour accélérer, j'ai enlevé la copie du process et j'applique sur chaque propriété du format celle de la MFC si elle est différente, cela accélère le code.
J'ai mis des formules dans toutes les cellules de la feuille lundi, le temps d'exécution est divisé par 100.
On pourrait encore accélérer en ne testant que les propriétés principales, couleur de fond, police et taille, etc.

Cordialement
 

Pièces jointes

  • PROJET ATTRIB V2-2017_ V4 - Soluce_2.xlsm
    3 MB · Affichages: 23

jokerfidelio

XLDnaute Occasionnel
bonjour Yeahou

J ai pris le temps de tester le fichier avec tous les ongletset renseignement mis. le fichier reste encore un peu lent lors de son execution.
je m'en remet une fois de plus a vous. (car complètement dépassé) pouvez vous encore optimiser le temps de réponse ?
d'avance encore merci.
 

Pièces jointes

  • PROJET ATTRIB V2-2017_ V4 - Soluce_2.xlsm
    3.1 MB · Affichages: 20

Bernard_XLD

XLDnaute Barbatruc
Membre du Staff
Bonsoir

si vous avez un ou deux critères combinés ou même trois (couleur de fond, couleur de police, police en gras, taille de police, etc) qui rendent chaque MFC unique, on peut diminuer les tests en les limitant à ces propriétés combinées au lieu de tester chaque propriété séparément et donc accélérer l'exécution, cela concernerait uniquement le test et non le transfert de la MFC qui resterait entier.

Cordialement
 

Discussions similaires

Statistiques des forums

Discussions
312 215
Messages
2 086 333
Membres
103 188
dernier inscrit
evebar