Condition de SaveAS

Sly le globe trotter

XLDnaute Occasionnel
Bonjour tout le monde,

Avec l'aide du forum, j'ai réussi à proposer une adresse et un nom de fichier à un utilisateur en fonction du contenu de ma feuille Excel. Voici le code :

Code:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

If SaveAsUI Then
    Nom = Sheets("Demande").Range("m2")
    ARangerds = Sheets("Demande").Range("g9")
    Ad = "P:\Tests\Tests laboratoire\Volants-Balles\"

    Chemin = Ad & ARangerds & "\"

    If Sheets("Demande").Range("k2") <> "" And Sheets("Demande").Range("g9") <> "" Then
        ActiveWorkbook.SaveAs Filename:=Chemin & Nom
    Else
        MsgBox ("Veuillez compléter le fichier avant d'enregistrer")
    End If
End If

End Sub

Il me reste un petit souci. Dans le code, pour proposer un nom et un dossier d'enregistrement, je vérifie si deux cellules sont vides ou non. Si elles sont vides, j'affiche un message d'erreur. Cependant, la fenêtre d'enregistrement s'ouvre tout de même !!! Comment faire pour ne pas l'afficher ???

Le problème arrive si les deux cellules sont remplies et que je souhaite annuler l'enregistrement avec le bouton "annuler" de la fenêtre... Même si je clique sur "annuler", l'enregistrement sera effectué.
D'un point de vue codage, c'est normal puisque si mes cellules sont remplies je demande l'enregistrement. Mais comment faire pour prendre en compte la commande "Annuler" si l'utilisateur ne souhaite plus enregistrer ?

J'espère avoir été clair. Merci pour votre aide !
Sylvain
 
Dernière édition:

Sly le globe trotter

XLDnaute Occasionnel
Re : Condition de SaveAS

Bonjour Sylvain, le forum,

Je viens de tenter ta méthode mais je ne suis pas sûr de comprendre... Et puis celà ne fonctionne pas comme je le souhaite.

Code:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

If SaveAsUI Then
    Nom = Sheets("Demande").Range("m2")
    ARangerds = Sheets("Demande").Range("g9")
    Ad = "P:\Tests\Tests laboratoire\Volants-Balles\"

    Chemin = Ad & ARangerds & "\"

    If Sheets("Demande").Range("k2") <> "" And Sheets("Demande").Range("g9") _
    <> "" Then
    ' Si les cellules K2 et G9 ne sont pas vides

        ' Ici, je voudrais mettre une condition pour ne pas enregistrer
         le fichier si l'utilisateur appuie sur le bouton "Annuler" dans la fenêtre 
         enregistrer sous
        If Cancel = True Then

        Else
            ActiveWorkbook.SaveAs Filename:=Chemin & Nom
        End If

    Else
        MsgBox ("Veuillez svp renseigner le demandeur et le dossier d'enregistrement")
        Cancel = True
    End If
End If

End Sub

En fait, je en voudrais pas enregistrer le fichier si l'utilisateur appuie sur le bouton "Annuler" dans la fenêtre "enregistrer sous"... Mais c'est là que çà coince.

Vous n'auriez pas un petit indice pour moi svp ?

Merci ;)
 

Sly le globe trotter

XLDnaute Occasionnel
Re : Condition de SaveAS

Bonjour Cris, le forum,

J'ai modifié un peu mon programme pour résoudre certains problèmes, mais il en reste un dernier...

Code:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

If SaveAsUI Then
    Nom = Sheets("Demande").Range("m2")
    Dem = Sheets("Demande").Range("k3")
    ARangerds = Sheets("Demande").Range("g9")
    Ad = "P:\Tests\Tests laboratoire\Volants-Balles\"

    Chemin = Ad & ARangerds & "\"

    If Sheets("Demande").Range("k2") <> "" And Sheets("Demande").Range("g9") <> "" Then
        a = MsgBox("Bonjour " & Dem & ", la demande de test va être enregistrée dans le dossier suivant " & Chemin & Nom & ". Merci de compléter le 'n° de demande' et la partie 'Commentaires'", vbOKCancel)
        If a = vbCancel Then
            Cancel = True
        Else
            ActiveWorkbook.SaveAs Filename:=Chemin & Nom
        End If
    Else
        a = MsgBox("Veuillez svp renseigner le demandeur et le dossier d'enregistrement", vbOKOnly)
        If a = vbOK Then Cancel = True
    End If
End If

End Sub

A l'éxécution de la commande
Code:
ActiveWorkbook.SaveAs Filename:=Chemin & Nom

une fenêtre "Enregistrer sous" s'ouvre avec un chemin et un nom de fichier proposé. Si je souhaite enregistrer, tout va bien. Par contre, si je clique sur "Annuler", mon fichier est tout de même enregistré... Est-il possible d'éviter celà ?

Merci pour votre aide
 

chris

XLDnaute Barbatruc
Re : Condition de SaveAS

Re
En fait je crois que c'est la logique de fonctionnement qu'il faut revoir.
l'événement before save a lieu après que l'utilisateur ait ouvert la fenêtre par saveas et donné un nom, juste avant l'écriture du fichier.
Si c'est l'utilisateur qui clique sur saveas, il faudrait
  1. vérifier si c'est bien rempli et
    • si non message + cancel
    • si oui calculer le nom et lui proposer au lieu du sien si son nom n'est pas adéquat (donc il faut récupérer cette variable nom)
    • en fonction de son choix
      • laisser la commande saveas se terminer (pas de ligne save ajoutée)
      • l'annuler et utiliser ta ligne save avec le nom
        Le problème c'est que si tu insères un saveas dans un before save tu risques de boucler.
        donc il faut trouver comment changer le nom dans le saveas en cours.
Je sais expliquer mais je ne connais pas le code.
 

Sly le globe trotter

XLDnaute Occasionnel
Re : Condition de SaveAS

Merci pour ton aide Chris.

Il me semble tout de même que l'événement BeforeSave a lieu avant que l'utilisateur ait ouvert la fenêtre par SaveAs et donné un nom.

Ce que je cherche à faire en fait, ce n'est pas enregistrer le fichier via la fonction mais c'est proposer par défaut à l'utilisateur un nom de fichier et un chemin pour l'enregistrement...

Je n'ai peut être pas besoin de passer par la commande
Code:
ActiveWorkbook.SaveAs Filename:=Chemin & Nom
mais c'est la seule solution que j'ai trouvé pour proposer un chemin et un nom...

Je suis preneur de toute solution !

Merci encore
 

chris

XLDnaute Barbatruc
Re : Condition de SaveAS

Re
Effectivement il se situe entre le clic sur saveas et l'ouverture de la fenêtre.
Un bricolage ci-joint à aménager
  • Lors du saveas test d'une variable public et changement de sa valeur(pour éviter la boucle infernale) : les conditions de ce changement est la partie à aménager selon les échanges via msgbox
  • Annulation du saveas et appel d'une sub qui enregistre sous le nom voulu et annule la variable
 

Pièces jointes

  • aaaaaa.xls
    24.5 KB · Affichages: 76
  • aaaaaa.xls
    24.5 KB · Affichages: 81
  • aaaaaa.xls
    24.5 KB · Affichages: 80

Sly le globe trotter

XLDnaute Occasionnel
Re : Condition de SaveAS

Re,
Je vais me poser de suite sur ta solution, merci pour la rapidité et la clarté de tes explications !

Sinon, est-il possible au lieu de passer par SaveAs de laisser se dérouler la fonction BeforeSave quand les conditions sont réunies tout en proposant un chemin et un nom au fichier pour l'enregistrement ?

Merci
 

chris

XLDnaute Barbatruc
Re : Condition de SaveAS

Re

le beforesave se déclenche via save ou saveas.
On peut l'intercepter pour tester l'état du fichier et si pas OK, l'annuler
On peut proposer un nom via un msgbox et là
  • l'utilisateur dit non : on laisse le déroulé, c'est lui qui finit
  • l'utilisateur dit oui : on ne peut pas remplir la dialogbox qui s'ouvre (du moins moi je ne sais pas) d'où mon idée de cancel le save en cours et de faire un autre save et donc la variable pour éviter de tourner en rond.
Je ne vois pas d'autre solution mais il y en a peut-être.
 

Discussions similaires

Statistiques des forums

Discussions
312 329
Messages
2 087 334
Membres
103 519
dernier inscrit
Thomas_grc11