2017-10-20 20 views
1

EDIT: Je l'ai trouvé moi-même. Je me sens plutôt bête, mais remplacer "Exit Sub" par "End" fonctionne parfaitement. Contexte: J'ai un Sub qui utilise la fonction "Call" pour exécuter plusieurs sous-sous-réseaux dans un Sub (voir Code # 1 ci-dessous).xlDialogSaveAs - Termine le code ALL si "cancel" est sélectionné

Option Explicit 

Sub MIUL_Run_All() 

Dim StartTime As Double 
Dim SecondsElapsed As String 

'Remember time when macro starts 
    StartTime = Timer 

Call OptimizeCode_Begin 

Call Format_MIUL 
Call Custom_Sort_MIUL 
Call Insert_Process_List 
Call Format_Process_List 

Call OptimizeCode_End 

'Determine how many seconds code took to run 
    SecondsElapsed = Format((Timer - StartTime)/86400, "ss") 

'Notify user in seconds 
    MsgBox "This code ran successfully in " & SecondsElapsed & " seconds", vbInformation 

End Sub 

Mon premier code qui est appelé, « Format_MIUL », invite l'utilisateur à enregistrer le fichier, en utilisant la ligne de code suivante (voir code 2 ci-dessous). Ce code fonctionne, mais le problème est que si l'utilisateur appuie sur le bouton "Annuler", le reste du code appelé dans le sous-code principal (Code # 1 ci-dessus) continuera à fonctionner. Je veux que tout le code s'arrête si l'utilisateur appuie sur le bouton d'annulation. Je n'arrive pas à comprendre comment faire ça.

'Save file as .xlsm 
MsgBox "  Save as Excel Workbook (.xlsx)!" 
Dim userResponse As Boolean 

On Error Resume Next 
userResponse = Application.Dialogs(xlDialogSaveAs).Show(, 51) 
On Error GoTo 0 
If userResponse = False Then 
Exit Sub 
Else 
End If 

Toute aide est grandement appréciée.

+0

Je me sens plutôt bête, mais remplacer "Exit Sub" par "End" fonctionne parfaitement. – CC268

+0

S'il vous plaît écrivez une réponse à votre question afin que d'autres puissent trouver une solution à des problèmes similaires – Maldred

+1

Neater est de convertir Format_MIUL à une fonction qui retourne VRAI lorsqu'il est sauvegardé et Faux quand vous ne l'appelez pas: Si Format_Miu Alors 'Other appels Fin Si – jkpieterse

Répondre

2

Le mot-clé Call est obsolète depuis 20 ans, vous pouvez le supprimer.

Le mot-clé End sera effectivement fin exécution, mais il est à peu près un gros bouton rouge « auto-destruction » que vous avez besoin d'utiliser efficacement jamais, étant donné le code correctement structuré. Il semblerait que Format_MIUL est une procédure Sub. Faire un Function et retour une valeur Boolean qui indique à l'appelant que ce soit autorisé à poursuivre, ou si le reste des opérations devrait être annulée:

Private Function Format_MUIL() As Boolean 
    '... 
    'Save file as .xlsm 
    MsgBox "  Save as Excel Workbook (.xlsx)!" 
    Dim userResponse As Boolean 

    On Error Resume Next 
    userResponse = Application.Dialogs(xlDialogSaveAs).Show(, 51) 
    On Error GoTo 0 

    'return False if userResponse isn't a filename, True otherwise: 
    Format_MUIL = Not VarType(userResponse) = vbBoolean 
End Function 

Et maintenant, au lieu de cela:

Call Format_MIUL 

L'appelant peut le faire:

If Not Format_MIUL Then Exit Sub 

Et voilà, sortie gracieuse sans boutons d'autodestruction enfoncés.

+0

Intéressant ... Je ne fais pas beaucoup de VBA, ce code n'est pas vraiment nécessaire juste un outil agréable pour les autres utilisateurs ici, donc ma connaissance du code correctement structuré est assez limité. Il n'est pas vraiment clair pour moi comment je remplacerais tous mes mots-clés "Call" avec des fonctions cependant. Pas tous les Sub ont un dialogue comme celui-ci. Aussi, où pourrais-je mettre le "Format MIUL = Non VarType ... dans mon code format MIUL? – CC268

+0

@ CC268 bien, comme vous pouvez le voir, ce n'est pas dur du tout! FWIW vous pouvez en apprendre beaucoup plus et améliorer votre codage et connaissance avec [Rubberduck] (http://rubberduckvba.com), un projet open-source VBIDE que je gère.Il peut aussi réparer votre [absence de] indentation dans l'ensemble du projet en deux petits clics, et vous avertir bugs potentiels, constructions obsolètes, et autres problèmes de qualité de code –

+0

Je n'ai pas dit "remplacer les mots-clés' Call' par des fonctions ", j'ai ajouté * supprimer les mots-clés' Call' * - ils sont redondants. 'Call DoSomething' est exactement la même chose que juste "DoSomething".Et oui, 'Format_MIUL = ...' va dans la fonction 'Format_MIUL' ** ** - c'est ainsi que vous définissez la valeur de retour d'une fonction dans VBA, en assignant à son identifiant. –