Macro Excel cellules à remplir pour passer à l'étape suivant
Bonjour le forum,
J'ai une macro qui copie les résultats de calcul
En détail, voilà ce que ça donne :
1°) l'utilisateur saisit des codes absences dans les cellules B29:B31 ;
2°) voir ci-dessous ;
3°) la macro recopie les données, d'abord, dans les cellules N29:N31, puis dans les cellules O29:O31, puis P29:P31 ...
Mais, comme les codes absences sont fonction de la durée de l'absence dans le mois, je veux que l'utilisateur soit obligé de se rendre dans la cellule B48 (ça c'est facile !) et de remplir les cellules C48:C51 (2°) ci-dessus). J'ai donc rédigé le code pour que la macro se rende en B48. Mais, je ne sais pas comment dire qu'elle ne doit pas continuer si les cellules C48:C51 ne sont pas remplies.
J'ai essayé avec le code suivant :
If Range("C48:C51") <> "" Thencontinuer la macro.
Mais, ça ne fonctionne pas. Je voudrais donc savoir comment dire que, pour passer au 3°) ci-dessus, els cellules C48:C51 doivent obligatoirement être remplies.
Je joins le code et un fichier test.
Merci d'avance pour votre aide.
Cordialement.
Rebonjour,
En cherchant à droite et à gauche, j'ai trouvé cette solution-là :
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Pl, Pl2 As Range 'déclare la variable Pl (Plage)
Dim i, Col As Long
If Target.Count > 1 Then Exit Sub
Set Pl = Range("B29:B31") 'définit la plage Pl
If Not Application.Intersect(Target, Pl) Is Nothing And Target.Value <> "" Then 'si le changement a lieu ailleurs que dans la plage Pl, la macro sort de la procédure
MsgBox "Veuillez remplir les cellules C48 à C51 pour générer le calcul.", vbOKOnly + vbInformation, _
"VELP - V2.0"
Range("B48").Select
If Range("C48").Value = "" And Range("C49").Value = "" And Range("C50").Value = "" And Range("C51").Value = "" Then
'Else
'Copie de la cellule de la plage dans la première colonne vide de la même ligne après la colonne L
MsgBox "Vos données vont être sauvegardées et vous allez pouvoir en renseigner d'autres du même type." & vbLf & vbLf & "Si vous n'avez pas d'autres informations de ce type à insérer, vous pouvez passer à la ligne suivante.", vbOKOnly + vbInformation, _
"VELP - V2.0"
End If
Col = Cells(Target.Row, Columns.Count).End(xlToLeft).Column + 1
Target.Offset(0, 1).Copy
Cells(Target.Row, Col).PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
Set Pl2 = Application.Union(Range("C37:C39"), Range("C42:C42")) 'définit la plage Pl2
If Not Application.Intersect(Target, Pl2) Is Nothing And Target.Value <> "" Then 'si le changement a lieu ailleurs que dans la plage Pl2, la macro sort de la procédure
'Copie de la cellule de la plage dans la première colonne vide de la même ligne après la colonne L
MsgBox "Vos données vont être sauvegardées et vous allez pouvoir en renseigner d'autres du même type." & vbLf & vbLf & "Si vous n'avez pas d'autres informations de ce type à insérer, vous pouvez passer à la ligne suivante.", vbOKOnly + vbInformation, _
"VELP - V2.0"
Col = Cells(Target.Row, Columns.Count).End(xlToLeft).Column + 1
Target.Offset(0, 0).Copy
Cells(Target.Row, Col).PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
End If
'End With
End If
End SubSauf que là, la macro me met d'affilée les deux messages ("Veuillez remplir les cellules C48 à C51 pour générer le calcul." et "Vos données vont être sauvegardées et vous allez pouvoir en renseigner d'autres du même type." & vbLf & vbLf & "Si vous n'avez pas d'autres informations de ce type à insérer, vous pouvez passer à la ligne suivante."), même si les cellules C48:C51 ne sont pas vides. J'ai raté quelque chose, mais où ?
Merci d'avance.
Salut,
Ton fichier est un sacré bric-à-brac qui ne donne pas trop l’envie de s’y plonger. Ne le prends pas mal, cette remarque se veut vraiment constructive.
Afin de pouvoir tester ton fichier, j’ai dû supprimer tes listes de validation sur les cellules C49 et C51 qui comportaient des références à des fichiers externes.
Je peux alors te dire que ton MsgBox ‘Veuillez remplir les cellules C48 à C51 pour générer le calcul ...........’ se déclenche avant que tes conditions soient posées. Il est donc nécessaire de déplacer la ligne MsgBox "Veuillez remplir les cellules C48 à C51 pour générer le calcul.", vbOKOnly + vbInformation, "VELP - V2.0" après la ligne If Range("C48").Value = "" And Range("C49").Value = "" And Range("C50").Value = "" And Range("C51").Value = "" Then.
Ensuite dans cette instruction If / End If, tu as cette deuxième MsgBox "Vos données vont être sauvegardées et vous allez pouvoir en renseigner d'autres du même type." & vbLf & vbLf & "Si vous n'avez pas d'autres informations de ce type à insérer, vous pouvez passer à la ligne suivante.", vbOKOnly + vbInformation, _
''''''' "VELP - V2.0", MsgBox qui semble ne pas être à sa place ici. Je l’ai simplement neutralisée dans le fichier ci-joint ; à toi de voir si elle n’existe pas déjà ailleurs ou si elle ne doit pas être déplacée à l’extérieur de cette instruction If / End If.
Et puis last but not least, ta condition doit comporter de OR à la place de tes AND, autrement ton instruction If / End if ne se déclenche que si les 4 cellules de la plage C48:C51 sont vides et non pas si une des 4 cellules est vide.
Ca en fait déjà pas mal pour cette fois, on s’arrête là ?
'--------------------------------------------Passage modifié par Yvouille
Range("B48").Select
If Range("C48").Value = "" Or Range("C49").Value = "" Or Range("C50").Value = "" Or Range("C51").Value = "" Then
MsgBox "Veuillez remplir les cellules C48 à C51 pour générer le calcul.", vbOKOnly + vbInformation, _
"VELP - V2.0"
''''''''Copie de la cellule de la plage dans la première colonne vide de la même ligne après la colonne L
'''''''MsgBox "Vos données vont être sauvegardées et vous allez pouvoir en renseigner d'autres du même type." & vbLf & vbLf & "Si vous n'avez pas d'autres informations de ce type à insérer, vous pouvez passer à la ligne suivante.", vbOKOnly + vbInformation, _
''''''' "VELP - V2.0"
End If
'--------------------------------------------Passage modifié par Yvouille - FinCordialement.
Bonjour le forum,
Bonjour Yvouille,
Pas de problème, ta remarque sur le bric-à-brac ne me gêne pas du tout. Je suis loin d'être un pro des macros et j'ajoute des lignes de code sans que ce soit toujours comme il faut.
En tout cas, merci pour ton aide.
J'en profite justement pour te solliciter de nouveau.
J'ai repris le code comme tu l'as modifié :
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Pl, Pl2 As Range 'déclare la variable Pl (Plage)
Dim i, Col As Long
If Target.Count > 1 Then Exit Sub
Set Pl = Range("B29:B31") 'définit la plage Pl
If Not Application.Intersect(Target, Pl) Is Nothing And Target.Value <> "" Then 'si le changement a lieu ailleurs que dans la plage Pl, la macro sort de la procédure
Range("B48").Select
If Range("C48").Value = "" Or Range("C49").Value = "" Or Range("C50").Value = "" Or Range("C51").Value = "" Then Exit Sub
MsgBox "Veuillez remplir les cellules C48 à C51 pour générer le calcul.", vbOKOnly + vbInformation, _
"VELP - V2.0"
'If Target.Value = "Code 21" Or "Code 40"
End If
'Copie de la cellule de la plage dans la première colonne vide de la même ligne après la colonne L
MsgBox "Vos données vont être sauvegardées et vous allez pouvoir en renseigner d'autres du même type." & vbLf & vbLf & "Si vous n'avez pas d'autres informations de ce type à insérer, vous pouvez passer à la ligne suivante.", vbOKOnly + vbInformation, _
"VELP - V2.0"
Col = Cells(Target.Row, Columns.Count).End(xlToLeft).Column + 1
Target.Offset(0, 1).Copy
Cells(Target.Row, Col).PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
Set Pl2 = Application.Union(Range("C37:C39"), Range("C42:C42")) 'définit la plage Pl2
If Not Application.Intersect(Target, Pl2) Is Nothing And Target.Value <> "" Then 'si le changement a lieu ailleurs que dans la plage Pl2, la macro sort de la procédure
'Copie de la cellule de la plage dans la première colonne vide de la même ligne après la colonne L
MsgBox "Vos données vont être sauvegardées et vous allez pouvoir en renseigner d'autres du même type." & vbLf & vbLf & "Si vous n'avez pas d'autres informations de ce type à insérer, vous pouvez passer à la ligne suivante.", vbOKOnly + vbInformation, _
"VELP - V2.0"
Col = Cells(Target.Row, Columns.Count).End(xlToLeft).Column + 1
Target.Offset(0, 0).Copy
Cells(Target.Row, Col).PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
End If
'End With
'End If
End SubJ'ai remis la deuxième MsgBox :
"Vos données vont être sauvegardées et vous allez pouvoir en renseigner d'autres du même type." & vbLf & vbLf & "Si vous n'avez pas d'autres informations de ce type à insérer, vous pouvez passer à la ligne suivante.", vbOKOnly + vbInformation, _
"VELP - V2.0"car, pour l'utilisateur, il faut qu'elle soit présente.
A l'heure actuelle, voici ce que ça donne :
- quand je saisis une valeur en B29, par exemple, la macro va bien en B48 ;
- quand je rentre une valeur (date en l'occurrence) en C48, la macro copie D48 en G48:H48 ;
- quand je rentre une valeur en C49 (matin ou après-midi), la macro efface le contenu de la cellule D48 ;
- quand je rentre une valeur en C50 (encore une date), la macro bugge et je dois fermer Excel.
C'est déjà nettement mieux qu'hier, puisque la macro agit dans le bon ordre. Je comprends bien où ça cloche (la macro considère qu'il faut copier le contenu des cellules C48, C49, C50 ou C51 vers la première colonne vide), mais je ne vous pas comment faire !
Pour rappel, je souhaite que l'utilisateur rentre ses données "librement" en C48:C51 sans que la macro se déclenche. Une fois que c'est fait, la 2e Msgbox apparaît ("Vos données vont être sauvegardées ...") et les données de B29, ou B30 ou B31 se copie à partir de la colonne N29, N30 ou N31 en décalant vers la droite à chaque fois qu'une cellule est remplie.
Enfin, j'apporte à ça une nuance. Dans l'ideal, si la valeur de B29 est, par exemple, Code 21 ou Code 40, il n'est pas nécessaire à l'utilisateur de remplir les cellules C48:C51. La macro passe directement à la 2e Msgbox et copie C29, C30 ou C31 en N29, N30 ou N31 (comme indiqué ci-dessus). Est-ce que c'est possible ?
Je joins le fichier test modifié.
Merci d'avance.
Cordialement.
Re,
Le problème c’est que ça complique passablement la correction de notre part.DMo859 a écrit :j'ajoute des lignes de code sans que ce soit toujours comme il faut.
Je ne sais pas pourquoi tu as modifié mon code avec l’ajout d’un Exit Sub à la fin de la ligne If Range("C48").Value = "" Or Range("C49").Value = "" Or Range("C50").Value = "" Or Range("C51").Value = "" Then.
Chez moi ça bugge à plusieurs endroits.
Merci d’indiquer ce fil comme résolu et de bien vouloir en ouvrir un autre pour la suite ; je n’ai plus trop l’envie de continuer dans ces conditions
Cordialement.