Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Microsoft 365 Enregistrer via VBA sans ouvrir fichier

  • Initiateur de la discussion Initiateur de la discussion cdric78
  • Date de début Date de début

cdric78

XLDnaute Junior
Bonjour,

J'ai créer cette macro pour actualiser une autre fichier.
La macro ouvre le fichier de destination, effectue des copies de données, enregistre et ferme le fichier de destination.

Fichier Source : "Fichier Gestion.xlsm" (dans lequel se trouve la macro)
Fichier Destination : Gestion_ Teams.xlsx

Je souhaite savoir s'il est possible de réaliser les mêmes étapes sans devoir ouvrir et fermer le fichier de destination car ces actions font "clignoter" mes fichiers Excel.

VB:
Private Sub Workbook_AfterSave(ByVal Success As Boolean)
Workbooks.Open Filename:="C:\Users\CE\OneDrive - Truck\PAE\Gestion_ Teams.xlsx", _
                       UpdateLinks:=True

    Workbooks("Fichier Gestion.xlsm").Activate
    Range("D3:D500").Select
    Application.CutCopyMode = False
    Selection.Copy
    Workbooks("Gestion PAE _ Teams.xlsx").Activate
    Range("D3").Select
    Selection.PasteSpecial Paste:=xlPasteAllMergingConditionalFormats, Operation _
        :=xlNone, SkipBlanks:=False, Transpose:=False
    
    
            ActiveWorkbook.Save
    ActiveWindow.Close
    
        Workbooks("Fichier Gestion.xlsm").Activate
        Range("B1").Select
End Sub

Merci par avance
 

Nain porte quoi

XLDnaute Junior
Hello,

ça "clignote" parce que vous faites des sélections et que vous ne masquez pas les actions.
Une solution sans sélection mais qui est identique en terme de fonctionnalité (non testé)
VB:
Option Explicit

Private Sub Workbook_AfterSave(ByVal Success As Boolean)

    Const Nom_Chemin As String = "C:\Users\CE\OneDrive - Truck\PAE\"
    
    Const Fichier_Destination As String = "Gestion_ Teams.xlsx"
    Const Feuille_Destination As String = "Nom_de_la_Feuille_destination"
    
    Const Fichier_Source As String = "Fichier Gestion.xlsm"
    Const Feuille_Source As String = "Nom_de_la_Feuille_contenant_les_données_à_copier"
    
    Application.ScreenUpdating = False

    Workbooks.Open Filename:=Nom_Chemin & Fichier_Destination, UpdateLinks:=True

    Workbooks(Fichier_Source).Worksheets(Feuille_Source).Range("D3:D500").Copy
    Workbooks(Fichier_Destination).Worksheets(Feuille_Destination).Range("D3").PasteSpecial , Paste:=xlPasteAllMergingConditionalFormats

    Workbooks(Fichier_Destination).Save
    Workbooks(Fichier_Destination).Close
    
    Application.CutCopyMode = False
    Application.ScreenUpdating = True
    
End Sub
 

cdric78

XLDnaute Junior
Bonjour Nain porte quoi,

Merci beaucoup pour cette proposition qui fonctionne parfaitement.
Je dois avouer qu'étant donné mon faible niveau en VBA, j'avais en partie utilisé la fonction enregistrement.

Encore merci pour ton aide.
 

cdric78

XLDnaute Junior
Bonjour,

Suite à l'aide de @Nain porte quoi, j'ai bien avancé mais je rencontre désormais un autre problème.
Mes fichiers sont stockés sur un Sharepoint et le code VBA fonctionne pour moi mais pour mon collègue car le code point vers mon C:\.
Je me demandais s'il serait possible d'enchaîner deux fois mon code avec les chemins de chaque C:\.

Voici mon idée, mais je ne sais pas si cela peut fonctionner et surtout je ne sais pas comment écrire le code pour faire un test.
Voici à quoi cela pourrait ressembler :

VB:
VB:
Option Explicit

Private Sub Workbook_AfterSave(ByVal Success As Boolean)

'Utilisateur 1 (CE)
    Const Nom_Chemin As String = "C:\Users\CE\OneDrive - Truck\PAE\"
  
    Const Fichier_Destination As String = "Gestion_ Teams.xlsx"
    Const Feuille_Destination As String = "Nom_de_la_Feuille_destination"
  
    Const Fichier_Source As String = "Fichier Gestion.xlsm"
    Const Feuille_Source As String = "Nom_de_la_Feuille_contenant_les_données_à_copier"
  
    Application.ScreenUpdating = False

    Workbooks.Open Filename:=Nom_Chemin & Fichier_Destination, UpdateLinks:=True

    Workbooks(Fichier_Source).Worksheets(Feuille_Source).Range("D3:D500").Copy
    Workbooks(Fichier_Destination).Worksheets(Feuille_Destination).Range("D3").PasteSpecial , Paste:=xlPasteAllMergingConditionalFormats

    Workbooks(Fichier_Destination).Save
    Workbooks(Fichier_Destination).Close
  
    Application.CutCopyMode = False
    Application.ScreenUpdating = True
  
  
  
'Utilisateur 2 (BV)
    Const Nom_Chemin As String = "C:\Users\BV\OneDrive - Truck\PAE\"
  
    Const Fichier_Destination As String = "Gestion_ Teams.xlsx"
    Const Feuille_Destination As String = "Nom_de_la_Feuille_destination"
  
    Const Fichier_Source As String = "Fichier Gestion.xlsm"
    Const Feuille_Source As String = "Nom_de_la_Feuille_contenant_les_données_à_copier"
  
    Application.ScreenUpdating = False

    Workbooks.Open Filename:=Nom_Chemin & Fichier_Destination, UpdateLinks:=True

    Workbooks(Fichier_Source).Worksheets(Feuille_Source).Range("D3:D500").Copy
    Workbooks(Fichier_Destination).Worksheets(Feuille_Destination).Range("D3").PasteSpecial , Paste:=xlPasteAllMergingConditionalFormats

    Workbooks(Fichier_Destination).Save
    Workbooks(Fichier_Destination).Close
  
    Application.CutCopyMode = False
    Application.ScreenUpdating = True
  
  
End Sub

Merci par avance pour vos retours.
 

cdric78

XLDnaute Junior
Bonjour Nain porte quoi,

Merci pour cette nouvelle proposition qui me semble fonctionnelle. J'ai ajouté ce morceau de code et ça fonctionne toujours mais je n'ai pas eu la possibilité de tester sur la session de mon collègue qui est absent.
Code:
    Dim Nom_Chemin As String
    Nom_Chemin = Environ("USERPROFILE") & "\OneDrive - Truck\PAE\"

J'ai donc désormais ce code:

Code:
Private Sub Workbook_AfterSave(ByVal Success As Boolean)

    Dim Nom_Chemin As String
    Nom_Chemin = Environ("USERPROFILE") & "\OneDrive - Truck\PAE\"
  
    Const Fichier_Destination As String = "Gestion_ Teams.xlsx"
    Const Feuille_Destination As String = "Nom_de_la_Feuille_destination"
  
    Const Fichier_Source As String = "Fichier Gestion.xlsm"
    Const Feuille_Source As String = "Nom_de_la_Feuille_contenant_les_données_à_copier"
  
    Application.ScreenUpdating = False

    Workbooks.Open Filename:=Nom_Chemin & Fichier_Destination, UpdateLinks:=True

    Workbooks(Fichier_Source).Worksheets(Feuille_Source).Range("D3:D500").Copy
    Workbooks(Fichier_Destination).Worksheets(Feuille_Destination).Range("D3").PasteSpecial , Paste:=xlPasteAllMergingConditionalFormats

    Workbooks(Fichier_Destination).Save
    Workbooks(Fichier_Destination).Close
  
    Application.CutCopyMode = False
    Application.ScreenUpdating = True
  
End Sub

Je viens de constater un autre problème concernant la copie de la colonne D (Range("D3 : 500") qui ne fonctionne pas si le fichier de destination n'est pas ouvert.

En théorie la VBA est lancée à l'enregistrement du fichier source. La VBA est doit ouvrir le fichier de destination, copie les données (données avec lien hypertexte), enregistré et fermé le fichier de destination.

En l'état si les deux fichiers sont ouverts, alors la VBA fonctionne et fini mettre les données à jours puis par fermé le fichier de destination.
Vois-tu un problème qui pourrait expliquer cela dans le code car je ne vois pas où est le problème.

Sachant que que je passe par cette VBA pour copier les datas qui sont des lien hypertexte étant que je n'arrive pas à copier les liens hypertexte via de la référence circulaire.

Merci par avance.
 
Dernière édition:

Nain porte quoi

XLDnaute Junior
la copie de la colonne D (Range("D3 : 500") qui ne fonctionne pas si le fichier de destination n'est pas ouvert.
Heum, je me suis basé strictement sur votre code et pour moi le fichier EST ouvert car vous utilisez Workbooks("Fichier Gestion.xlsm").Activate

En théorie la VBA est lancée à l'enregistrement du fichier source.
ben en fait, vu que vous utilisez Workbook_AfterSave je pensais que le fichier source (Fichier Gestion.xlsm) n'était pas celui ci car sinon Workbooks("Fichier Gestion.xlsm").Activate ne peut pas fonctionner
Il aurait fallut utiliser Workbook_BeforeSave au lieu de Workbook_AfterSave si le fichier source est celui qui contient ce code

Vois-tu un problème qui pourrait expliquer cela dans le code car je ne vois pas où est le problème.
C'est quoi le problème concrètement ?
N'oubliez pas que je ne vois pas par dessus votre épaule, que je ne connais pas votre job ni votre environnement de travail ni etc etc

Sachant que que je passe par cette VBA pour copier les datas qui sont des lien hypertexte étant que je n'arrive pas à copier les liens hypertexte via de la référence circulaire.
Alors là désolé, je ne comprend pas la phrase
 

Discussions similaires

Réponses
9
Affichages
539
  • Question Question
Microsoft 365 Formules
Réponses
2
Affichages
642
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…