Macro MFC plante en fichier partagé

Bonjour,

J'ai cette macro dans un module qui me permet d'appliquer par VBA des MFC sur mon fichier partagé.

Je suis passé par VBA car la méthode classique ne me permettait pas d'avoir un résultat satisfaisant (certaines MFC disparaissaient du fichier).

Toutefois, lorsque de l'exécution de la macro j'ai une erreur d’exécution 1004 qui apparaît (Erreur définie par l'application ou par l'objet). Impossible de savoir où cela plante car l'édition des macros ne sont pas disponibles en mode partagé... (or mode partagé RAS).

Sub testMFC()
        With Range("M5:M200")
        'Supprime les MFC existantes
         .FormatConditions.Delete

        'MFC si cellule = -1 (rouge)
        .FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, Formula1:="=-1"
            With .FormatConditions(1)  ' première condition
            'Définit la couleur de fond de la cellule lorsque la condition sera vraie.
            .Interior.Color = RGB(255, 229, 255)
            End With

        'MFC si cellule = 2 (vert)
        .FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, Formula1:="=2"
            With .FormatConditions(2)  ' deuxième condition
            'Définit la couleur de fond de la cellule lorsque la condition sera vraie.
            .Interior.Color = RGB(225, 255, 225)
            End With
        End With
End Sub

Merci d'avance pour votre aide !

Bapt"

Bonjour Horusbk,

Juste avant with Range("M5:M200") insert cette ligne de code.

If Intersect(Target, Range("M5:M200")) Is Nothing Then Exit Sub

La macro ne sera active que dans la zone M5:M200. Soit la zone ou s'applique la MFC.

Donc si tu écrit des données en dehors de cette zone il n'y a pas lieu d'appliquer cette macro.

Juste avant with Range("M5:M200") insert cette ligne de code.

If Intersect(Target, Range("M5:M200")) Is Nothing Then Exit Sub

La macro ne sera active que dans la zone M5:M200. Soit la zone ou s'applique la MFC.

Donc si tu écrit des données en dehors de cette zone il n'y a pas lieu d'appliquer cette macro.

C'est totalement inutile, le With est déjà là pour ça !!!

(et on n'est pas dans une macro événementielle)

Bonjour Patrice33740,

Je comprends mieux l'erreur d'exécution maintenant...

Le problème de disparition des MFC survient lorsque j'ajoute des lignes à mon fichier (une nouvelle ligne = une nouvelle commande) où sont ajoutés des informations par le biais d'un userform.

Est-ce que cela est quand même possible de faire un code qui modifie la couleur de fond de la cellule en fonction de la valeur de cette dernière mais sans utiliser des MFC qui sont incompatibles avec le classeur partagé ?

Bapt"

Re,

Tu peux utiliser ce code :

Sub PseudoMFC()
Dim r As Range
Dim c As Range
    Set r = Worksheets("Feuil1").Range("M5:M200")
    For Each c In r.Cells
      If c.Value = -1 Then
        c.Interior.Color = RGB(255, 229, 255)
      ElseIf c.Value = 2 Then
        c.Interior.Color = RGB(225, 255, 225)
      Else
        c.Interior.Color = RGB(255, 255, 255)
      End If
    Next c
End Sub
Sub RazMFC()
Dim r As Range
    Set r = Worksheets("Feuil1").Range("M5:M200")
    r.Interior.Color = RGB(255, 255, 255)
End Sub

Mais ce ne sera pas dynamique comme une MFC

Re-bonjour,

Merci Patrice

Je mets ce code dans un module je suppose ?

De plus, si je la mets dans l'événement "worksheet_change" ça pourrait s'actualiser comme une MFC ou c'est aussi incompatible avec un fichier partagé ?

Re,

Si la plage ne contient pas de formule, tu peux mettre dans le module de feuille :

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Me.Range("M5:M200")) Is Nothing Then Call PseudoMFC
End Sub
Private Sub PseudoMFC()
Dim r As Range
Dim c As Range
    Set r = Me.Range("M5:M200")
    For Each c In r.Cells
      If c.Value = -1 Then
        c.Interior.Color = RGB(255, 229, 255)
      ElseIf c.Value = 2 Then
        c.Interior.Color = RGB(225, 255, 225)
      Else
        c.Interior.Color = RGB(255, 255, 255)
      End If
    Next c
End Sub

S'il y a des formules, il faut surveiller les cellules contenant les constantes antécédentes (ou antécédentes des antécédents, ... ) de ces formules

EDIT L'utilisation de classeur partagé est très souvent la cause de problèmes parfois graves (perte totale du classeur).

C'est souvent du à une mauvaise gestion des modifications de la part de l'administrateur du classeur (accumulation des modifications suivies). Je ne les utilise plus jamais.

Re Patrice,

Effectivement ces cellules contiennent une formule, à savoir, celle-ci :

=SI(ESTVIDE(P5);"";SI(P5="IV";-1;SI(P5="Bouclé";2;"")))

Qui est-elle même alimentée par cette formule :

=SI(ET(ESTVIDE(E5);ESTVIDE(L5));"";SI(ET(E5<>0;ESTVIDE(L5));"IV";SI(ESTVIDE(E5);"IV";"Bouclé")))

Du coup je suppose qu'il faut surveiller les modifications effectuées dans les colonnes E et L ?

Je te joins un fichier test car je pense que ça devient un peu complexe

Baptiste.

C'était presque ça, il faut aussi surveiller la colonne E :

If Not Intersect(Target, Union(Me.Range("L5:L200"), Me.Range("E5:E200"))) Is Nothing Then Call PseudoMFC

Génial ça fonctionne super bien !

En plus je pense que c'est moins lourd que des MFC traditionnelles pour le fonctionnement de Excel ^^

Merci de ton aide Patrice, c'est résolu

Rechercher des sujets similaires à "macro mfc plante fichier partage"