Procédure qui redémarre automatiquement

Bonjour le forum,

Aujourd'hui rien de bien compliquer pour les plus forts d'entre vous

J'ai une userforme ou je rentre des données, lorsque l'opérateur oublie ou zap une texte box ou combo box

Je lui fait apparaître un message lui disant --> renseigner la valeur ....

Seulement une fois que tout les msgbox ce sont affiché,

comme le code ne li pas ces valeur, il m’affiche une erreur d’exécution ce qui est tout a fait légitime.

J'aimerais, si quelqu'un connait l'astuce, au lieux de faire planter la procédure j'aimerais qu'il la redémarre en boucle jusqu’à ce que le formulaire sois complet, tout en affichant les msgbox associé au saisie manquante

Je vous ai joint un morceau de fichier pour que vous puissiez y voir plus claire.

Merci de prendre le temps pour résoudre mon problème

Bonjour,

En préambule, j'ai apporté quelques modifications à ton code :

  • Modification de l'indentation pour faciliter la lecture du code
  • Suppression de nombreux espaces et mise en bout de ligne de certains commentaires pour condenser le code
  • Ajout d'une structure "With Sheets("Truc")...End With" pour éviter l'activation inutile d'une feuille
  • Suppression des Offset, intégrés directement dans l'index colonne des "Cells(Ligne, Colonne)", pour simplifier le code

Concernant ton problème :

  • Ajout d'une variable booléenne ("Complet") qui prend la valeur "FAUX" dès qu'un élément est manquant
  • Ajout d'une instructions pour quitter la procédure si Complet est FAUX

Le code :

Private Sub Btnajout_Click()

'***************************
'Définition des variable
'***************************
Dim resProfondeur As Double, resSection As Double, resSection1 As Double, resSection2, resFinal As Double, resLong As Double
Dim resVolume As Double, resPoids As Double, resTemps As Double, resPasse As Double, resNbPasse As Double
Dim resTempsSoudure As Double, resPrixFlux As Double, resConsoFlux As Double, resCoutMetal As Double, resCoutFlux As Double
Dim resTotal As Double, Complet As Boolean

'**********************
'afficher un message
'**********************
Complet = True
If lblAffaire.Value = "" Then
    MsgBox "Renseigner un numéro d'affaire"
    Complet = False
End If

If lblDiametre.Value = "" Or lblLongueur.Value = "" Then
    MsgBox "Renseigner un diamètre ou une longueur"
    Complet = False
Else
    MsgBox "Longueur de soudure enregistré !"
End If

If lblEp.Value = "" Then
    MsgBox "Renseigner une epaisseur"
    Complet = False
End If

If lblNombre.Value = "" Then
    MsgBox "Renseigner un nombre de soudure"
    Complet = False
End If

If cboAngle.Value = "" Then
    MsgBox "Renseigner un angle de chanfrein"
    Complet = False
End If

If lbljeudesoudage.Value = "" Then
    MsgBox "Renseigner un jeu de soudage"
    Complet = False
Else
    MsgBox "Section de soudure calculée !"
End If

If cbopoids.Value = "" Then
    MsgBox "Renseigner la densité du métal d'apport"
    Complet = False
End If

If lblMetal.Value = "" Then
    MsgBox "Renseigner le prix au kg du métal d'apport"
    Complet = False
End If

If Not Complet Then Exit Sub 'Sortir de la procédure ici si info manquante
varderligne = Sheets("Source SAW").Range("A65000").End(xlUp).Row

'************************
'Procédure permetant de determiner la profondeur du cordon
'******************************

If lblEp.Value <= 18 Then
    resProfondeur = lblEp.Value * 1.25
Else
    If lblEp.Value <= 28 Then resProfondeur = lblEp.Value * 1.2 Else resProfondeur = lblEp.Value * 1.15
End If

'***********************
'Calcul de la section
'***********************

If cboType.Value = "V égale" Then
    resoppose = (Math.Tan((cboAngle.Value / 2) * (3.14159 / 180)) * resProfondeur) * resProfondeur
    resSection = (resoppose + (lbljeudesoudage.Value * resProfondeur)) / 100
    resFinal = resSection
Else
    If cboType.Value = "X égale" Then
        resoppose = (Math.Tan((cboAngle.Value / 2) * (3.14159 / 180)) * (resProfondeur / 2)) * (resProfondeur / 2)
        resSection1 = ((resoppose + lbljeudesoudage.Value * (resProfondeur / 2)) * 2) / 100
        resFinal = resSection1
    Else
        resOppose1 = (Math.Tan((cboAngle.Value / 2) * (3.14159 / 180)) * lblGrande) * lblGrande
        resOppose2 = (Math.Tan((cboAngle.Value / 2) * (3.14159 / 180)) * lblPetite) * lblPetite
        resSection2 = ((resOppose1 + resOppose2) + (lbljeudesoudage.Value * resProfondeur)) / 100
        resFinal = resSection2
    End If
End If

'******************************
'Calcul de la longeur à souder
'*******************************

If lblDiametre = "" Then resLong = lblLongueur Else resLong = ((lblDiametre.Value - lblEp.Value) * 3.14159)
resVolume = (resFinal * (resLong / 10)) / 1000 'volume d'un cordons
resPoids = ((resVolume * lblNombre) * cbopoids) * 1.1 'Calcul poids metal a deposer
resTemps = (0.17 * resLong) / 1000 'Calcul de temps par passe de soudure
resPasse = resFinal * 4 'Calcul nombre de passe/Soudure
resNbPasse = resPasse * lblNombre ' Calcule nombre de passe TOTAL
resTempsSoudure = resTemps * resNbPasse 'Calcul temps de soudure
resPrixFlux = 2.49 'Prix du flux
resConsoFlux = resPoids * 3 'Consommation du flux
resCoutMetal = resPoids * lblMetal 'Cout métal d'apport a deposer
resCoutFlux = resPrixFlux * resConsoFlux 'Cout du flux
resTotal = resCoutMetal + resCoutFlux 'Cout Total

With Sheets("Source SAW")
    .Cells(varderligne + 1, 1).Value = CStr(lblAffaire.Value)
    If lblDiametre = "" Then .Cells(varderligne + 1, 2) = "" Else .Cells(varderligne + 1, 2) = CDbl(lblDiametre.Value)
    If lblLongueur = "" Then .Cells(varderligne + 1, 3) = "" Else .Cells(varderligne + 1, 3) = CDbl(lblLongueur.Value)
    .Cells(varderligne + 1, 4) = CDbl(lblEp.Value)
    .Cells(varderligne + 1, 5) = CDbl(lblNombre.Value)
    .Cells(varderligne + 1, 6) = CDbl(resProfondeur)
    .Cells(varderligne + 1, 7) = CDbl(cboAngle.Value)
    .Cells(varderligne + 1, 8) = (cboType.Value)
    .Cells(varderligne + 1, 9) = CDbl(lblTalon.Value)
    .Cells(varderligne + 1, 10) = CDbl(lbljeudesoudage.Value)
    .Cells(varderligne + 1, 11) = CDbl(cbopoids.Value)
    .Cells(varderligne + 1, 12) = CDbl(lblMetal.Value)
    If lblPetite = "" Or lblGrande = "" Then
        .Cells(varderligne + 1, 15) = ""
        .Cells(varderligne + 1, 16) = ""
    Else
        .Cells(varderligne + 1, 15) = CDbl(lblPetite.Value)
        .Cells(varderligne + 1, 16) = CDbl(lblGrande.Value)
    End If
   .Cells(varderligne + 1, 19) = resFinal
   .Cells(varderligne + 1, 20) = resLong
   .Cells(varderligne + 1, 21) = resVolume
   .Cells(varderligne + 1, 22) = resPoids
   .Cells(varderligne + 1, 26) = resTemps
   .Cells(varderligne + 1, 27) = resPasse
   .Cells(varderligne + 1, 28) = resNbPasse
   .Cells(varderligne + 1, 29) = resTempsSoudure
   .Cells(varderligne + 1, 30) = resPrixFlux
   .Cells(varderligne + 1, 31) = resConsoFlux
   .Cells(varderligne + 1, 35) = resCoutMetal
   .Cells(varderligne + 1, 36) = resCoutFlux
   .Cells(varderligne + 1, 37) = resTotal
End With

End Sub

Bonjour,

personnellement je ferai des "exit sub" à chaque fois qu'il manque une info.

Le seul intérêt de continuer la procédure ce serait de remplacer les "msgbox" par des "InputBox" afin

d'avoir l'info manquante et continuer la procédure.

Bonjour,

Ci-joint une solution...

Merci à tous pour vos réponses, je suis vraiment reconnaissant envers vous merci de chercher le bon code le plus simple

j’essaie ça demain et vous retient au courant

Bonne soirée

Pedro22 et oxydum pour vos propositon seulement avec ton codes les données saisie ne son plus ajouté dans la feuille excel

Ce qui est asser emmerdant car du coup il on ne sais pas ou arrive les donnés

Est ce que quelqu’un aurait la solution ?

Bonjour,

personnellement je ferai des "exit sub" à chaque fois qu'il manque une info.

Le seul intérêt de continuer la procédure ce serait de remplacer les "msgbox" par des "InputBox" afin

d'avoir l'info manquante et continuer la procédure.

Bonjour

Comment fait n pour appliquer cette procédure ??

Pedro22 et oxydum pour vos propositon seulement avec ton codes les données saisie ne son plus ajouté dans la feuille excel

Ce qui est asser emmerdant car du coup il on ne sais pas ou arrive les donnés

Est ce que quelqu’un aurait la solution ?

Comme dis plus haut il n'y a pas d'intérêt à vouloir poursuivre le code si la cellule n'est pas renseignée.

Comme tu utilises des messages box l'utilisateur ne peux pas donner l'information avant la fin de la procédure.

Donc aucun intérêt.

Autant faire des "Exit sub" après chaque test si la cellule est vide. et demander à l'utilisateur de "revalider après modification du champ manquant".

Principe : condition 1 alors : message plus arrêt du code ….. sinon .... code continue

If textbox1=""then

'ton message box et on sort du code avec

Exit sub

sinon : le code continue.

j'ai laissé les messages concernant le moment ou le calcul et fait mais bof vois pas trop l'utilité non plus.

si il oublie trois infos il aura droit à trois fois le message sur le calcul aggaçant à la longue

Rechercher des sujets similaires à "procedure qui redemarre automatiquement"