Mise en forme conditionelle

Bonsoir le forum

Est-il possible de traiter cette action avec une mise en forme conditionnelle

au départ : A1= "N" C1= vide

si C1= "O" alors A1 = "O"

Merci de vos sugestions

Bonsoir,

une MFC ne modifie pas la valeur d'une cellule en fonction d'une autre, désolé. Mais la fonction SI, oui !

En A : =SI(C1<>"O";"N";"O"), maintenant s'il vous faut une couleur, la MFC fera le test sur la valeur de A1 =ET(A1="O") mise en forme en vert.

@ bientôt

LouReeD

Bonsoir LouReeD

merci de ta réponse, c'est ce que je pensais.

si j'ai bien compris ton explication, je dois mettre donc la formule dans A1.

mais dans mon programme VBA au départ, je vais mette dans A1 "N" et C1 = Vide

Par la suite, je viens changer la valeur de C1 en mettent un "O" par saisie au clavier

ce qui doit avoir pour effet de changer la valeur de A1 en "O"

Peux-tu me donner une piste ou une direction si cela est possible stp

La seule idée que j'ai pour l'instant est du vba avec

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Merci

bonne soirée

Bonjour le Forum

Je résume ma demande

A partir de la 3éme Feuille:

- Chaque feuille est constituée d'un tableau structuré identique en Nom et Nombre de colonne, la différence est uniquement le nombre de ligne.

- En Colonne D et I sont appliquées des mise en formes conditionnelles.

Je cherche a modifier
Si "I "= "O" alors

D= "O" et efface G

J'ai travaillé sur le sujet, voici ce que j'ai écrit pour chaque feuille et qui fonctionne (J'aimerai avoir l'avis du forum sur ma façon de faire)

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Dim Y As Integer

derlig = Range("I" & Rows.Count).End(xlUp).Row

For Y = 3 To derlig

'Si la colonne a partir de la 3éme ligne est égale au texte "O"

If Range("I" & 3 + Y - 3) = "O" Then

'Alors remplacer la valeur de la cellule par "O"

 Range("D" & 3 + Y - 3) = "O"

 'Et effacer la valeur de cellule

 Range("G" & 3 + Y - 3).ClearContents

End If
Next

'Mise à jour des données

Call MJDATA

End Sub

Je suis bloqué sur 2 problèmes:

- J'aimerais pouvoir autoriser le changement en cellule I de la façon suivante

Si en D la cellule contient "N" alors je peux changer la valeur en cellule I

cela servira de blocage en cas d'erreur de saisie si la cellule G est différente de "N"

Le second,

Comment éviter de répéter le même code sur ces feuilles , je n'en ai mis que 3, mon fichier en comporte 25

Dans ThisWorkbook, il n'y a pas cet événement

Merci de votre aide

12ledzep-cde-v0.xlsm (68.47 Ko)

A bientôt sur le Forum

Bonsoir,

le code "généraliste" pour toutes les feuilles se trouve dans ThisWorkbook et s'appelle : SheetChange

En effet mieux vaut surveiller le Change que le SelectionChange.
Le code pour la première question :

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    ' on vérifie que la modification de la valeur est bien dans la huitième colonne du premier tableau structuré de la feuille Sh
    If Not Intersect(Target, Sh.ListObjects(1).DataBodyRange.Columns(8)) Is Nothing Then
        ' on arrête la surveillance événementielle change afin de faire les modifications sans la "relancer"
        Application.EnableEvents = False
            ' on modifie la valeur de la colonne 3 du tableau, c'est à dire la colonne D de la feuille idem pour G
            Sh.Cells(Target.Row, 4) = "O"
            Sh.Cells(Target.Row, 7) = ""
        ' on remet en marche la surveillance événementielle
        Application.EnableEvents = True
    End If
End Sub

@ bientôt

LouReeD

Bonjour le forum

Bonjour LouReed

Merci de ton aide, désolé je n’ai pu tester ton code sur mon fichier Par manque de temps

Demain j’espère le pouvoir

J’avais commencé à regarder listObjects sachant que vous insistez souvent pour que l’on travail en tableau structuré .

Plus de facilités pour le codage

Bonne fin de journée à tous

Bonsoir,

voir le fichier :

J'ai ajouté un test de position de la feuille modifiée afin de ne prendre en compte que les modifications sur les feuilles au-delà de l'index 2 du classeur. Pour rappel l'index d'une feuille correspond à sa position "physique" de cette dernière dans le classeur (ne correspond pas à l'ordre sous VBA qui lui est fonction de la création de la feuille). Ce fichier ne répond qu'à la première question :

Je cherche a modifier
Si "I "= "O" alors

D= "O" et efface G

@ bientôt

LouReeD

Bonjour le Forum

Bonjour LouReed

Merci cela est parfait.

Serait-il possible d'autoriser la modification de D ="O" de cette façon stp

Si D= "N" alors

autorisation de modifier

Si "I "= "O" alors

D= "O" et efface G

Je suppose qu'il faut travailler a partir de

If Not Intersect(Target, Sh.ListObjects(1).DataBodyRange.Columns(8)) Is Nothing And Sh.Index > 2 Then

pour rendre cela possible ?

Cela permettrait de verrouiller un erreur de saisie en "I" et qui de ce fait efface "PE"

Merci

Bonne journée à tous

Bonjour,

Précision sur :

Si D= "N" alors autorisation de modifier

Modifier quoi ? Si "D" autre chose que "N" alors interdire la modification de "D" ? Qu'en est t il si "D" = "O" ?
Merci par avance de vos éclaircissements !

@ Bientôt

LouReeD

Bonjour le forum

Bonjour LouReed

Précision sur ma demande:

Avec ton code j'ai bien ce que je voulais:

Si "I "= "O" alors

D= "O" et efface G

J'aimerai en plus un contrôle de la valeur de "D" avant d'autoriser le code que tu m'as fais.

C'est à dire que

Si "D" = "N" ( seulement si = "N" )

alors j'autorise le code suivant

Si "I" = "O"

D="O" et efface "G"

j'espère que cela est plus explicite pour vous

Merci

Bonne journée

Bonjour,

le code modifié afin qu'il ne s'exécute que si "D" même ligne est égale à N :

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    ' on vérifie que la modification de la valeur est bien dans la huitième colonne du premier tableau structuré de la feuille Sh
    If Not Intersect(Target, Sh.ListObjects(1).DataBodyRange.Columns(8)) Is Nothing And Sh.Index > 2 Then
        ' on vérifie que la colonne D de la ligne "Target" est bien égale à "D"
        If ActiveSheet.Cells(Target.Row, 4) = "N" Then
            ' on arrête la surveillance événementielle change afin de faire les modifications sans la "relancer"
            Application.EnableEvents = False
                ' on modifie la valeur de la colonne 3 du tableau, c'est à dire la colonne D de la feuille idem pour G
                Sh.Cells(Target.Row, 4) = "O"
                Sh.Cells(Target.Row, 7) = ""
            ' on remet en marche la surveillance événementielle
            Application.EnableEvents = True
        End If
    End If
End Sub

@ bientôt

LouReeD

Bonjour le forum

Bonjour LouReed

Code fonctionnelle sur le fichier de ce post

J'ai donc essayé sur mon fichier de travail .

Avec le code que tu m'as donné, Le fonctionnement est parfait.

Par contre, j'utilise un code qui me sert à initialiser mon dossier .

Ce code remet à jours les colonnes de "D" à "I"

Dans la colonne "D" efface et met "PE" et de"E" à "I" efface le contenu des cellules.

cela bloque ici

 If Not Intersect(Target, Sh.ListObjects(1).DataBodyRange.Columns(8)) Is Nothing And Sh.Index > 2 Then
image

Je continue l'analyse pour essayer de comprendre le pourquoi.

As tu une idée svp

Merci

Bonne fin de journée à tous

Bonsoir,

il y a conflit entre votre code "feuille à feuille" et "mon code" dans thisworkbook.

En effet, le mien détecte un changement de valeur dans certaine colonnes des feuilles allant de l'index 3 à la fin. Hors votre code engendre ce type de changement et peut-être même le fait il en globale, plusieurs cellules en même temps !

Sans avoir la complétude des codes, ce que vous pouvez faire c'est d'interrompre la surveillance événementielle des feuilles durant le déroulé de votre code, comme cela "le mien" ne démarrera pas ! Pour ce faire il suffit en début de code mettre : Application.EnableEvents = False et en fin de code : Application.EnableEvents = True.

Attention ! En cas de plantage, la feuille ne réagira plus ! C'est pourquoi je m'écris une petite routine "Oups" où je réactive la surveillance, comme cela le classeur retrouve son fonctionnement normal :

Sub Oups()
    Application.EnableEvents = True
End Sub

Si vous regardez mon code deux messages avant vous verrez ces instructions : comme j'utilise l'événementiel "Change" avant de changer la valeur des cellules je coupe cette surveillance sinon on entre en boucle infinie ! Mais il ne faut pas oublier de la remettre (à la différence de Application.ScreenUpDating qui se réinitialise à la fin de la SUB tout comme On Error Resume Next, mais ça c'est une autre histoire...)

@ bientôt

LouReeD

Bonjour LouReed , Le forum

J'ai suivi ton conseille et inséré :

Application.EnableEvents = False et en fin de code : Application.EnableEvents = True.

Dans mon code de "INIT"

Parfait à ce jour.

Merci de ton aide.

Je vais créer un nouveau Post pour:

je vais maintenant me diriger vers 2 autres étapes :

1- Dans une colonne dédiée, ouverture Userform avec soit une listBoxs ou combobox qui a pour but que si Sélection d'un item de la listRows -> cellule active

2- Idem que 1 dans une autre colonne , ouverture Userform mais avec 3 option bouton qui sélectionne une liste différente .

Peux tu me donner ton avis sur le choix de la ListBox ou ComboBox

Merci.

Je clôture ce post après ta réponse

Merci encore de ton aide sur ce sujet

Bonne soirée à tous

Bonsoir,

veuillez clôturer ce sujet car ma réponse est la suivante : ?
Je n'ai pas tout compris à la demande...

Le mieux, un fichier propre, une demande claire, voir un exemple en image si je puis dire pour montrer les colonnes, et les actions/réactions de l'application en fonction des choix.

@ bientôt

LouReeD

Rechercher des sujets similaires à "mise forme conditionelle"