MsgBox et boucle SI
Bonjour,
apres avoir suivi le tuto VBA de ce forum, j ai enfin ecris mon premier code, et il ne marche pas, oh quelle surprise !!!!
j ai essayé de mettre un maximum de commentaire pour aider a la comprehension du code. L erreur vient du msgbox(je pense), mais je ne vois pas comment faire autrement....
en résumé, je veux que entre les lignes 46 et 137 si l utilsateur ecrit quelque chose dans la colonne P qui commence par 2,3,4,5 et qui est different de "3G6" alors une boite boite de dialogue s ouvre et demande de choisir entre 4 options :
option1 => 2,5 si l utilisatieur valide ce choix alors il faudra ecrire dans la cellule CN de cette meme ligne "SP-2,5"
option 2 => Bf-1,5 si l utilisatieur valide ce choix alors il faudra ecrire dans la cellule CN de cette meme ligne "SP-Bf"
option 3 => Bc-1,5 si l utilisatieur valide ce choix alors il faudra ecrire dans la cellule CN de cette meme ligne "SP-Bc"
option 4 => Annuler si l utilisatieur valide ce choix alors il faudra effacer le contenu de la cellule P
Sub R2V()
Dim i As Integer
' i egale au numero de la ligne
For i = 46 To 137
' si gauche(Pi,1)=2 ou 3 ou 4 ou 5 et que Pi <> "3G1,5"
If Left(Cells(i, 16), 1) = 2 Or 3 Or 4 Or 5 And Cells(i, 16) <> "3G6" Then
' sinon si le choix validé est "2,5" alors ecrire en cellule CNi "SP-2,5"
If MsgBox("choisir la colonne SP", vbQuestion, "2,5", "Bf-1,5", "Bc-1,5", "Annuler") = "2,5" Then
Cells(i, 91) = "SP-2,5"
' sinon si choix =Bf-1,5 alors ecrire en CNi "SP-Bf"
ElseIf MsgBox("choisir la colonne SPOLU", "CHOIX SPOLU", vbQuestion, "2,5", "Bf-1,5", "Bc-1,5") = "Bf-1,5" Then
Cells(i, 91) = "SP-Bf"
' sinon si choix=Bc-1,5 alors ecrire en CNi "SP-Bc"
ElseIf MsgBox("choisir la colonne SPOLU", "CHOIX SPOLU", vbQuestion, "2,5", "Bf-1,5", "Bc-1,5") = "Bc-1,5" Then
Cells(i, 91) = "SP-Bc"
' sinon si choix = annuler, alors fermer la boite de dialogue est effacer le contenu de cells(i,CN)
Else: Cells(i, 91).ClearContents
End If
Next
End Sub
Quelqu un a une idee ?
Merci
Bonjour,
quelques conseils avant de continuer :
- mets ton code entre balises </>
- indente ton code ... c'est déjà 50% de la résolution du problème
- mets un fichier anonymisé ... ce sera plus efficace pour toi comme pour ceux qui se pencherons sur le bébé VBA
voici :
Sub R2V()
Dim i As Integer
' i egale au numero de la ligne
For i = 46 To 137
' si gauche(Pi,1)=2 ou 3 ou 4 ou 5 et que Pi <> "3G1,5"
If Left(Cells(i, 16), 1) = 2 Or 3 Or 4 Or 5 And Cells(i, 16) <> "3G6" Then
' sinon si le choix validé est "2,5" alors ecrire en cellule CNi "SP-2,5"
If MsgBox("choisir la colonne SP", vbQuestion, "2,5", "Bf-1,5", "Bc-1,5", "Annuler") = "2,5" Then
Cells(i, 91) = "SP-2,5"
' sinon si choix =Bf-1,5 alors ecrire en CNi "SP-Bf"
ElseIf MsgBox("choisir la colonne SPOLU", "CHOIX SPOLU", vbQuestion, "2,5", "Bf-1,5", "Bc-1,5") = "Bf-1,5" Then
Cells(i, 91) = "SP-Bf"
' sinon si choix=Bc-1,5 alors ecrire en CNi "SP-Bc"
ElseIf MsgBox("choisir la colonne SPOLU", "CHOIX SPOLU", vbQuestion, "2,5", "Bf-1,5", "Bc-1,5") = "Bc-1,5" Then
Cells(i, 91) = "SP-Bc"
' sinon si choix = annuler, alors fermer la boite de dialogue est effacer le contenu de cells(i,CN)
Else: Cells(i, 91).ClearContents
End If
Next
End Sub
Première remarque, pas de raccourci ... et attention aux "priorités" sur les tests ...
If (Left(Cells(i, 16), 1) = 2 Or Left(Cells(i, 16), 1) = 3 Or Left(Cells(i, 16), 1) = 4 Or Left(Cells(i, 16), 1) = 5) And Cells(i, 16) <> "3G6" Then
Deuxième remarque ... ne répète pas msgbox, demande une seule fois :
reponse = inputbox(___________________)
https://docs.microsoft.com/fr-fr/office/vba/api/excel.application.inputbox
et ensuite teste la valeur de reponse
...
Merci pour ton aide Steelson, grace a toi j ai reussi a ecrire un code qui marche !!! par contre, le but principal de cette macro est d eviter a l utilisateur d avoir a ecrire les choix possibles (long et fastidieux avec le tiret, les majuscules et minuscules)
Il n y a pas une methode pour que la fenetre de dialogue affiche directement les 3 choix possibles, a l utilisateur ensuite de choisir celle voulue ?
Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Integer
Dim resultat As String
For i = 46 To 137
If (Left(Cells(i, 16), 1) = 2 Or Left(Cells(i, 16), 1) = 3 Or Left(Cells(i, 16), 1) = 4 Or Left(Cells(i, 16), 1) = 5) And Cells(i, 16) <> "3G6" And Cells(i, 91) = "" Then
resultat = InputBox("choisir la colonne SP du tube " & Cells(i, 3).Value & Cells(i, 4).Value, "CHOIX SP TUBE ", "SAISIR ICI")
If resultat = "SP-Bc" Then
Cells(i, 91) = "SP-Bc"
ElseIf resultat = "SP-Bf" Then
Cells(i, 91) = "SP-Bf"
ElseIf resultat = "SP-2,5" Then
Cells(i, 91) = "SP-2,5"
End If
End If
Next
End Sub
Merci et bonne journée
Dans ce cas, il faudrait remplacer inputbox
par un userform
.
Je te laisse fouiller ? (en réalité, je n'aime pas trop les userform mais je peux m'y mettre ...)
je vais regarder par moi meme deja et si besoin d aide je te demanderai, merci !
alors j ai un peu progressé....j ai crée ma userform, mes choix,..., ca ca va.
La macro se lance, je valide mon choix, mais je n arrive pas a ecrire en fonction du choix dans la bonne cellule CMi.
Est ce que je peux reutiliser ma varible i, definie dans ma feuil1, dans ma userform. J ai essayé a priori ca ne marche pas, j ai essayé aussi de la redeclarer dans la userforme une variable i, pas plus de succes., j arrive bien a ecrire dans une cellule donnée avec :
Private Sub CommandButton1_Enter()
Sheets("PIE").Activate
Range("CM53").Value = "SP-2,5"
Unload Me
End Sub
mais je n arrive pas ecrire ma valeur "SP-2,5" sur la meme ligne i que la procedure est en train de suivre . je voudrais faire quelque chose du style :
Private Sub CommandButton1_Enter()
Sheets("PIE").Activate
cells(i,91).Value = "SP-2,5"
Unload Me
End Sub
mais ce n est pas correct....
ensuite 2eme point :
je voudrais bien que dans le text de la userform je fasse reference aux cellules Ci et Di de la ligne en cours.
Je voudrais ecrire dans le text de la userform "choisir avec quelle colonne le tube Ci&Di va. J y arrive avec un msgbox mais pas avec userform.
Merci
Il faut limiter la macro événementielle à la colonne 16 (sinon inscrire en colonne CM va déclencher une erreur.
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column <> 16 Then Exit Sub
i = Target.Row
If (Left(Cells(i, 16), 1) = 2 Or Left(Cells(i, 16), 1) = 3 Or Left(Cells(i, 16), 1) = 4 Or Left(Cells(i, 16), 1) = 5) And Cells(i, 16) <> "3G6" And Cells(i, 91) = "" Then
frm_choix_SPOLU.Show
End If
End Sub
Pour savoir quelle ligne renseigner, utilise ActiveCell.Row
ce qui donne
Private Sub CommandButton1_Enter()
Sheets("PIE").Range("CM" & ActiveCell.Row).Value = "SP-2,5"
Unload Me
End Sub
fais pareil pour les 2 autres boutons
super, merci beaucoup, j ai réussi a faire ce que je voulais !!!
Je continue mon apprentissage
bonne fin de journee
Bonjour,
je me permets de réouvirir le sujet. A l usage il y a quelque chose qui me derange dans ma macro. Si on renseigne la colonne P par le menu deroulant, OK pas de probleme. Par contre si on renseigne la colonne P manuellement et qu on fait "entrer" (donc on change de ligne), la macro s applique a la ligne du dessous.
il faut rester sur la meme ligne par tabulation ou les fleches gauche/droite, mais on est plusieurs a utiliser ce fichier et on travaille tous differement.
Donc ma question c est comment faire en sorte que la userforme ecrive toujours sur la meme ligne quelque soit la facon de renseigner la colonne P ?
j ai essayé avec une boucle for, n a rien donné...
est ce qu il faut utiliser autre chose que target.row ?
ou est ce qu il faut analyser la facon dont est renseignée la colonne P et ensuite soit faire activecell.row ou activecell.row-1 selon ?
merci !
flore
Il faut sauvegarder la ligne courante dans une variable.
Pour cela, il faut la déclarer en public dans un module
Public iCourant%
Il faut enregistrer cette valeur dans la procédure événementielle
Private Sub Worksheet_Change(ByVal target As Range)
If target.Column <> 16 Then Exit Sub
iCourant = target.Row
If (Left(Cells(iCourant, 16), 1) = 2 Or Left(Cells(iCourant, 16), 1) = 3 Or Left(Cells(iCourant, 16), 1) = 4 Or Left(Cells(iCourant, 16), 1) = 5) And Cells(iCourant, 16) <> "3G6" And Cells(iCourant, 91) = "" Then
frm_choix_SPOLU.Show
End If
End Sub
et l'utiliser dans le code de l'userform
Private Sub CommandButton1_Enter()
Sheets("PIE").Range("CM" & iCourant).Value = "SP-2,5"
Unload Me
End Sub
Private Sub CommandButton3_Enter()
Sheets("PIE").Range("CM" & iCourant).Value = "SP-Bf"
Unload Me
End Sub
Private Sub CommandButton4_Enter()
Sheets("PIE").Range("CM" & iCourant).Value = "SP-Bc"
Unload Me
End Sub
encore une fois un grand merci. !
d un cote je suis super contente mais de l autre ca m enerve de pas savoir faire tout ca !!!!