Bloquer une cellule après avoir rempli une autre sur un tableau de données

Bonjour à tous,

Je suis obligé de venir vers vous car sa va maintenant faire 2 mois que je cherche sans succès a ma question. J'ai réalisé un tableau de données avec des liste déroulantes, des fonctions et même une code VBA pour afficher la date et tous fonctionne parfaitement. En revanche, je ne trouve pas comment je pourrai faire pour bloquer une cellule si je commence a en remplir une autre et surtout que sa ne change pas mes ancienne données si je le change dans mon tableau de donnée.

Pffff même moi je me perd dans mes explications… Je vous joint un fichier Excel afin que vous puissiez mieux comprendre...Je vous laisse l'ouvrir…

Donc une fois ouvert si vous cliquez pour mettre une heure une liste déroulante vous permet de mettre matin, midi ou soir. Lorsque c'est fait la date ce met automatiquement. Ensuite on peu mettre les initiales avec une liste déroulante. Puis on peu choisir un produit avec une liste déroulante, et une fois le produit choisi tous ce rempli automatiquement comme je le souhaite. Par contre il y a une données (Biais TAV) qui s'affiche automatiquement et qui peu être amené a être modifié d'un jour a l'autre. Donc pour cela on le change dans mon onglet donnée mais j'aimerai que lorsque l'on change cette cellule alors sa ne change pas les autres résultats précédents. Par exemple si on fait deux ligne "Pastis" et que sur la première ligne le "Biais TAV" est à -8.30 mais que le second doit être modifié à -8.10 alors celui de la première ligne reste à -8.30 et les autres seront automatiquement à -8.10.

J'espère que vous avez tous compris…

30test-excel.xlsm (276.61 Ko)

Je reste à votre disposition si vous avez pas tous compris ^^

Bonjour,

une proposition :

Vous supprimez la formule dans la cellule de la colonne Biais TAV de l'onglet "Résultats Journaliers.

Dans la macro Worksheet_change, vous testez

if Range.column = 4 then "MacroTVA"

Dans la macro, vous implémentez l'équivalent VBA (WorksheetFunction.VLookup) de la formule =SIERREUR(RECHERCHEV([@Produit];Tableau2;5;FAUX);"") en VBA.

N'oubliez pas de neutraliser la détection des événements en début de macro

Application.EnableEvents = False

et de le repositionner à TRue en fin de macro

Merci pour votre réponse mais je ne suis pas vraiment très fort en Excel et donc j'ai pas tous compris ^^

J'ai déjà cet macro qui est integrer donc mon classeur:

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
'Updated by Extendoffice 2017/10/12
Dim xRg As Range, xCell As Range
On Error Resume Next
If (Target.Count = 1) Then
If (Not Application.Intersect(Target, Me.Range("B:B")) Is Nothing) Then _
Target.Offset(0, -1) = Date
Application.EnableEvents = False
Set xRg = Application.Intersect(Target.Dependents, Me.Range("B:B"))
If (Not xRg Is Nothing) Then
For Each xCell In xRg
xCell.Offset(0, -1) = Date
Next
End If
Application.EnableEvents = True
End If
End Sub

Et donc enlever ma formule de la colonne sa je devrais y arrivé sans problème :) par contre pour le reste la il va falloir m'éclairer car je ne vois pas ou vous m'indiquer de mettre dans la macro Worksheet_change et surtout ensuite l'équivalent macro je le connais pas ^^

En tous les cas merci de me répondre si vite ^^

voici le nouveau code pour Worksheet_Change

j'ai laissé en commentaire la formule des cellules de la colonne H (= SIEERREUR ....) pour que vous voyiez l'équivalence.

Attention : quelques contraintes pour l'onglet "Résultats Journaliers" :

colonne produit = 4, colonne TVA = 8,ligne entête = 8

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
'Updated by Extendoffice 2017/10/12
    Dim xRg As Range, xCell As Range
    On Error Resume Next
    If (Target.Count = 1) Then
        If (Not Application.Intersect(Target, Me.Range("B:B")) Is Nothing) Then _
            Target.Offset(0, -1) = Date
        Application.EnableEvents = False
        Set xRg = Application.Intersect(Target.Dependents, Me.Range("B:B"))
        If (Not xRg Is Nothing) Then
            For Each xCell In xRg
                xCell.Offset(0, -1) = Date
            Next
        End If
        ' le code pour la TVA
        If Target.Column = 4 And Target.Row > 8 Then
            '=SIERREUR(RECHERCHEV([@Produit];Tableau2;5;FAUX);"")
            Target.Offset(0, 4) = Application.VLookup(Target.Value, [Tableau2], 5, False)
        End If
        Application.EnableEvents = True
    End If
End Sub

Merci énormément sa fonctionne parfaitement comme je le souhaitais :)

Par contre ce n'est pas fini lol ^^ parce que la j'avais demandé que pour une colonne mais il y a aussi deux autre colonne que je voudrait de la même manière. Donc dans le code VBA que tu m'a indiqué si je rajoute :

       ' le code pour la MV
        If Target.Column = 4 And Target.Row > 13 Then
            '=SIERREUR(RECHERCHEV([@Produit];Tableau2;6;FAUX);"")
            Target.Offset(0, 4) = Application.VLookup(Target.Value, [Tableau2], 6, False)
            Next
        End If
       ' le code pour la Sucre
        If Target.Column = 4 And Target.Row > 18 Then
            '=SIERREUR(RECHERCHEV([@Produit];Tableau2;7;FAUX);"")
            Target.Offset(0, 4) = Application.VLookup(Target.Value, [Tableau2], 7, False)
            Next
        End If

Sa ne fonctionne pas avec ces cellules... sa ce change alors que pour le Biais TAV sa fonctionne donc je n'ai pas du piger le code vraiment...

On va la jouer exercice de révision.

Voici le code qu'on a ajouté pour la TVA

        ' le code pour la TVA
        If Target.Column = 4 And Target.Row > 8 Then
            '=SIERREUR(RECHERCHEV([@Produit];Tableau2;5;FAUX);"")
            Target.Offset(0, 4) = Application.VLookup(Target.Value, [Tableau2], 5, False)
        End If

les contraintes que j'ai signalées précédemment :

colonne produit = 4, colonne TVA = 8,ligne entête = 8

La 1ère ligne "If Target .Column ..." permettent de ne traiter que les mises à jour correspondant à un Produit (column 4 correspond à colonne D Row 8 à la liogne en-tête).

La ligne en commentaires '=SIERREUR ... correspond au code qu'il y avait dans les cellules TVA au regard du produit sélectionné

La ligne Target.Offset ... correspond au codage en VBA du RECHERCHEV avec

.Offset(0, 4).. le 4 correspond à la 4ème colonne après la colonne produit (la colonne Biais TAV)

[Tableau2], 5.. le 5 correspond dans l'onglet Données à la 5ème colonne du Tableau 2 (la colonne Biais TAV)

Voilà, vous avez toutes les informations nécessaires pour traiter les autres colonnes

N'oubliez pas de valider la solution avec la coche V en haut à droite de la réponse qui a apporté la solution.

Bon du coup pas de petit V pour validé la solution parce que je n'arrive pas à le faire fonctionner lol ^^ Par contre j'ai adoré le fait de ne pas tous me faire comme solution et de le tenter par moi même mais bon je ne doit pas être très doué je pense ^^ voici ce que j'ai rentré et qui me semblais logique au vue de ce que tu ma donnée comme info...

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
'Updated by Extendoffice 2017/10/12
    Dim xRg As Range, xCell As Range
    On Error Resume Next
    If (Target.Count = 1) Then
        If (Not Application.Intersect(Target, Me.Range("B:B")) Is Nothing) Then _
            Target.Offset(0, -1) = Date
        Application.EnableEvents = False
        Set xRg = Application.Intersect(Target.Dependents, Me.Range("B:B"))
        If (Not xRg Is Nothing) Then
            For Each xCell In xRg
                xCell.Offset(0, -1) = Date
            Next
        End If
        ' le code pour la TVA
        If Target.Column = 4 And Target.Row > 8 Then
            '=SIERREUR(RECHERCHEV([@Produit];Tableau2;5;FAUX);"")
            Target.Offset(0, 4) = Application.VLookup(Target.Value, [Tableau2], 5, False)
        End If
        ' le code pour la MV
        If Target.Column = 4 And Target.Row > 8 Then
            '=SIERREUR(RECHERCHEV([@Produit];Tableau2;6;FAUX);"")
            Target.Offset(0, 9) = Application.VLookup(Target.Value, [Tableau2], 6, False)
        End If
        ' le code pour la Sucre
        If Target.Column = 4 And Target.Row > 8 Then
            '=SIERREUR(RECHERCHEV([@Produit];Tableau2;7;FAUX);"")
            Target.Offset(0, 14) = Application.VLookup(Target.Value, [Tableau2], 7, False)
        End If
        Application.EnableEvents = True
    End If
End Sub

Et quand je change pour le MV et le sucre alors sa ne fonctionne pas donc je te laise me dire ou je me suis trompé lol ^^

En tous les cas Merci d'avance et encore Merci pour ces réponses.

Bonjour Maxime,

bien content que le mode exercice vous ait plu, c'est tout de même plus satisfaisant de bien comprendre ce que l'on fait.

Le code me parait bon, j'ai testé avec le code ci-dessous et çà marche

        ' le code pour la TVA
        If Target.Column = 4 And Target.Row > 8 Then
            '=SIERREUR(RECHERCHEV([@Produit];Tableau2;5;FAUX);"")
            Target.Offset(0, 4) = Application.VLookup(Target.Value, [Tableau2], 5, False)
        End If
        ' le code pour Biais MV (colonne M)
        If Target.Column = 4 And Target.Row > 8 Then
            '=SIERREUR(RECHERCHEV([@Produit];Tableau2;6;FAUX);"")
            Target.Offset(0, 9) = Application.VLookup(Target.Value, [Tableau2], 6, False)
        End If
        ' le code pour Biais Sucre (colonne R)
        If Target.Column = 4 And Target.Row > 8 Then
            '=SIERREUR(RECHERCHEV([@Produit];Tableau2;7;FAUX);"")
            Target.Offset(0, 14) = Application.VLookup(Target.Value, [Tableau2], 7, False)
        End If

Ne pas oublier de supprimer la formule dans la colonne concernée

Il y a d'autres colonnes avec RECHERCHERV (Résultats MV étalon, Résultats Sucre étalon)à

Bon la tu va surement rire et te moquer de moi car moi c'est ce que j'ai fait ^^ J'avais pas enlever la formule dans la colonne ^^ parce que sinon j'aurai réussi tous seul mdr ^^ Merci beaucoup pour ton aide

Rechercher des sujets similaires à "bloquer rempli tableau donnees"