IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

instruction SaveAs : plantage de l'application lorsque le fichier est créé


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2007
    Messages : 3
    Par défaut instruction SaveAs : plantage de l'application lorsque le fichier est créé
    Bonjour à tous.

    Voilà quelques jours que je recherche une solution pour un problème VBA sous Excel.

    Je tente une macro d’enregistrement contrôlé du fichier. Soit la désactivation de la boîte de dialogue « enregistrer sous » et, par simple appel de la commande « enregistrer », l’enregistrement sous un nom prédéfini par la macro ou une variable (valeur d’une cellule). Basiquement, mon texte est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
     
    Dim NomFichier As String
     
    Cancel = False
     
    If SaveAsUI Then
        MsgBox ("Vous ne disposez pas des autorisations nécessaires à l'enregistrement du fichier sous un autre nom. Opération annulée.")
        Exit Sub
    End If
     
    Application.DisplayAlerts = False
     
    ActiveWorkbook.SaveAs Filename:="2310Bibi.xls"
    Application.ThisWorkbook.Saved = True
     
    Application.DisplayAlerts = True
     
    End Sub
    L’affichage de la boîte de dialogue est bien supprimé. L’enregistrement se fait bel et bien. Si le fichier existe déjà, Excel redonne la main après l’enregistrement, mais si l’enregistrement a pour conséquence la création d’un nouveau fichier, Excel plante avant de redonner la main. Ainsi, le fichier est bien disponible, mais par le redémarrage d’Excel et la fonction de récupération automatique intégrée à l’application.

    Ceci sur mon environnement personnel, soit Vista sous administrateur avec Office 2003, celui de mon amie soit XP avec accès administrateur et Office 2003, ou au travail avec XP Prof’, accès utilisateur et Office 2003. Ce qui m’en vient à penser que le problème ne vient pas de l’accès de fichier. Pourtant…

    Pourtant oui, malgré l’épuration et la manipulation du code (activation ou désactivation des messages d’alertes, utilisation d’un nom de fichier prédéfini ou d’une variable de type String, précision ou non de l’extension, l’emploi d’un nom de fichier complet avec chemin ou non, le formatage de la fonction SaveAs avec les paramètres facultatifs [format, backup, alertes] et variations de ces paramètres), le problème subsiste. Et ce sur mon fichier premier, travaillé, protégé, comme sur un fichier neuf ne contenant que ce code. Ce qui me fait penser à un bogue de l’application, mais l’aide VBA, plusieurs jours sur les forums et le site de support microsoft en ligne ne m’ont rien appris. Il semble que je sois seul à avoir ce problème.

    Le niveau de sécurité des macros ne semble pas non plus en cause. De même pour l’antivirus, activé ou non.

    Cela vous dit-il quelque chose ?
    Par avance merci de votre aide.

  2. #2
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Par défaut
    Bonsoir,
    Quand tu sauve le classeur sous... C'est ce classeur qui est actif, si dans les initialisation tu fait référence au nom du classeur il ne les retrouve plus.

    Pour bien faire tu doit fermer le classeur que tu vient de sauver et réouvrir l'ancien, ou réinitialiser avec les macros d'ouverture pour que ça concorde.
    A+

  3. #3
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    514
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 514
    Par défaut
    Bonsoir,

    Il me semble que tu emploie l'argument Cancel à l'envers, essaye comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
        If SaveAsUI Then
            'La procedure a ete lance par la commande Enregistrer sous
            MsgBox ("Vous ne disposez pas des autorisations nécessaires à _ l'enregistrement du fichier sous un autre nom. Opération annulée.")
        Else
            'La procedure a ete lance par la commande Enregistrer
            'Tes instructions d'enregistrement
        End If
        Cancel = True 'Evite qu'excel enregistre le fichier a nouveau
    End Sub
    Cordialement,

    Tirex28/

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2007
    Messages : 3
    Par défaut
    Bonjour Messieurs,

    et merci d'avoir porté votre attention sur mon problème. J'avais bien des solutions telles que proposées dans vos pistes, mais il y manquait quelque chose. Ce soir j'ai [enfin] résolu le problème.

    Comme je le précisais, l'évènement Before_Save n'est, comme son nom l'indique, qu'une instruction PRECEDANT l'enregistrement du fichier. Toute instruction d'enregistrement (fonction-utilisateur intégrée, code) appelle une nouvelle occurence de l'évènement Before_Save.

    Faire appel à une instruction Save ou SaveAs dans l'évènement Before_Save revient donc à rappeler le dit évènement. Comment le gérer ? En attribuant une variable à laquelle le code va se conditionner pour la suite à donner.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    Public NomFichier As String
    Public Compteur As Integer
     
    Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
     
    'Interception de l'instruction intégrée "EnregistrerSous" et annulation
    If SaveAsUI Then
        MsgBox ("Vous ne disposez pas des autorisations nécessaires à l'enregistrement du fichier sous un autre nom. Opération annulée.")
        Cancel = True
        Exit Sub
    End If
     
    If Compteur = 1 Then
        '2e occurence de Before_Save.
        'report de la lecture du code à la balise...
        GoTo Balise_FinEtLaisserExcelEnregistrer
        Else
        '1ère occurence de Before_Save.
        'incrémente la valeur de Before_Save en vue de la 2e occurence.
        Compteur = 1
        'désactive l'affichage des alertes à l'enregistrement. Notamment la confirmation d'écrasement de fichier.
        Application.DisplayAlerts = False
        NomFichier = InputBox("Insérez le nom de fichier désiré")
        'Demande l'enregistrement du fichier sous la variable définie par l'utilisateur. Ouvre une nouvelle occurence de Before_Save.
        ActiveWorkbook.SaveAs Filename:=NomFichier & ".xls", AddToMru:=True
        'considère les modifications apportées dans le fichier ouvert comme sauvegardées.
        Application.ThisWorkbook.Saved = True
        'réactive l'affichage des alertes à l'enregistrement. Notamment la confirmation d'écrasement de fichier.
        Application.DisplayAlerts = True
        'annule la 1ère occurence de Before_save, et donc la sauvegarde
        Cancel = True
    End If
     
    'la 2e occurence de Before_Save se reporte ici
    Balise_FinEtLaisserExcelEnregistrer:
    'remise à zéro de la variable.
    Compteur = 0
     
    'la 2e occurence de l'évènement Before_save est terminée. Excel peut-maintenant formellement sauver.
    End Sub
    1ère occurence de l'évènement Before_Save. La variable est simplement créée ; elle n'a donc pas de valeur attribuée. Par conséquent, au conditionnement 'if', le code va s'embrancher sur 'Else'. Soit modification de la variable en vue de la prochaine occurence et sauvegarde. Dite sauvegarde ouvrira une 2e occurence de Before_save, en parallèle, pendant que la 1ère occurence se mourra par un Cancel=True.

    A la 2e occurence de Before_Save, au conditionnement 'if', le code va s'embrancher sur 'Then' et, de là, se reporter à une balise en fin de procédure. En fin de procédure, plus rien à faire : Excel enregistre le fichier.

    Bonne soirée,
    Olivier

  5. #5
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    514
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 514
    Par défaut
    Bonsoir,

    Faire appel à une instruction Save ou SaveAs dans l'évènement Before_Save revient donc à rappeler le dit évènement. Comment le gérer ? En attribuant une variable à laquelle le code va se conditionner pour la suite à donner.
    S'il s'agit uniquement d'éviter qu'une procédure évènementielle ne puisse s'appeler elle-même on peut faire comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
        Application.EnableEvents = False
        'Instructions
        Application.EnableEvents = True
    End Sub
    Cordialement,

    Tirex28/

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2007
    Messages : 3
    Par défaut
    Merci IN-FI-NI-MENT ! Ce n'est pas une semaine sans de nouvelles découvertes d'intérêt !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Batch] le script bloque lorsque le fichier est copié (1 fichier copié)
    Par veven dans le forum Scripts/Batch
    Réponses: 8
    Dernier message: 12/03/2015, 22h45
  2. Erreur lorsque le fichier est lourd
    Par momjunior dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 23/01/2015, 14h21
  3. événement lorsqu'un fichier est ouvert.
    Par minirop dans le forum Windows
    Réponses: 2
    Dernier message: 01/08/2011, 21h04
  4. Que faire lorsque le fichier est vide?
    Par bsangoku dans le forum Débuter
    Réponses: 6
    Dernier message: 18/01/2010, 13h46
  5. Une msgBox lorsque le fichier est en lecture seule..
    Par ncazanav dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 26/01/2008, 12h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo