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 !!!!

Rechercher des sujets similaires à "msgbox boucle"