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
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.
Quel message d'erreur ?
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
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