Problème d'exécution macro suite à une modification

Bonjour,

Permettez moi de solliciter votre expertise en VBA,

Voila une application ( ci joint) qui fonctionne de la manière suivante: la valeur de colonne "numéro d'incrémentation" s'incrémente en fonction de : Anne & resultat test

La valeur s'incrémente dans la même année si la valeur "resultat test"=non

Pour Annee+1, l'incrémentation recommence dès le début, la valeur s'incrémente si le resultat test = non

Pour resultat test=oui, consigne cellule vide

Jusqu'au là l'application fonctionne correctement, le pb se pose au moment de modification de l'année. Prenons l'exemple suivant (fichier joint):

Ligne 20, la modification de l'année de 2018 en 2017, doit engendre une modification instantanée de valeur "numéro d'incrémentation", qui doit afficher la valeur 0004 au lieu de 0008, mais cela n'a pas changé. Pour y remédier, l'utilisateur doit, à chaque modification de l'année, modifier la valeur resultat test de cette manière :"non" puis "oui" puis "non".

Que faut il faire pour que le macro se re-exécute automatiquement lors de modification de l'année sans avoir besoin de modifier la valeur "resultat test"

Cordialement

23test-v3.xlsm (37.20 Ko)

Bonsoir,

l'utilisateur doit, à chaque modification de l'année, modifier la valeur resultat test de cette manière :"non" puis "oui" puis "non".

Normal puisque ton évènementielle est programmée pour n'intervenir que sur changement dans la colonne Test !

Mais j'aimerais savoir si il est normal qu'un numéro d'incrémentation supprimé soit repris. C'est peut-être voulu, mais dans la mesure où si tu mets "non" alors que la cellule en A est vide la procédure incrémente sur une année 0, ce qui ne m'a pas vraiment l'air d'être voulu, je pose la question.

Cordialement.

Re

Pour la recupération du numero d'incrementation supprimé c'est voulu mais merci de m'attirer mon attention sur le 2eme cas, c'est pas voulu l'incrémentation aura lieu en fonction de 2 variables l'annee et le resultat test, cela veut dire que si la cellule annee est vide et le resultat test est "non" il faut pas y avoir d'incrementation

Comment faire pour obliger l'utilisateur à saisir l'annee apres avoir choisir la valeur resultat test, de cette manière l'utilisateur doit, à chaque modification de valeur resultat test, saisir l'année correespondante

S'il existe une solution VBA sur le code lui même tout en gardant ma logique d’incrémentation , je serais reconnaissant

2eme chose, comment faire pour que le macro se re-exécute automatiquement lors de modification de l'année sans avoir besoin de modifier la valeur "resultat test".

cordialement

Re,

Comment faire pour obliger la saisie d'une année,

Si l'utilisateur modifie le resultat test sans saisir l’année, il faut programmer un message box par exemple pour lui demander de saisir l’année dans la colonne annee comme ça la valeur d’incrémentation va s'afficher en fonction de l’année et resulttat test

cordialement

Bonjour,

En marge, ta proc. BeforeDoubleClick doit être complétée pour éviter de déclencher l'évènement Change :

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    If Target.Column <> 2 Or Target.Row < 5 Then Exit Sub
    Application.EnableEvents = False
    With Target
        .ClearContents
        .Offset(0, 2).ClearContents
        .Offset(0, 5).ClearContents
    End With
    Application.EnableEvents = True
    Cancel = True
End Sub

Sur la base, on reprend les numéros d'incrémentation éventuellement supprimés, j'ai trouvé plus pratique une fonction renvoyant le numéro à utiliser...

Function Incrément(a As Integer, lna As Integer) As Integer
    Dim Num, n%, i%
    n = [Tableau1].Rows.Count + 4
    n = Me.Cells(n, 2).End(xlUp).Row
    For i = 5 To n
        If Me.Cells(i, 2) = a And Me.Cells(i, 4) = "non" And i <> lna Then Num = Num & ";" & Me.Cells(i, 7)
    Next i
    Num = Split(Num, ";")
    If UBound(Num) > 1 Then
        For n = 1 To UBound(Num) - 1
            For i = n + 1 To UBound(Num)
                If CInt(Num(i)) < CInt(Num(n)) Then
                    Num(0) = Num(i): Num(i) = Num(n): Num(n) = Num(0)
                End If
            Next i
        Next n
    End If
    For i = 1 To UBound(Num)
        If CInt(Num(i)) <> i Then Exit For
    Next i
    Incrément = i
End Function

On appelle la fonction en lui passant l'année, et elle renvoie le premier numéro d'incrémentation à utiliser. Le 2e argument est le numéro de la ligne active (dont les critères année et test sont valides mais dont le numéro d'incrémentation est justement celui cherché... cellule vide qui provoquerait de plus une erreur).

Ce qui simplifie assez fortement la proc. Change :

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim n%
    If Target.Row < 5 Or Target.Count > 1 Then Exit Sub
    If Target.Column = 2 Or Target.Column = 4 Then
        n = Target.Row
        If Me.Cells(n, 2) <> "" And Me.Cells(n, 4) = "non" Then
            Me.Cells(n, 7) = Incrément(Me.Cells(n, 2), n)
        Else
            Me.Cells(n, 7).ClearContents
        End If
    End If
End Sub

Vois si cela correspond bien à tes critères.

Cordialement.

RE

Merci infiniment MFerrand

j'ai pris le temps pour tester soigneusement et ne pas faire la même bêtise qu'auparavant,

le résultat trouvé est génial

Cependant, permettez moi d'être un peu cupide à fin de perfectionner encore un peu plus cette application:

Ma question est la suivante: Comment faire pour que si l'utilisateur saisie l'année, un message box apparaîtra pour demander de sélectionner la valeur resultat test. De même, si l'utilisateur sélectionne la valeur resultat test en premier lieu alors que l'année est vide, un message box apparaîtra pour demander d'ajouter une année.

De plus, j'ai remarqué que l'utilisateur peut saisir directement un numéro d'incrémentation sans passer par la sélection de valeur resultat test. Comment faire pour que la colonne G s'incrémente seulement en fonction de resultat test et annee ( ç'est à dire comment verrouiller la saisie manuelle au niveau de colonne G).

Dernière chose, qu'elles sont mes modifications à introduire dans le code VBA pour que le double clic fonctionne également pour la colonne D et G ? De cette manière, le double clic sur annee ou resultat test ou aussi numéro d'incrémentation entraînera aussi la suppression des 2 autres valeurs dans la même ligne

cordialement

Bonjour,

En l'état, le code n'intervient pour incrémenter que si l'année est servie et le test est "non" : si ce n'est pas le cas, il efface l'incrémentation éventuellement existante.

Cela peut évidemment être doublé par un MsgBox, cependant comme deux cellules sont à remplir (ce que l'utilisateur n'ignore point), le message interviendra à chaque ligne, chaque fois qu'une seule cellule sur deux est remplie, ce qui arrive toujours car pour en remplir deux, il faut commencer par une ! Cela risque d'être lassant pour l'utilisateur...

Par contre, il est certainement gênant que l'utilisateur puisse saisir un numéro d'incrémentation que l'on souhaite automatique, exclusivement.

Il convient alors de surveiller ce cas pour l'annuler :

...
    ElseIf Target.Column = 7 Then
        With Application
            .EnableEvents = False
            .Undo
            .EnableEvents = True
        End With
...

Cordialement.

Bonsoir,

Merci MFerrand pour tous ces détails, grâce à vous l'application devient de plus en plus utile pour moi,

Revenant sur le dernier code proposé comme solution pour verrouiller la saisie manuelle d'un num d'incrémentation, je vous prie de bien vouloir m'indiquer où faut il ajouter ce dernier code exactement parce que sincèrement je suis bête en VBA,

De plus j'ai voulu changer le double clic de suppression dans le code VBA par une autre solution proposée par un des camarades dans ce forum, mais j'ai trouvé du mal à placer le code, pouvez vous m'aider dans ce cas???

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count = 1 And Target.Row > 4 Then
        If Target = "" And Not Intersect(Target, Union([B:B], [D:D], [G:G])) Is Nothing Then
            Intersect(Target.EntireRow, Union([B:B], [D:D], [G:G])).ClearContents
        End If
    End If
End Sub

cdlt

Je pensais que le ElseIf te suffirait pour le positionner....

Le voici intégré dans la procédure complète :

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim n%
    If Target.Row < 5 Or Target.Count > 1 Then Exit Sub
    If Target.Column = 2 Or Target.Column = 4 Then
        n = Target.Row
        If Me.Cells(n, 2) <> "" And Me.Cells(n, 4) = "non" Then
            Me.Cells(n, 7) = Incrément(Me.Cells(n, 2), n)
        Else
            Me.Cells(n, 7).ClearContents
        End If
    ElseIf Target.Column = 7 Then
        With Application
            .EnableEvents = False
            .Undo
            .EnableEvents = True
        End With
    End If
End Sub

Pour ton autre question, je pense que tu as plutôt intérêt à conserver ta procédure de suppression sur DoubleClick, elle fonctionne fort bien et te permet de supprimer une ligne sans perturber le processus d'inscription avec incrémentation. La procédure Change actuelle réagit déjà aux interventions en col. B, D et G, et pas pour supprimer la ligne mais pour ajuster selon tes modifications. Elle effacera l'incrémentation si celle-ci n'est plus conforme, en te laissant latitude de poursuivre en complétant une cellule que tu aurais effacée avant de retaper, sans t'effacer tout...

Ta procédure DoubleClick efface actuellement seulement les cellules en B, D et G. Tu peux lui faire effacer la ligne complète de ton tableau si tu le souhaites (on ne s'y est pas trop intéressé puisque les autres colonnes sont vides...). La dissociation des deux actions : suppression et incrémentation, t'assurera une meilleure sécurité.

Cordialement.

Re

Merci encore une fois pour l'interaction,

Dommage, j'ai testé l'application après avoir modifié le code VBA suite à votre solution proposée mais ça fonctionne pas parce que un message d'erreur s'affiche "débogage" (ci joint le résultat)

Prière de vérifier SVP

cdlt

test resultat

Quel message d'erreur ?

Re Mferrand,

En faite, le message d'erreur s'affiche juste après avoir saisir l'année, le voici (ci joint)

cdlt

erreur d execution erreur d execution2

Au temps pour moi !

...
        Application.EnableEvents = False
        If Me.Cells(n, 2) <> "" And Me.Cells(n, 4) = "non" Then
            Me.Cells(n, 7) = Incrément(Me.Cells(n, 2), n)
        Else
            Me.Cells(n, 7).ClearContents
        End If
        Application.EnableEvents = True
...

Cordialement.

RE,

Excusez moi mais je me trouve dans l'obligation de re-partager le résultat suite à votre dernier message, le message d'erreur a disparu mais le verrouillage dans la colonne G ne fonctionne pas encore,

Ci joint le fichier, merci de revoir le code VBA pour vérifier s'il existe une faute quelconque,

Sinon de voir s'il existe un pb technique sur mon ordinateur qui empêche cette action de verrouillage

cordialement

15test-v4.xlsm (38.06 Ko)

Est-ce que tu as rétabli les évènements après erreur ? Celle-ci intervenant après passage à False, le rétablissement à True ne se fait pas. Il faut donc rétablir en utilisant la petite procédure reactiver_evenement (que quelqu'un avant moi t'a placé là à cette fin !)

Tu te places dessus et tu cliques sur l'icône portant une flèche triangulaire pour l'exécuter...

Cordialement.

J'ai écris avant de regarder ton fichier ! Tu as supprimé l'action du code ! elle ne peut plus s'exécuter donc. Et tu as doublé l'action précédente au lieu de rectifier en ajoutant les lignes que j'avais surligné !

Je remets la procédure intégrale (mais faudrait apprendre à lire le code pour pouvoir ne faire que les rectifications à partir des indications fournies...)

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim n%
    If Target.Row < 5 Or Target.Count > 1 Then Exit Sub
    If Target.Column = 2 Or Target.Column = 4 Then
        n = Target.Row
        Application.EnableEvents = False
        If Me.Cells(n, 2) <> "" And Me.Cells(n, 4) = "non" Then
            Me.Cells(n, 7) = Incrément(Me.Cells(n, 2), n)
        Else
            Me.Cells(n, 7).ClearContents
        End If
        Application.EnableEvents = True
    ElseIf Target.Column = 7 Then
        With Application
            .EnableEvents = False
            .Undo
            .EnableEvents = True
        End With
    End If
End Sub

RE,

Si j'ai bien compris, j'ai placé le curseur sur la procédure reactiver_evenement

Sub reactiver_evenement()
Application.EnableEvents = True
End Sub

Puis j'ai cliqué sur le triangle en vert juste en haut "Exécuter sub/userform (F5)

Enfin j'ai saisi un num d'incrémentation, mais ça fonctionne pas encore

cdlt

Ça c'est pour réactiver les évènements encas de besoin. Mais as-tu rétabli la procédure ?

Re,

D'abord Je m'excuse parce que j'ai pris beaucoup du temps pour répondre,

Merci bcp MFerrand pour ce coup de pouce, ça fonctionne chez moi parfaitement. Je dois surement apprendre le langage VBA, actuellement je dois finaliser cette application et par la suite je dois allouer suffisamment du temps pour apprendre l'excel avancé.

Enfin, une dernière question (je profite de votre expertise ):

J'aimerai pouvoir désactiver l'apparition de la fenêtre "voulez vous enregistrer les modifications .... " avant de fermer le fichier. Je veux à chaque fois forcer l'enregistrement avant de quitter.

J'ai essayé ce code mais le message s'affiche encore:

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.ThisWorkbook.Saved = True
End Sub

cdlt

Bonjour,

Cette commande te permet de fermer le fichier sans enregistrer (et sans message t'invitant à l'enregistrer si tu le souhaites)...

Cordialement.

Re,

Je viens de trouver une autre solution mais je sais pas si ça fonctionne ou non parce que tout simplement je sais pas où faut il integrer ces 3 lignes:

DisplayAlerts = False
ActiveWorkbook.Save
ActiveWorkbook.Close

Merci de me guider

Cdlt

Rechercher des sujets similaires à "probleme execution macro suite modification"