Forcer à oui la question de confirmation pour l' enregistrement

Résolu/Fermé
Ramon1 Messages postés 330 Date d'inscription samedi 1 octobre 2005 Statut Membre Dernière intervention 10 août 2023 - 12 févr. 2021 à 15:03
Ramon1 Messages postés 330 Date d'inscription samedi 1 octobre 2005 Statut Membre Dernière intervention 10 août 2023 - 14 févr. 2021 à 16:54
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
A voir également:

6 réponses

yg_be Messages postés 22717 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 22 avril 2024 1 476
12 févr. 2021 à 19:52
bonjour,
à ta place, j'essaierais plutôt d'utiliser ConflictResolution.
0
yg_be Messages postés 22717 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 22 avril 2024 1 476
12 févr. 2021 à 19:56
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"
0
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.
0
Ramon1 Messages postés 330 Date d'inscription samedi 1 octobre 2005 Statut Membre Dernière intervention 10 août 2023
12 févr. 2021 à 23:38
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
0
yg_be Messages postés 22717 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 22 avril 2024 1 476
13 févr. 2021 à 10:47
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.
0
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Ramon1 Messages postés 330 Date d'inscription samedi 1 octobre 2005 Statut Membre Dernière intervention 10 août 2023
13 févr. 2021 à 09:13
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>
0
Utilisateur anonyme
13 févr. 2021 à 09:58
OUI. Ce sera mieux ainsi même si ça fonctionne bien pour l'instant : ça évitera qu'un ChDrive ajouté par la suite génère un bogue dans cette procédure !
0
Ramon1 Messages postés 330 Date d'inscription samedi 1 octobre 2005 Statut Membre Dernière intervention 10 août 2023 > Utilisateur anonyme
13 févr. 2021 à 12:14
Donc si j'ai bien compris, le code de conflictresolution permet aussi de ne pas afficher la fenêtre de confirmation.

Pour la sauvegarde dans C:\ et E:\ c'est un test, après je vais faire la sauvegarde sur mon disque externe bien sûr..

En fait la pratique de l'enregistreur n'est pas tjs une source sûr, mais pour des débutants comme moi, ça permet de réaliser rapidement et facilement bcp de macros.
0
yg_be Messages postés 22717 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 22 avril 2024 1 476 > Ramon1 Messages postés 330 Date d'inscription samedi 1 octobre 2005 Statut Membre Dernière intervention 10 août 2023
13 févr. 2021 à 14:51
le code de conflictresolution évite l'affichage, et permet de décider que faire en cas de conflit (fichier présent).
Application.DisplayAlerts est plus général, risque souvent de cacher de vrais problèmes.
ce que tu avais ici, puisque tu n'étais pas prévenu que le fichier n'était pas sauvé.
0
Ramon1 Messages postés 330 Date d'inscription samedi 1 octobre 2005 Statut Membre Dernière intervention 10 août 2023 > yg_be Messages postés 22717 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 22 avril 2024
13 févr. 2021 à 18:22
Merci à toi et à Roma pour votre aide, j'ai mis la question en résolu
0
Ramon1 Messages postés 330 Date d'inscription samedi 1 octobre 2005 Statut Membre Dernière intervention 10 août 2023 > yg_be Messages postés 22717 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 22 avril 2024
13 févr. 2021 à 23:43
Désolé, je reviens vers vous, j'ai donc remplacé le code comme vous me l'avez conseillé avec ConflictResolution,
l'enregistrement se fait correctement sur les 2 lecteurs, mais la boite de dialogue de demande de confirmation s'ouvre 2 fois...
Qu'est-ce que j'ai oublié ?

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
    
    ActiveWorkbook.SaveAs _
    Filename:="C:\temp\Compta_Raymond.xlsm", _
    ConflictResolution:=xlLocalSessionChanges
    
    'Application.DisplayAlerts = False
    'ActiveWorkbook.SaveAs Filename:="C:\temp\Compta_Raymond.xlsm"
    ' Ecrasement fichier existant.xls'
    'Application.DisplayAlerts = True
    'Remettre absolument ensuite
    
    ActiveWorkbook.SaveAs _
    Filename:="E:\A_Perso_10.09.19\Banque\Compta\Compta_Raymond.xlsm", _
    ConflictResolution:=xlLocalSessionChanges
    
    'Application.DisplayAlerts = False
    'ActiveWorkbook.SaveAs Filename:="E:\A_Perso_10.09.19\Banque\Compta\Compta_Raymond.xlsm"
    ' Ecrasement fichier existant.xls'
    'Application.DisplayAlerts = True
    'Remettre absolument ensuite
    
    Application.Quit
    
End Sub
0
Utilisateur anonyme
13 févr. 2021 à 10:08
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 ?
0