Placement d'une MSGBOX dans macro VBA

Bonjour,

J'ai une macro qui me permet d'envoyer des mail selon une condition: "If Range("I" & i).Value >= 30"

J'aurais aimé afficher un Msgbox si jamais :" If Range("I" & i).Value < 30"

Seulement je ne sais pas où placer ce Msgbox => "MsgBox "la valeur étant inférieure à 30, RAS", vbOKOnly + vbCritical, "Excel"

Je poste un extrait de mon code ci-dessous:

Sub Envoi_Mail()
  Dim i As Long, nom As String, chemin As String
  Dim OutMail As Object
  Dim S As Shape
  Dim sRep As String, strbody As String, WshShell As Object
  Dim xName As String
Dim xFound As Boolean
Application.ScreenUpdating = False
xName = InputBox("Veuillez saisir votre nom svp:", "Excel")
If xName = "" Then
MsgBox "Vérifiez la saisie svp.", vbOKOnly + vbCritical, "Excel"
Exit Sub
End If
If xName = "TOTO" Then
'***************************
Mon code VBA

'***************************
  For i = 4 To Range("A" & Rows.Count).End(xlUp).Row
    If IsEmpty(Range("H" & i).Value) Then
      If Range("I" & i).Value >= 30 Then
'***************************
Mon code VBA

'***************************
      End If
    End If

  Next

Else
MsgBox "Désolé, vous ne pouvez pas cliquer sur  ce bouton.", vbOKOnly + vbCritical, "Excel"

End If
Application.ScreenUpdating = True

End Sub

Un grand merci à celles et ceux qui pourront me venir en aide :)

JB

Bonsoir,

un essai :

      If Range("I" & i).Value >= 30 Then
'***************************
Mon code VBA

'***************************
      Else
          MSGBOX("Valeur inférieure à 30 !")
      End If

Bonjour,

Si vous avez une grande quantité de ces cas dans votre boucle, cela risque d'être fastidieux, non ?

Salut JB,
Salut l'équipe,

Eric a raison : si ces cas arrivent souvent sur ta liste, ça risque de devenir très ch... cette opération Mail...


A+

Bonsoir à vous tous :)

Merci pour ta proposition LoureeD ! Je vais essayer ça !

Oui c'est assez lourd mais peut-on faire plus simple ? Je n'ai pas les compétences pour cela :)

Bonne soirée et encore merci !

JB

Salut JB,

plus simple ? Certes !
Comme tu sembles avoir besoin de connaître ces refus de mails :
- on peut sauvegarder une donnée de ces lignes -> MsgBox;
- colorer ces lignes ;
- ...

De quoi as-tu besoin ?


A+

A nouveau,

Je précise, si jamais la valeur est inférieure à 30, j'aimerais sortir de la boucle :) C'est juste pour que mes collaborateurs comprennent que cliquer sur le bouton ne lancera pas d'action.

JB

J'ai réussi à m'en sortir ! Par contre c'est vrai que c'est lourd pour un envoi par mail, auriez-vous des pistes d'amélioration s'il vous plait?

Bonne fin de soirée

JB

D'accord, mais... qu'as-tu fait ?

Code, stp, et... que cherches-tu EXACTEMENT comme résultat ?
Avertir tes collaborateurs, oui, mais, de quoi, comment... ??

A+

Voilà le code complet:

Sub TEST()
  Dim I As Long, nom As String, chemin As String
  Dim OutMail As Object
  Dim S As Shape
  Dim sRep As String, strbody As String, WshShell As Object
  Dim xName As String
Dim xFound As Boolean
Application.ScreenUpdating = False
xName = InputBox("Veuillez saisir votre nom de famille svp :", "Excel")
If xName = "" Then
MsgBox "Veuillez saisir un nom de famille valide svp.", vbOKOnly + vbCritical, "Excel"
Exit Sub
End If

If xName = "TOTO" Then
  With Application
    .ScreenUpdating = False
    .EnableEvents = False
  End With
X = 0
  UFRF.Show 0
  ' Créer une instance Windows Script pour retrouver le chemin du bureau
Set WshShell = CreateObject("WScript.Shell")
sRep = WshShell.SpecialFolders("Desktop")
Set WshShell = Nothing
  For I = 4 To Range("A" & Rows.Count).End(xlUp).Row
    If IsEmpty(Range("H" & I).Value) Then
      If Range("I" & I).Value >= 30 Then
        nom = Range("A" & I).Value
 X = X + 1
        UFRF.Label2.Caption = X & " / " & (Sheets("Principale").Range("I1").Value + Sheets("Principale").Range("I2").Value)
        UFRF.Repaint
        Application.DisplayAlerts = False
        Sheets(nom).ExportAsFixedFormat Type:=xlTypePDF, Filename:=sRep & "\" & nom & ".pdf", Quality:= _
        xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=False
        Application.DisplayAlerts = False
        Set OutApp = CreateObject("outlook.application")
  Set OutMail = OutApp.CreateItem(0)
  strbody = "ESSAI 1"

  With OutMail
        .Display
        .To = ""
        .Cc = ""
        .Attachments.Add (sRep & "\" & nom & ".pdf")
        .Subject = "OBJET 1"
        .HtmlBody = strbody & .HtmlBody
        .Send
  End With
  With Application
    .ScreenUpdating = True
    .EnableEvents = True
  End With
  Kill (sRep & "\" & nom & ".pdf")
  Application.DisplayAlerts = False
  Application.DisplayAlerts = True
      End If
      Else
      Unload UFRF
MsgBox "Valeur inférieure à 30", vbOKOnly + vbInformation, "Excel"
Exit Sub
          End If

  Next
Unload UFRF
Else
MsgBox "Vous ne pouvez pas cliquer sur ce bouton.", vbOKOnly + vbCritical, "Excel"

End If

Application.ScreenUpdating = True

End Sub

J'ai donc ajouté

 Else
      Unload UFRF
MsgBox "Valeur inférieure à 30", vbOKOnly + vbInformation, "Excel"
Exit Sub

Ça fonctionne mais ça va vous piquer les yeux surement ! Si vous avez des propositions d'amélioration je suis preneur !

JB

Pour te répondre curulis57, la finalité c'est de ne pas lancer la macro si la valeur est inférieure à 30 après que les utilisateurs aient renseigné le nom "TOTO" (pour exemple) dans le Inputbox

P..., JB, l'indentation du code...!!!

Désolé, j'ai modifié le code sous Bloc Notes juste avant de le poster ici :/

Salut JB,

bon, à l'aveugle, évidemment, ça peut être Tchernobyl, mais, bon...
Que se passe-t-il si tu as 4000 pdf non-"mailables" sur 4001 lignes ? 4000 MsgBox ?

L'enfer !

Répertorier les échecs et les renseigner dans une MsgBox ou ne serait-il pas plus judicieux de souligner d'une couleur les échecs, ou.........

Sub TEST()
'
Dim OutMail As Object, WshShell As Object
Dim S As Shape, xFound As Boolean
Dim I&, nom$, chemin$, sRep$, strbody$, xName$
'
Application.EnableEvents = False
Application.ScreenUpdating = False
'
xName = InputBox("Veuillez saisir votre nom de famille svp :", "Excel")
If xName = "" Then _
    MsgBox "Veuillez saisir un nom de famille valide svp.", vbOKOnly + vbCritical, "Excel": _
    Exit Sub
'
If xName = "TOTO" Then
    X = 0
    UFRF.Show 0
    ' Créer une instance Windows Script pour retrouver le chemin du bureau
    Set WshShell = CreateObject("WScript.Shell")
    sRep = WshShell.SpecialFolders("Desktop")
    Set WshShell = Nothing
    Set OutApp = CreateObject("outlook.application")
    Application.DisplayAlerts = False
    For I = 4 To Range("A" & Rows.Count).End(xlUp).Row
        If IsEmpty(Range("H" & I).Value) Then
            If Range("I" & I).Value >= 30 Then
                nom = Range("A" & I).Value
                X = X + 1
                UFRF.Label2.Caption = X & " / " & (Sheets("Principale").Range("I1").Value + Sheets("Principale").Range("I2").Value)
                UFRF.Repaint
                Sheets(nom).ExportAsFixedFormat Type:=xlTypePDF, Filename:=sRep & "\" & nom & ".pdf", Quality:= _
                xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=False
                Set OutMail = OutApp.CreateItem(0)
                strbody = "ESSAI 1"
                '
                With OutMail
                    .Display
                    .To = ""
                    .Cc = ""
                    .Attachments.Add (sRep & "\" & nom & ".pdf")
                    .Subject = "OBJET 1"
                    .HtmlBody = strbody & .HtmlBody
                    .Send
                End With
                Kill (sRep & "\" & nom & ".pdf")
                Set OutMail = Nothing
            End If
        Else
            MsgBox "Valeur inférieure à 30", vbOKOnly + vbInformation, "Excel"
            Exit Sub
        End If
    Next
    Unload UFRF
    Application.DisplayAlerts = True
Else
    MsgBox "Vous ne pouvez pas cliquer sur ce bouton.", vbOKOnly + vbCritical, "Excel"
End If
'
Application.ScreenUpdating = True
Application.EnableEvents = True
'
End Sub


A+

A nouveau,

Bien sûr que non ce n'est pas l'objectif ! Mais dans mon cas il n'y aurait pas 4000 msgbox si je mets Exit Sub, non ?

En fait si la valeur est <30, je souhaite simplement ne pas exécuter la macro et afficher un msgbox c'est tout :)

Bonne fin de soirée

JB

Salut JB,

Exit Sub couperait court à la Sub mais... empêcherait aussi l'envoi potentiel des pdf suivants qui, eux, entreraient peut-être dans les clous !
D'où ma suggestion de répertorier les échecs d'envoi (donc, pas de MsgBox à tout bout de champ) pour, éventuellement, vérifier les données de ces lignes.


A+

Salut curulis57,

Merci pour ton retour, tu penses qu'avec ce msgbox je risque de ne pas envoyer certains pdf même si la valeur est >30 ?

En fait, je voudrais faire la vérification <30 au tout début de ma macro avec la saisie du nom dans l'inputbox. Aurais-tu une piste pour le code ?

Bonne fin de journée :)

JB

Tant pis, je vais abandonner cette hypothèse !

JB

Salut JB,

déso pour le retard de réponse, je suis plongé dans le final d'un projet pour les collègues...

Pour répondre à ta première question : oui, avec ce code en l'état, certains pdf ne partiront pas

En fait, je voudrais faire la vérification <30 au tout début de ma macro

Oui, d'accord, mais pour faire quoi avec ces informations ?

Tu entames quand même la procédure d'envoi ou tu règles d'abord les lignes <30 ?


A+

Re curulis57,

Pas de souci ne t'en fais pas!

Oui, d'accord, mais pour faire quoi avec ces informations ? ==> Juste afficher un Msgbox et ne pas lancer la procédure, c'est une vérification en quelque sorte :)

JB

Rechercher des sujets similaires à "placement msgbox macro vba"