Quitter un programme principal en fonction d'une variable dans les sous programmes

Makina

XLDnaute Junior
Bonjour à tous,

Alors voila, J' ai un programme pricipal qui ne fait que appeller des sous programmes, ma première tentative qui fonctionne a été de mettre la variable public y à 0 par defaut et à 1 si j ai un problème dans un sous programme ou que j annule le déroulement de mon sub. Je controlais à chaque retour dans mon main la valeur de Y.

Comme j ai pas mal de sub, j'ai voulu essayer de mettre on y=1 goto 999 mais cela na fonctionne pas.

Mon Y est setter à 0 dans mon premier sub, car si je mettais y=0 dans le main, meme si je disais y=1 dans un sub, au retour dans le main, y était resté à 0.

Ma première solution fonctionne mais cela serai plus propre si je disais dès le debut du principal : si y=1 alors on sauve et on quitte !

Mon principal :
Code:
Sub Scan()
Dim cdt As String
Dim typ As String
Dim celluletrouvee As Range
Dim Ligne As Integer
Dim Col As Integer
Dim ncadre As Integer
Dim p As Integer
Dim message As String


    nametest = ActiveWorkbook.Name
    
    On y = 1 GoTo 999
    
    'recherche du numéro d agrès
    Call nagreauto
    
    ' scanner le type d agrès
    Call typcdt
    
    'If y = 1 Then
        'Call tempsave
        'Call Sauvegarde
        'Exit Sub
    'End If
    
    'flasher les menuiseries
    Call flasher
    'If y = 1 Then
        'Call tempsave
        'Call Sauvegarde
        'Exit Sub
    'End If
    
    'ranger les codes barres
    Call ranger_codes_barres
    
    'If y = 1 Then
        'Call tempsave
        'Call Sauvegarde
        'Exit Sub
   ' End If
    
    'décomposer les codes barres
    Call Position
    
    'If y = 1 Then
        'Call tempsave
        'Call Sauvegarde
        'Exit Sub
    'End If
    
    'trier et entrer les valeurs de codes barres
    Call trier

    'Ajouter le nom et la semaine
    Call ImporterDonnees
    
    'If y = 1 Then
        'Call tempsave
        'Call Sauvegarde
        'Exit Sub
    'End If
    
    'nombre de menuiseries totales hors PS
    Call nbr_menuiseries
    
    'nombre d'objet sur le conditionnement
    Call nbrtotal
    
    Call etatag
    
    'If y = 1 Then
        'Call tempsave
        'Call Sauvegarde
        'Exit Sub
    'End If
    
    place = MsgBox("Connaissez vous le numero de la zone de stockage ?", vbYesNo + vbCritical, "Emplacement")
    'If place = vbNo Then
        'Call tempsave
        'Call Sauvegarde
        'Exit Sub
    'End If
        
    'entrer l'emplacement de stockage
    Call emplacement
    
    'If y = 1 Then
        'Call tempsave
        'Call Sauvegarde
        'Exit Sub
    'End If
    
    'entrer les initiales du manutentionnaire
    Call initial
    
    fini = MsgBox("Voulez vous ajouter des remarques à l'une des commandes de l'agrès (absence PS, ou soldé) ?", vbExclamation + vbYesNo)
    
    'If fini = vbYes Then
        'Call Sauvegarde
        'Exit Sub
        
    'End If
    
    'ranger les infos dans la base de données
    Call ajoutdb
    
    'sauvgarder le fichier
    Call Sauvegarde
    
    'remise a zero
    Call remise_a_zero
    
999
    If y = 1 Then
        Call tempsave
        Call Sauvegarde
    End If
End Sub

Merci d avance
 

mutzik

XLDnaute Barbatruc
Re : Quitter un programme principal en fonction d'une variable dans les sous programm

bonjour

ton problème vient du fait de ta déclaration de variable
une variable peut être privée (au module) ou public (au projet tout entier)
les var privées sont déclarées dans un module sub ou private sub
si les valeurs des variables ne sont pas enregistrées sur la feuille, on perd leur valeur dès la sortie de la sub (ou private sub)
en mode public, la valeur est conservée et peut-être réutilisée dans une autre sub, mais pour cela il faut la déclarer HORS SUB comme ceci :
public MAJ as string
va te créer la variable MAJ (mise à jour) comme étant une variable de type texte et visible par tous les modules ...
 

Makina

XLDnaute Junior
Re : Quitter un programme principal en fonction d'une variable dans les sous programm

Merci de ta réponse !
J'ai enfaite 2 modules, un module Main avec ce programme et j ai oublie l'ente qui est :
Code:
Public nametest As String
Public annee As String   'les deux premier caracteres des codes barres qui donne l'année
Public dossier As String 'dossier de la base en fonction de l année

Sub Scan()
Dim cdt As String
Dim typ As String
Dim celluletrouvee As Range
Dim Ligne As Integer
Dim Col As Integer
Dim ncadre As Integer
Dim p As Integer
Dim message As String
Si je met public y as integer dans mon module main, ca ne fonctionne plus

Mon second module avec tout les sous programmes lui commence par :
Code:
Public Name As String
Public y As Integer
Dim Cnx As ADODB.Connection

Sub nagreauto()
    
    nametest = ActiveWorkbook.Name
    y = 0
    ' Définir le chemin d'accès à la base pour récupérer le numéro d'agrès
    sPath = "C:\Documents and Settings\D6432025\Desktop\cartonette\"
    ' Définir le nom de la base
    sBase = "Base_cartonette.mdb"
Etc ....

La premiere solution avec les IF y=1 then call sauvegarde call tempsave exit sub end if fonctionne ! ! ! J'aimerais juste ne pas les répéter après chaque appel de sub.

Peut etre n'ai je pas compris la réponse.

Cordialement
 

Makina

XLDnaute Junior
Re : Quitter un programme principal en fonction d'une variable dans les sous programm

J ai trouvé l un de mes probleme! Cela ne fonctionnait pas car je mettais
public y as integer
dans mes deux modules ! ! ! Maintenant je ne l ai que dans le principal, je le déclare à 0 dans le principal et si il est à 1 dans un sub alors il est prit en compte lorsque je reviens dans mon principal ! Ca c est fait!

Maintenant ma question n'était pas vraiment ca ! Y a t il un moyen d'écrire une ligne du genre :
On y = 1 GoTo 999
au début de mon principal et que cela m emmene soit à un goto soit une ligne du genre :
if (à n'importe quel moment du programme, y change à 1) then
call save
call zzz
exit sub
end if

Cela m'éviterait d'écrire mon :
If y = 1 Then
Call tempsave
Call Sauvegarde
Exit Sub
End If

après chaque call xxxx

Merci
 

mutzik

XLDnaute Barbatruc
Re : Quitter un programme principal en fonction d'une variable dans les sous programm

re,

voici un exemple qui répondra à ta demande en utilisant la gestion d'erreurs
 

Pièces jointes

  • gesterreur.xlsm
    13.7 KB · Affichages: 50
  • gesterreur.xlsm
    13.7 KB · Affichages: 49
  • gesterreur.xlsm
    13.7 KB · Affichages: 51

Makina

XLDnaute Junior
Re : Quitter un programme principal en fonction d'une variable dans les sous programm

Bonjour,

Merci de ta réponse et de ton exemple (et dsl pour le temps de réponse). J'utilise à des moments le "on error resume" dans mes sub. Mais cela ne fonctionne pas si j écris "on y=1 goto" ... je pense que cela viens du faite que je travaille sur 2 modules différents.

A+
 

mutzik

XLDnaute Barbatruc
Re : Quitter un programme principal en fonction d'une variable dans les sous programm

bonjour Makina

je viens de tester, la gestion des erreurs telle que je l'ai décrite fonctionne dans n'importe quel sub, n'importe quel module, à partir du moment ou on part du programme 'main' pour faire des call vers les sous procédures

je ne comprends pas pourquoi tu veux absolument utiliser y, il vaut mieux générer une erreur et en fonction de cette erreur, tu peux lancer des sub et faire derrière le traitement que tu veux. C'est sur, c'est un peu de boulot, mais pense aussi qu'un jour tu devras peut-être modifier ton programme ...
je ne suis pas sur qu'à ce moment là tu saches ce que représente encore y, alors que la gestion d'erreur, c'est tellement plus facile à mettre en œuvre (mais ce n'est là que mon avis, et je le partage)
 

Makina

XLDnaute Junior
Re : Quitter un programme principal en fonction d'une variable dans les sous programm

Bonjour,

Je ne suis pas du tout contre la gestion d'erreur, et cella peut meme etre une très bonne solution ! Mais si je déclarais mon y c est parce que dans presque tous mes sub j'ai :

If (condition) then
msgbox("la macro doit s arreter, contacter l'admin")
y=1
exit sub
Else
bla bla bla
End if

Puis je alors a ce moment la dire (je ne sais pas comment justement) y=1/0 au lieu de y=1 pour générer une erreur? Dois je rajouter aussi on error exit sub dans mes sub ?

Merci d avance.
 

Makina

XLDnaute Junior
Re : Quitter un programme principal en fonction d'une variable dans les sous programm

Désolé, je n avais pas bien analysé votre exemple ! suffit que je mette error1 ou autre a la place de mon y=1 ! J ai lu cela hier et j ai zappé ! mille excuses, je pense que cela fonctionnera !
 

mutzik

XLDnaute Barbatruc
Re : Quitter un programme principal en fonction d'une variable dans les sous programm

coucou,

oui c'est cela
If (condition) then
error 15
exit sub
Else
bla bla bla
End if

et dans la routine main, dans la gestion des erreurs, tu peux personnaliser ton erreur 15 en mettant à quel endroit il y a eu une erreur
tu peux également déclarer en public (je l'ai fais aussi déjà) une variable v_proc qui contiendra le nom de la sub, une éventuelle autre v_msg qui peut contenir le pourquoi de l'erreur et ainsi personnaliser toute l'appli

ci dessous un code vba qui te permet de lister les codes d'erreur d'excel - tu peux utiliser tous les codes manquants pour ton utilisation perso

Sub codes()
Dim cpt, lig

Range("A:B").ClearContents
lig = 1
On Error GoTo gesterr
For cpt = 1 To 300000
Error cpt
Next cpt

gesterr:
If Err.Description = "Erreur définie par l'application ou par l'objet" Then Resume Next
Range("A" & lig) = cpt
Range("B" & lig) = Err.Description
lig = lig + 1
Resume Next
End Sub
 

Makina

XLDnaute Junior
Re : Quitter un programme principal en fonction d'une variable dans les sous programm

Merci, tout cela est interessant, je vais me pencher plus sur les gestions d erreurs qui peuvent etre bien utile. Pour mon cas present, il n y a pas de reel erreur enfaite ! J utilise le erreur juste pour sortir de mon programme lorsque je clique "annuler" dans des inputbox ! Donc pas besoin de savoir le pourquoi de l'erreur !

Merci de ton aide, tu as résolu mon problème ! Ce forum m a deja aider sur beaucoup de point et quand je serai meilleur, je pourrai aider à mon tour !
 

Discussions similaires

Statistiques des forums

Discussions
311 725
Messages
2 081 940
Membres
101 845
dernier inscrit
annesof