Salutation à tous.
A l'aide d'un script Batch, du planificateur de tâche de Windows 10, des formules excel et un peu de VBA, j'ai réussi, tant bien que mal et malgré ma faible connaissance, à automatiser une de mes tâches quotidiennes au boulot.
Voici le détails de ce qu'ils exécutent ensemble:
1- Le planificateur de tâche de Windows lance le fichier bat contenant les scripts batch chaque matin car je n'éteints pas mon ordinateur au bureau;
2- Un des scripts Batch copie un fichier depuis un dossier partage en réseau du client de mon entreprise dans un dossier local pour que la macro puisse l'intégrer en tant que pièce jointe du mail outlook en finalité (je ne sais pas pourquoi mais je ne peux rajouter la PJ par les codes vba directement à partir de l'adresse du fichier dans le partage d'où la nature de ce script);
3- Un autre script dans le même fichier bat fait attendre 30 seconde puis après vide le presse papier Windows;
4- Le script lance finalement mon fichier excel qui a un Private Sub Workbook_Open qui lance une suite de macro;
5- Les macros se résument ainsi en 3 étapes:
With Application.Worksheets("Mon Sheet")
Set plage = .Range("B6:E9")
plage.CopyPicture
Avec un message d'erreur 1004 indiquant que le presse papier ne peut être vidé car une autre application est en train de l'utiliser quand je verrouille mon PC alors que quand je ne le verrouille pas, cela fonctionne normalement. A préciser que j'ai besoin que ce code se lance automatiquement tôt tous les matins d'où l'utilisation du planificateur de tâche Windows. J'ai déjà mis une ligne de code Application.CutCopyMode = False avant le le bloque with cité dessus et j'appel même une fonction utilisant les API Windows pour libérer le presse papier avant ce code Application.CutCopyMode qui est la suivante:
Option Explicit
Public Declare PtrSafe Function OuvrirPressPapiers Lib "user32" Alias "OpenClipboard" (ByVal hwnd As Long) As Long
Public Declare PtrSafe Function ViderPressPapiers Lib "user32" Alias "EmptyClipboard" () As Long
Public Declare PtrSafe Function FermerPressPapiers Lib "user32" Alias "CloseClipboard" () As Long
Public Function NettoyerPressPapiers()
OuvrirPressPapiers (0&)
ViderPressPapiers
FermerPressPapiers
End Function
Le problème reste le même pourtant si je lance le tout en laissant ma session ouverte, tout est OK. J'ai tenté de comprendre la raison du pourquoi en déboguant le code et quand j'exécute la ligne de code, elle s'exécute parfaitement. C'est à n'y rien comprendre.
S'il vous plait, si quelqu'un pouvait m'aider ce serait génial.
J'espère que je n'ai pas rédigé quelques choses de trop long pour que vous ne lisez pas jusqu'à la fin.
Merci à ceux qui vont répondre.
A l'aide d'un script Batch, du planificateur de tâche de Windows 10, des formules excel et un peu de VBA, j'ai réussi, tant bien que mal et malgré ma faible connaissance, à automatiser une de mes tâches quotidiennes au boulot.
Voici le détails de ce qu'ils exécutent ensemble:
1- Le planificateur de tâche de Windows lance le fichier bat contenant les scripts batch chaque matin car je n'éteints pas mon ordinateur au bureau;
2- Un des scripts Batch copie un fichier depuis un dossier partage en réseau du client de mon entreprise dans un dossier local pour que la macro puisse l'intégrer en tant que pièce jointe du mail outlook en finalité (je ne sais pas pourquoi mais je ne peux rajouter la PJ par les codes vba directement à partir de l'adresse du fichier dans le partage d'où la nature de ce script);
3- Un autre script dans le même fichier bat fait attendre 30 seconde puis après vide le presse papier Windows;
4- Le script lance finalement mon fichier excel qui a un Private Sub Workbook_Open qui lance une suite de macro;
5- Les macros se résument ainsi en 3 étapes:
- Elle actualise un TCD issu d'un cube Olap qui met à jours les données de plusieurs tableaux reliés par des formules excel intervenant par la formule aujourd'hui()-1 pour récupérer les données de la veille depuis le TCD;
- Puis il copie les tableaux en format image et les colle dans un onglet nommé "Export" préconçu pour éditer un mail outlook;
- Puis il reprend toutes les informations de l'onglet "Export" (destinataire, copie du mail, le corps du mail avec les formats image et les textes de contenu) pour rédiger et envoyer directement le mail.
With Application.Worksheets("Mon Sheet")
Set plage = .Range("B6:E9")
plage.CopyPicture
Avec un message d'erreur 1004 indiquant que le presse papier ne peut être vidé car une autre application est en train de l'utiliser quand je verrouille mon PC alors que quand je ne le verrouille pas, cela fonctionne normalement. A préciser que j'ai besoin que ce code se lance automatiquement tôt tous les matins d'où l'utilisation du planificateur de tâche Windows. J'ai déjà mis une ligne de code Application.CutCopyMode = False avant le le bloque with cité dessus et j'appel même une fonction utilisant les API Windows pour libérer le presse papier avant ce code Application.CutCopyMode qui est la suivante:
Option Explicit
Public Declare PtrSafe Function OuvrirPressPapiers Lib "user32" Alias "OpenClipboard" (ByVal hwnd As Long) As Long
Public Declare PtrSafe Function ViderPressPapiers Lib "user32" Alias "EmptyClipboard" () As Long
Public Declare PtrSafe Function FermerPressPapiers Lib "user32" Alias "CloseClipboard" () As Long
Public Function NettoyerPressPapiers()
OuvrirPressPapiers (0&)
ViderPressPapiers
FermerPressPapiers
End Function
Le problème reste le même pourtant si je lance le tout en laissant ma session ouverte, tout est OK. J'ai tenté de comprendre la raison du pourquoi en déboguant le code et quand j'exécute la ligne de code, elle s'exécute parfaitement. C'est à n'y rien comprendre.
S'il vous plait, si quelqu'un pouvait m'aider ce serait génial.
J'espère que je n'ai pas rédigé quelques choses de trop long pour que vous ne lisez pas jusqu'à la fin.
Merci à ceux qui vont répondre.
Dernière édition: