Problème avec tout petit code

Bonjour le forum,

J'ai créer ce bout de code qui fonctionne à merveille sur mon MAC mais quand je l'utilise sur Windows avec Excel 2016, il ne marche pas...

Voilà la bête:

Private Sub Worksheet_Calculate()

Dim c As Variant

With Sheets("Feuil1")
    .Unprotect "123"

        For Each c In .Range("H6:H9")
            If c.Value = "" Or c.Value = "Remplir içi" Then
                c.Font.ColorIndex = 3
                c.Value = "Remplir içi"
            Else
                c.Font.ColorIndex = 1
            End If
        Next c

    .Protect "123"
End With

End Sub

si quelqu'un voit un truc qui cloche...

Ou bien un paramètre dans Excel 2016 a activer ou désactiver peut-être ???

Bonjour,

il ne marche pas...

ne veut rien dire...

Au passage type correctement tes variables. As Variant ne sert à rien puisqu'en fait c'est le type par défaut qui correspond à ... aucun type précis.

Donc c As Range

eric

Bonjour iDev4s, bonjour eriiic, bonjour le forum,

Le bout de code fonctionne sur Excel 2016.

Peut être le calcul automatique est désactivé : Options, Formules, section Mode de calcul.

Joseph

Bonjour ériiic,

Le problème:

En fait, si on rentre une valeur dans les cellules H6, H7, H8 ou H9, je voudrais que la couleur de la police passe en noir.

par contre, si c'est mêmes cellules sont vides, alors la macro incère le texte "Remplir içi" en rouge.

La même macro fonctionne très bien sur Mac (Excel 2011) mais pas sur Windows (Excel 2016)...

Je viens d'essayer avec As Range, mais ne fonctionne pas non plus...

Private Sub Worksheet_Calculate()

Dim c As Range

With Sheets("Feuil1")
    .Unprotect "123"

        For Each c In .Range("H6:H9")
            If c.Value = "" Or c.Value = "Remplir içi" Then
                c.Font.ColorIndex = 3
                c.Value = "Remplir içi"
            Else
                c.Font.ColorIndex = 1
            End If
        Next c

    .Protect "123"
End With

End Sub

Bonjour retraite8,

L'option est bien activée !

Je joint le fichier pour que ce soit plus clair...

comme dit retraite8 pas de raison qui saute aux yeux pour que ça ne fonctionne pas.

Personnellement j'aurais fait comme ça :

Private Sub Worksheet_Change(ByVal Target As Range)
    Static noEvents As Boolean
    If noEvents Then Exit Sub
    If Intersect(Target, [H6:H9]) Is Nothing Then Exit Sub
    If Target = "" Then
        noEvents = True
        Target = "Remplir ici"
        noEvents = False
        Target.Font.ColorIndex = 3
    Else
        Target.Font.ColorIndex = 1
    End If
End Sub

Autant ne traiter que la cellule modifiée que toutes les faire à chaque saisie.

Je n'ai pas remis le .Unprotect, je me demande s'il est indispensable. Si H7:H10 sont destinées à la saisies, ces cellules ne doivent pas être verrouillées.

eric

bonjour

tu peux aussi obtenir un résultat similaire sans VBA, avec une MFC et une fonction SI

ce sera plus stable lors du changement PC/Mac, et sous OOO ou tablette et smartphone.

note que Microsoft ne fournit qu'un VBA très B pour iOS.

B comme dans Visual Basic for Applications

Merci pour l'infos JMD, mais je ne connais pas MFC et me cantonne à VBA (Je suis débutant...)


Merci ériiic !

J'ai un peu bidouiller ton code pour qu'il colle exactement à ce que je voulais !!!

Bon c'est pas très propre... mais sa marche !

Pourrais-tu, sltp, m'expliquer ton code, en le commentant, pour que je le comprenne en détail plutôt que de l'exécuter bêtement !

Je joint le fichier terminé est passe en résolu...

Private Sub Worksheet_Change(ByVal Target As Range)
    Static noEvents As Boolean ' variable qui permet de strapper le traitement sur demande
    If noEvents Then Exit Sub ' sortie sur demande
    If Intersect(Target, [H6:H9]) Is Nothing Then Exit Sub ' sortie si cellule modifiée n'appartient pas à la plage
    If Target = "" Then ' si vide
        noEvents = True ' l'criture va rappeler Worksheet_Change on sait ce qu'on va écrire, pas la peine de traiter
        Target = "Remplir ici"
        noEvents = False ' écritures terminées, on rétablit la supervision
        Target.Font.ColorIndex = 3
    Else
        Target.Font.ColorIndex = 1
    End If
End Sub

Ceci dit j'ai vu que tu écrivais dans la plage depuis un module standard.

Si tu estimais inutile de traiter puisque tu sais ce que tu fais, il faudrait pouvoir modifier noEvents depuis ce module,

Dans ce cas il faut supprimer sa déclaration de la proc et la déclarer publique dans un module standard, en tête, en dehors de toute procédure qu'elle soit visible de partout :

Public noEvents as boolean

(comme pour varToutEffacer)

Mais là j'ai l'impression que ça t'arrange bien de la laisser tourner puisque qu'elle te met les cellules dans l'état voulu, autant en profiter. Ce n'est donc pas impératif de modifier ça actuellement.

noEvents est crée pour éviter l'utilisation de Application.EnableEvents = False qui suspend la supervision des événements (à rétablir après avec =True), sans entrer dans une boucle sans fin non plus.

Ca devrait t'éclairer sur le fonctionnement

eric

Merci pour l'explication !

Autre détail, quand je rentre les valeurs dans les cellules, la touche shift est active et donc, pour les valeurs avec décimales, je voudrai remplacer "?" par ","…

J'ai essayé en fin de procédure : Target = Replace(Target, "?", ",")

Mais sa ne marche pas… comment dois-je procéder sltp ?

J'ai trouvé tout seul !

La réponse si sa peut aider quelqu'un d'autre:

Private Sub Worksheet_Change(ByVal Target As Range)

Static noEvents As Boolean

Sheets("Feuil1").Unprotect "123"

    If noEvents Then Exit Sub
    If IsEmpty(Target) Or varToutEffacer = True Then
        noEvents = True
        Target = "Remplir ici"
        noEvents = False
        Target.Font.ColorIndex = 3
    Else
        noEvents = True
        Target = Replace(Target.Value, "?", ",")
        noEvents = False
        Target.Font.ColorIndex = 1
    End If

Sheets("Feuil1").Protect "123"

varToutEffacer = False

End Sub

Merci pour tout ériiic...

Bonjour,

là tu vas entrer dans une boucle infinie.

Il faut mettre noEvents = True devant et = False derrière.

Tu as vraiment lu les explications ?

eric

Autant pour moi…

C'est corrigé !

Merci

Rechercher des sujets similaires à "probleme tout petit code"