Forcer à oui la question de confirmation pour l' enregistrement [Résolu]

Signaler
Messages postés
291
Date d'inscription
samedi 1 octobre 2005
Statut
Membre
Dernière intervention
14 février 2021
-
Messages postés
291
Date d'inscription
samedi 1 octobre 2005
Statut
Membre
Dernière intervention
14 février 2021
-
Bonjour,

J'ai enregistrer le déclenchement d'une macro dans le Planificateur des tâches, qui lance la mise à jour à partir d'une macro "Echéance" tous les 3 de chaque mois.
Je génère aussi l'enregistrement de mon fichier sur le C:\temp et une sauvegarde sur le E:\.
Mais je souhaite que l'utilisateur ne soit pas sollicité au cours de la macro, et donc que lors de l'affichage de la boîte : Confirmer l'enregistrement : Le fichier existe déjà, voulez vous le remplacer, "oui" ou "non", ce soit forcer à OUI.
J'ai trouvé 2 lignes de code qui semble correspondre à mon souhait, mais cela fonctionne pour mon 1er enregistrement sur le C:\, mais pour ma sauvegarde sur le E:\ l'enregistrement ne se fait pas !!!

Je précise que je suis assez débutant et que j'utilise bcp l'enregistreur de macro et les inspirations dans les forums, mais là je ne vois pas mon erreur.
Merci pour vôtre aide

Voici le code :

Private Sub Workbook_Open()

    Sheets("Echéance").Select    'Feuille à sélectionner
    If Range("E1").Value = Date Then
    Call Echéance    'Macro à exécuter
    End If
    Sheets("Compta").Select
End Sub

Sub Enregist_C_et_E()
'
' Enregist_C_et_E Macro

    Sheets("Compta").Select
    Range("A3").Select
    
    Sheets("Echéance").Select
    ActiveSheet.Unprotect Password:="1447"
    Range("A1").Select
    With Selection.Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .Color = 13434879
        .TintAndShade = 0
        .PatternTintAndShade = 0
    End With
    
    ActiveSheet.protect DrawingObjects:=True, Contents:=True, Scenarios:=True, Password:="1447"
    Sheets("Compta").Select
    Range("A4").Select
    Range("A4").End(xlDown).Offset(1, 0).Select
    
    ActiveWorkbook.Saved = True
    
    ChDir "C:\temp"
    Application.DisplayAlerts = False
    ActiveWorkbook.SaveAs Filename:="Compta_Raymond.xlsm"
    ' Ecrasement fichier existant.xls'
    Application.DisplayAlerts = True
    'Remettre absolument ensuite
    
    ChDir "E:\A_Perso_10.09.19\Banque\Compta"
    Application.DisplayAlerts = False
    ActiveWorkbook.SaveAs Filename:="Compta_Raymond.xlsm"
    ' Ecrasement fichier existant.xls'
    Application.DisplayAlerts = True 'Remettre absolument ensuite
    
    
    Application.Quit
    
End Sub



Configuration: Windows / Chrome 88.0.4324.150

6 réponses

Messages postés
14525
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
8 mars 2021
810
bonjour,
à ta place, j'essaierais plutôt d'utiliser ConflictResolution.
Messages postés
14525
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
8 mars 2021
810
par ailleurs, je suis surpris de ton utilisation de
chdir
, la technique habituelle est de préciser le nom complet:
ActiveWorkbook.SaveAs Filename:="E:\A_Perso_10.09.19\Banque\Compta\Compta_Raymond.xlsm"
Messages postés
320
Date d'inscription
samedi 7 novembre 2020
Statut
Membre
Dernière intervention
8 mars 2021
68
Bonjour,
Pour compléter la remarque de yg_be qui devrait résoudre le problème (indiquer le chemin complet plutôt que ChDir, il faut noter que cette commande fonctionne comme sous DOS : L’instruction ChDir modifie le répertoire ou le dossier par défaut, mais ne modifie pas le lecteur par défaut. Une autre instruction, ChDrive, modifie le lecteur par défaut.

Voir : https://docs.microsoft.com/fr-fr/office/vba/language/reference/user-interface-help/chdir-statement

Donc pour faire court, il faudrait faire chdrive "E" en plus du chdir...

L'une des 2 solutions de yg_be est donc plus "élégante" pour résoudre le problème.
Messages postés
291
Date d'inscription
samedi 1 octobre 2005
Statut
Membre
Dernière intervention
14 février 2021

Merci à tous les deux pour vos réponses,
Mais je suis désolé, mais vous ne m'aidez pas beaucoup, je vous rappelle que le code n'est pas de moi mais celui généré par l'enregistreur.
Je ne suis donc pas sûr de comprendre vos explications, et vous ne me dîtes pas pourquoi l'enregistrement se fait bien pour le lecteur C:\ et pas pour le lecteur E:\
Si je comprend bien je devrais regrouper le chemin en une seule ligne comme indiqué par yg_be !
Je ne comprends pas l'utilisation de ConflictResolution.
S'il vous plait, pourriez vous être plus explicite et plus clair pour un débutant

Milles excuses, j'ai fait un test avant l'envoi et il semblerait ben que cela fonctionne...
Voila le code modifié :

Sub Enregist_C_et_E()
'
' Enregist_C_et_E Macro

    Sheets("Compta").Select
    Range("A3").Select
    
    Sheets("Echéance").Select
    ActiveSheet.Unprotect Password:="1447"
    Range("A1").Select
    With Selection.Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .Color = 13434879
        .TintAndShade = 0
        .PatternTintAndShade = 0
    End With
    
    ActiveSheet.protect DrawingObjects:=True, Contents:=True, Scenarios:=True, Password:="1447"
    Sheets("Compta").Select
    Range("A4").Select
    Range("A4").End(xlDown).Offset(1, 0).Select
    
    ActiveWorkbook.Saved = True
    
    ChDir "C:\temp"
    Application.DisplayAlerts = False
    ActiveWorkbook.SaveAs Filename:="Compta_Raymond.xlsm"
    ' Ecrasement fichier existant.xls'
    Application.DisplayAlerts = True
    'Remettre absolument ensuite
    
    'ChDir "E:\A_Perso_10.09.19\Banque\Compta"
    Application.DisplayAlerts = False
    ActiveWorkbook.SaveAs Filename:="E:\A_Perso_10.09.19\Banque\Compta\Compta_Raymond.xlsm"
    'ActiveWorkbook.SaveAs Filename:="Compta_Raymond.xlsm"
    ' Ecrasement fichier existant.xls'
    Application.DisplayAlerts = True 'Remettre absolument ensuite
    
    
    Application.Quit
    
End Sub
Messages postés
14525
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
8 mars 2021
810
un exemple d'utilisation de conflictresolution:
ActiveWorkbook.SaveAs _
    Filename:="C:\temp\Compta_Raymond.xlsm", _
    ConflictResolution:=xlLocalSessionChanges

cela me semble préférable à la manipulation de Application.DisplayAlerts.
Messages postés
320
Date d'inscription
samedi 7 novembre 2020
Statut
Membre
Dernière intervention
8 mars 2021
68
Bonjour,
Ca fonctionne donc maintenant parce que l'enregistrement sur "E" indique explicitement le chemin complet vers le fichier. Il n'y a pas d'alerte puisque la ligne "Application.DisplayAlerts = False" désactive la boite de dialogue le temps de l'enregistrement (on remet à true après).

Pourquoi ça ne marchait pas avant ? Parce que par défaut, on est sur le disque "C". quand on fait ChDir "E:\A_Perso_10.09.19\Banque\Compta" on ne change pas de disque ET en réalité, on reste sur "C". donc en faisant ensuite ActiveWorkbook.SaveAs Filename:="Compta_Raymond.xlsm", ça bogue !

Pour mieux comprendre, faites un test dans une console dos et tapez ce qui est en gras ci-dessous avant de valider avec Entrée:
1. chdir -> ChDir sans paramètre affiche le nom du répertoire en cours (dir affiche en plus la liste des fichiers)
2. ChDir "E:\A_Perso_10.09.19\Banque\Compta" -> Rien ne semble se passer
3. chdir -> affiche la même chose qu'en 1
4. E: -> vous amène dans le répertoire tapé en 2 (soit ChDrive "E" en VBA)

Donc dans votre programme c'est comme si vous étiez dans le batiment C et que vous vous contentier de regarder vers le batiment E en face. Pour aller mettre une lettre dans l'immeuble E; il vous faut descendre et traverser la rue ! D'ou la commande ChDrive que j'indiquais.
Il aurait donc fallut écrire dans votre programme un ChDrive en plus:
ChDir "E:\A_Perso_10.09.19\Banque\Compta"
    ChDrive "E"
    Application.DisplayAlerts = False
    ActiveWorkbook.SaveAs Filename:="Compta_Raymond.xlsm"
    ' Ecrasement fichier existant.xls'
    Application.DisplayAlerts = True 'Remettre absolument ensuite


La solution de yg_be évite de charger de disque sans arrêt et d'envoyer le fichier au bon endroit sans devoir traverser la rue à chaque fois : de la téléportation en quelque sorte !

PS ConflictResolution. permettrait de remplacer les displayAlerts qu'on place à false puis true mais sans modifier votre saveAs, ça n'aurait rien changé au problème de fond pour l'enregistrement en E.
Messages postés
291
Date d'inscription
samedi 1 octobre 2005
Statut
Membre
Dernière intervention
14 février 2021

Bonjour Roma,
Merci pour tes explications claires et concises, tes exemples me parlent bien ... maintenant je comprends mon erreur.

Pour terminer je peux donc aussi remplacer le code :

<code basic>ChDir "C:\temp"
    Application.DisplayAlerts = False
    ActiveWorkbook.SaveAs Filename:="Compta_Raymond.xlsm"
    ' Ecrasement fichier existant.xls'
    Application.DisplayAlerts = True
    'Remettre absolument ensuite

par

 Application.DisplayAlerts = False  
 ActiveWorkbook.SaveAs  Filename:="C:\temp\Compta_Raymond.xlsm"
 Application.DisplayAlerts = True

</code>
Messages postés
14525
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
8 mars 2021
810 >
Messages postés
291
Date d'inscription
samedi 1 octobre 2005
Statut
Membre
Dernière intervention
14 février 2021

je t'ai induit en erreur, il faut bien utiliser
Application.DisplayAlerts
.
Messages postés
291
Date d'inscription
samedi 1 octobre 2005
Statut
Membre
Dernière intervention
14 février 2021
>
Messages postés
14525
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
8 mars 2021

Pas de problème, ça n'arrive qu'a ceux qui s'activent ...
Du coup je code comme ceci :

ActiveWorkbook.Saved = True
    
    Application.DisplayAlerts = False
    ActiveWorkbook.SaveAs _
    Filename:="C:\temp\Compta_Raymond.xlsm", _
    ConflictResolution:=xlLocalSessionChanges
    Application.DisplayAlerts = True
    
    Application.DisplayAlerts = False
    ActiveWorkbook.SaveAs _
    Filename:="E:\A_Perso_10.09.19\Banque\Compta\Compta_Raymond.xlsm", _
    ConflictResolution:=xlLocalSessionChanges
    Application.DisplayAlerts = True
    
    Application.Quit    
Messages postés
291
Date d'inscription
samedi 1 octobre 2005
Statut
Membre
Dernière intervention
14 février 2021
>
Messages postés
14525
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
8 mars 2021

Et si j'ai bien compris, le code ConflictResolution:=xlLocalSessionChanges sert à donner l'autorisation de changer de lecteur !!!
Messages postés
14525
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
8 mars 2021
810 >
Messages postés
291
Date d'inscription
samedi 1 octobre 2005
Statut
Membre
Dernière intervention
14 février 2021

je pense qu'il sert pour un fichier Excel partagé par plusieurs, ce qui n'est pas ton cas.
Messages postés
291
Date d'inscription
samedi 1 octobre 2005
Statut
Membre
Dernière intervention
14 février 2021
>
Messages postés
14525
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
8 mars 2021

OK, j'ai retesté la macro tout fonctionne maintenant
Encore merci à toi
Messages postés
320
Date d'inscription
samedi 7 novembre 2020
Statut
Membre
Dernière intervention
8 mars 2021
68
Je me demande quel est l'intérêt pratique de faire une sauvegarde dans le dossier C:\temp ET dans le dossier sur "E" ? Ces doublons sont volontaires ?