Macro MFC devient folle

Absinth

XLDnaute Junior
Bonjour bonjour,

J'ai récemment cherché a faire plus de 3 MFC, et je suis tombé sur une super macro qui permet de mettre autant de MFC qu'on voulait, en introduisant une feuille supplémentaire, et on appliquait ce qu'on voulait aux cases... (je n'arrive plus à retrouver le post)

Cette macro marchait à merveille, sauf que depuis ce matin, chaque fois que je touche à une case, on dirait que la macro tourne en boucle infinie, ce qui finit par planter Excel...

Je ne comprends pas bien pourquoi...

une idée?
 

Absinth

XLDnaute Junior
Re : Macro MFC devient folle

Je ne sais pas trop ce que je dios faire pour m'en assurer... mais il n'y a que cette macro, je n'ai rien d'autre dans mon fichier... (a part des sommes, mais la macro ne s'applique pas aux cellules avec des formules)
 

wilfried_42

XLDnaute Barbatruc
Re : Macro MFC devient folle

re:

cette macro est lancée, sur une interruption, dans workbook je pense, mets y un point d'arret sur la premiere ligne apres les dim, en cliquant sur la marge, tu verra un point apparaitre et la ligne se mettre sur un fond carmin...

tu retourne sur ta feuille et tu fais la manip qui lance la macro, la macro s'arrettera à cet endroit

avec la touche F8, tu peux suivre la progression de la macro ligne par ligne

sinon, tu envoies ton fichier, en expliquant bien les manip qui provoque cette boucle
 

Absinth

XLDnaute Junior
Re : Macro MFC devient folle

Bon, j'ai fait un pas à pas détaillé, et j'ai trouvé la boucle...

En fait, le principe est que si j'écris un truc dans une case, et qu'il correspond a une MFC, la mise en forme change... Et la macro plante quand y'a rien d'écrit...

Voici la macro (j'ai pas recopié le code des fonctions):
Code:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim FCible As Range, RCible As Range, Cible As Range, Plage As Range, T As Range, _
    Tplage As Range, PlageFC As Range
Dim Adr As String
Dim N As Boolean, B As Boolean, P As Boolean, A As Boolean, VFC As Boolean
    On Error Resume Next
    Set PlageFC = Sh.Cells.SpecialCells(xlCellTypeAllFormatConditions)
    If PlageFC Is Nothing Then Exit Sub
    'Définition de la Plage cible
    Set Plage = Target
    Set Tplage = Plage.Dependents
    Set Plage = Application.Union(Plage, Tplage)
    On Error GoTo 0
    Set Plage = Application.Intersect(Plage, PlageFC)
    If Plage Is Nothing Then Exit Sub
    Application.ScreenUpdating = False
    Set Tplage = Nothing
    For Each T In Plage
        VFC = VerifFCond(T)
        If VFC Then
            If Tplage Is Nothing Then
                Set Tplage = T
            Else
                Set Tplage = Union(Tplage, T)
            End If
        End If
    Next T
    'Traitement de la plage Cible
    If Not Tplage Is Nothing Then
        With ActiveWorkbook.Styles("Normal")
            N = .IncludeNumber
            B = .IncludeBorder
            P = .IncludeProtection
            A = .IncludeAlignment
            .IncludeNumber = False
            .IncludeBorder = False
            .IncludeProtection = False
            .IncludeAlignment = False
        End With
        For Each Cible In Tplage
            Set FCible = FormatCible(Cible)
            Set RCible = Nothing
            On Error Resume Next
            With Cible
                Adr = Mid(.ID, 3)
                Select Case Adr
                Case "Cel"
                    Set RCible = Cible
                Case "Lig"
                    Set RCible = Application.Intersect(.EntireRow, ActiveSheet.UsedRange)
                Case Else
                    Adr = Replace(Adr, ";", ",")
                    If Val(Replace(Adr, "$", "")) > 0 Then
                        Set RCible = Application.Intersect(.EntireColumn, Range(Adr))
                    Else
                        Set RCible = Application.Intersect(.EntireRow, Range(Adr))
                    End If
                End Select
            End With
            On Error GoTo 0
            If Not RCible Is Nothing Then
                With RCible
                    If FCible.Row = 65536 Then
                        'Format standard
                        .Style = "Normal"
                    Else
                        'Format MFC
                        With .Font
                            .Bold = FCible.Font.Bold
                            .Color = FCible.Font.Color
                            .Italic = FCible.Font.Italic
                            .Name = FCible.Font.Name
                            .Size = FCible.Font.Size
                            .Strikethrough = FCible.Font.Strikethrough
                            .Subscript = FCible.Font.Subscript
                            .Superscript = FCible.Font.Superscript
                            .Underline = FCible.Font.Underline
                        End With
                        With .Interior
                            .Color = FCible.Interior.Color
                            .Pattern = FCible.Interior.Pattern
                            .PatternColor = FCible.Interior.PatternColor
                        End With
                    End If
                End With
            End If
        Next Cible
        With ActiveWorkbook.Styles("Normal")
            .IncludeNumber = N
            .IncludeBorder = B
            .IncludeProtection = P
            .IncludeAlignment = A
        End With
    End If
    Application.ScreenUpdating = True
End Sub

La boucle se fait entre les lignes 10 et 18, soit:

Code:
If PlageFC Is Nothing Then Exit Sub
    'Définition de la Plage cible
    Set Plage = Target
    Set Tplage = Plage.Dependents
    Set Plage = Application.Union(Plage, Tplage)
    On Error GoTo 0
    Set Plage = Application.Intersect(Plage, PlageFC)
    If Plage Is Nothing Then Exit Sub

Et ces 8 lignes tournent en boucle indéfiniment... Pourquoi?

(je n'ai pas modifié le code, et il marchait bien tout un temps, puis il s'est mis à foirer...) Si aucune de mes cellules n'est assignée à cette macro, elle fait quand meme cette boucle, alors qu'elle ne devrait pas s'exécuter...

:( comprends plus rien... snif...
 

Statistiques des forums

Discussions
312 527
Messages
2 089 346
Membres
104 130
dernier inscrit
badro26