Partage
  • Partager sur Facebook
  • Partager sur Twitter

Batch ouverture de fichier Excel

Sujet résolu
    10 février 2022 à 9:12:09

    Bonjour à tous, je suis débutant en programmation batch et j'ai réalisé un script me permettant d'ouvrir un fichier Excel et de lancer une macro vba avec l'évènement workbook open de mon fichier Excel.

    Ce script fonctionne parfaitement sur mon poste mais en voulant le mettre sur un serveur pour le tester sur d'autre poste je me suis rendu compte que celui-ci plantait. Dans mon code, pour ouvrir le fichier Excel j'utilise la ligne de code suivante:

    "C:\Program Files (x86)\Microsoft Office\root\Office16\EXCEL.EXE" %monfichier% /e

    Il s'avère que ce code nécessite le chemin d'accès du fichier EXCEL.exe. Le problème est donc le suivant: ce chemin n'est pas le même sur tous les postes.

    Comment puis je faire pour ouvrir mon fichier Excel sans devoir spécifier l'emplacement de l'application?

    Merci de votre aide.

    • Partager sur Facebook
    • Partager sur Twitter
      10 février 2022 à 10:37:53

      Bonjour,

      Avec la commande start (start "Lancement fichier excel" "fichier.xlsm"), ça ouvrira le fichier avec l'application par défaut pour cette extension (en espérant que c'est excel) ou tenter ' start excel.exe "fichier.xlsm" '
      Sinon chercher le dossier d'installation d'excel (en recherchant un fichier comme excel.exe par exemple ; boucle for) ou encore via le registre windows (si c'est dans "HKEY_LOCAL_MACHINE", il faudra surement les droits d'admin -> https://www.actualinstaller.com/help/winword.html )

      • Partager sur Facebook
      • Partager sur Twitter
        11 février 2022 à 9:34:26

        Bonjour Zaibai,

        Merci de votre réponse et désolé pour mon retour tardif.

        La commande start lance bien mon fichier excel mais ne prend pas en compte le reste du code. J'ai toute une partie de code qui s'exécute avant l'ouverture de mon fichier excel mais l'invité de commande n'apparait que le temps d'une seconde puis le fichier excel s'ouvre mais le reste de mon code est ignoré.

        Pour la solution de la boucle for, je suis débutant dans ce langage et je ne sais donc pas utiliser cette boucle pour aller rechercher sur mon disque le fichier excel. Et pour la solution du registre windows je suis encore plus perdu.

        Aussi la boucle for risque d'être longue à s'exécuter si elle doit rechercher sur tout le disque?

        Avez vous une idée pour que je puisse utiliser la commande start, ou sinon pouvez vous m'indiquer comment utiliser la boucle for pour rechercher sur un disque?

        Merci

        • Partager sur Facebook
        • Partager sur Twitter
          11 février 2022 à 9:59:22

          Bonjour,

          Puis-je voir ton code batch ?
          As-tu essayé la commande ci-dessous ?

          start excel.exe "Lecteur:\chemin-du-fichier\fichier.xlsm"



          • Partager sur Facebook
          • Partager sur Twitter
            11 février 2022 à 11:17:51

            Oui bien sur,

            Juste pour expliquer le fonctionnement et le but avant, le but est d'archiver des dossiers en les faisant glisser sur mon fichier.bat. Celui ci va alors récupérer des informations dans le nom du dossier et les écrire dans un fichier txt qui sera supprimé à la fin. Il lance ensuite un fichier excel dans lequel une macro VBA s'exécute. Cette macro va lire les informations du fichier txt, les transposer sur une feuille et copier le dossier dans un répertoire propre à celui-ci. Le fichier se ferme ensuite et le batch se termine.

            Voici mon code:

            @echo off


            echo Repertoire: %1
            echo.Date: %Date%
            set Repertoire=%1

            SET ext=%Repertoire:~-4%
            set ext=%ext:"=%

            for /f "tokens=1,2,3 delims=\" %%a in ("%Repertoire%") do set lecteur=%%a & set Edison=%%b & set Designation=%%c
            set lecteur=%lecteur:"=%
            echo.Lecteur: %lecteur%
            echo.Edison: %Edison%
            set Commande=%Designation:~0,6%
            echo.Commande: %Commande%
            set Designation=%Designation:~+7%
            set Designation=%Designation:"=%
            if "%ext%" == "zip" set Designation=%Designation:~0,-4%
            echo.Designation: %Designation%


            echo %Repertoire% > Temp.txt
            echo. %Commande% >> Temp.txt
            echo. %Designation% >> Temp.txt
            echo. %Date% >> Temp.txt
            if "%ext%" == "zip" echo. %ext% >> Temp.txt

            ::CHANGER CHEMIN FICHIER ARCHIVE
            set monfichier= "G:\BENJAMIN\Archive Envoi client.xlsm"
            start excel.exe %monfichier% /e

            del Temp.txt

            exit
            • Partager sur Facebook
            • Partager sur Twitter
              11 février 2022 à 13:34:23

              laisse la suppression du fichier temp.txt à la macro excel  ou utilise le paramètre /WAIT de start =>

              start /WAIT excel.exe %monfichier% /e

              • Partager sur Facebook
              • Partager sur Twitter
                14 février 2022 à 10:44:54

                Parfait cela fonctionne en ajoutant WAIT.
                Merci de votre aide.
                • Partager sur Facebook
                • Partager sur Twitter
                  16 mars 2022 à 8:17:57

                  Bonjour à tous,

                  Je réouvre mon sujet après un mois car je me suis aperçu d'un problème.

                  Le batch envoyé si dessus fonctionne bien, le fichier Excel s'ouvre et ma macro vba s'exécute puis ce fichier Excel se ferme. Mais une fois l'Excel fermé le batch reprend la main et doit supprimer le fichier temp et se fermer. Le problème est que un Excel vierge avec un message d'erreur s'ouvre alors que je n'ai jamais demandé sa ni dans le batch ni dans le VBA. Ce fichier met en pause mon batch et je dois le fermer pour que mon batch se termine.

                  Quelqu'un aurait t'il une solution à ce problème? J'aimerai comprendre pourquoi ce fichier s'ouvre tout seul.

                  Merci d'avance.

                  • Partager sur Facebook
                  • Partager sur Twitter
                    16 mars 2022 à 14:54:02

                    c'est quoi le message d'erreur affiché avec ton fichier excel vierge ? ça pourrait donner une piste.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      21 mars 2022 à 11:20:58

                      Bonjour,

                      Désolé pour le temps de réponse je n'avais pas vu votre réponse.

                      Le message que j'ai est le suivant:

                      Dans mon code je lui demande seulement d'ouvrir le fichier Excel qui contient mon vba et celui s'ouvre, exécute la macro et se referme sans problème, c'est uniquement à la toute fin que lorsque le batch reprend la main que ce message apparait.

                      Comme le fichier Excel est ouvert via le batch mais fermé via le VBA le problème vient peu être de la?

                      • Partager sur Facebook
                      • Partager sur Twitter
                        21 mars 2022 à 12:08:40

                        Quand tu lance ton excel et sa macro manuellement (sans passer par le batch), tu n'as pas ce message d'erreur ? 

                        Comme c'est un message excel, il doit y avoir dans la macro, un problème d'accès à un fichier sur la fin de l'exécution. 

                        • Partager sur Facebook
                        • Partager sur Twitter
                          21 mars 2022 à 13:27:36

                          Non le fichier Excel seul ne pose pas de problème. Et dans la macro je n'accède à aucun autre fichier Excel, je me contente de récupérer les informations d'un fichier texte que je copie dans des cellules et a partir de ces informations je recrée un chemin pour copier un fichier zip dans un répertoire et supprimer ce fichier zip de son répertoire d'origine.  Puis le fichier Excel s'enregistre et l'application se ferme. L'exécution seule fonctionne parfaitement.

                          • Partager sur Facebook
                          • Partager sur Twitter
                            21 mars 2022 à 14:16:05

                            Le message peut se produire pour d'autres fichiers que des fichiers excel, tout fichier utilisé/ouvert par excel.

                            Toutes les opérations que tu décries peuvent amener à ce message d'erreur: par exemple, le zip essaie d'être copier dans le nouveau répertoire créé avant que celui-ci ne le soit vraiment ou le fichier d'origine est supprimer avant été totalement copier.

                            Peut-être rajouter quelques vérifications d'existences des dossiers/fichiers 

                            • Partager sur Facebook
                            • Partager sur Twitter
                              21 mars 2022 à 16:32:29

                              Très bien je vais me pencher la dessus demain mais cela m'étonnerai que ca résout mon problème car comme j'ai dit au dessus, la macro fonctionne sans soucis lorsque que je l'exécute sans passer par le batch.
                              • Partager sur Facebook
                              • Partager sur Twitter
                                21 mars 2022 à 22:40:49

                                Bonsoir,

                                On peut re-avoir le code en question pour voir si il y a une erreur de syntaxe par exemple ?

                                Utilise le bouton '</>', pour le poster.

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  22 mars 2022 à 7:53:19

                                  Le code batch est le même que celui posté précédemment avec juste l'ajout de la fonction WAIT pour ouvrir Excel. Et le vba est le suivant:

                                  Private Sub Workbook_Open()
                                  
                                  Application.ScreenUpdating = False
                                  
                                  'Retrouve la lettre du lecteur "autocad"
                                  Dim GestionFichier As Object
                                  Dim disque_existe As Boolean
                                  disque_existe = False
                                  Set GestionFichier = CreateObject("Scripting.FileSystemObject")
                                  Dim Lecteur As Object
                                  Dim Lecteur_DRAFTER As String
                                      
                                  'Boucle sur tous les lecteurs réseau
                                  For Each Lecteur In GestionFichier.drives
                                      If Lecteur.IsReady = True Then  'Test si le lecteur est prêt
                                          If Lecteur.VolumeName Like "*autocad*" Then   'Test sur le nom du lecteur
                                              disque_existe = True
                                              Lecteur_DRAFTER = Lecteur.Path
                                              Exit For
                                          End If
                                      End If
                                  Next
                                  If disque_existe = False Then
                                      MsgBox ("Le serveur n'est pas accessible"), vbExclamation
                                      Exit Sub
                                  End If
                                  Set GestionFichier = Nothing
                                  
                                  On Error GoTo CodeErreur 'gestion de l'erreur pour ouverture du fichier Excel manuellement (lorsque le fichier texte n'existe pas)
                                  
                                  Dim DernLigne As Long
                                  DernLigne = Range("A" & Rows.Count).End(xlUp).Row + 1
                                  
                                  Dim IndexFichier As Integer
                                  Dim MonFichier As String
                                  Dim ContenuLigne As String
                                  Dim ext As String
                                  
                                  'Lecture du fichier texte (macro récupérée)
                                  MonFichier = Lecteur_DRAFTER & "\00_Envoi-Clients\Temp.txt" '<-- mettez ici le nom du fichier à lire
                                  IndexFichier = FreeFile()
                                  Open MonFichier For Input As #IndexFichier 'ouvre le fichier
                                  
                                  While Not EOF(IndexFichier)
                                      Line Input #IndexFichier, ContenuLigne     ' lecture du fichier ligne par ligne: la variable "ContenuLigne" contient le contenu de la ligne active
                                      i = i + 1
                                      Cells(DernLigne, i).Value = ContenuLigne
                                  Wend
                                  
                                  Close #IndexFichier ' ferme le fichier
                                  
                                  ActiveWorkbook.Save
                                  
                                  'copie le dossier dans l'étude
                                  Dim monrepertoire As String
                                  Dim dossier As String
                                  Dim chemin As String
                                  Dim commande As String
                                  Dim chemin_copie As String
                                  Dim designation As String
                                  
                                  'Création du chemin
                                  commande = Cells(DernLigne, 2).Value
                                  
                                  monrepertoire = Lecteur_DRAFTER & "\DRAFTER\"
                                      dossier = Dir(monrepertoire & "*" & commande & "_*", vbDirectory)
                                      chemin = monrepertoire & dossier
                                      
                                  Dim fichier_trouvé As Boolean
                                  
                                      If dossier Like (commande & "_*") Then '----------------------------------------------------------------------------------------------Recherche dans le DRAFTER
                                      
                                          Set FSO = CreateObject("Scripting.FileSystemObject")
                                          Set queue = New Collection
                                          queue.Add FSO.GetFolder(chemin) 'Recherche les dossiers de l'étude
                                          
                                          Do While queue.Count > 0
                                              Set oFolder = queue(1)
                                              queue.Remove 1 'dequeue
                                              
                                              fichier_trouvé = False
                                              
                                              For Each osubfolder In oFolder.SubFolders
                                                  
                                                  If osubfolder.Name Like "ZZ_Dossier final pour envoi client" Then  'recherche le sous dossier envoi client
                                                      fichier_trouvé = True
                                                      chemin_copie = chemin & "\" & osubfolder.Name
                                                      Exit Do
                                                  End If
                                                  
                                                  queue.Add osubfolder 'enqueue
                                              Next osubfolder
                                          Loop
                                                  
                                          
                                          Dim fichier_copié As String
                                          fichier_copié = Cells(DernLigne, 1).Value
                                          fichier_copié = Replace(fichier_copié, """", "")
                                          Dim objFSO As Object
                                          
                                          On Error GoTo 0
                                          Dim new_dossier
                                          designation = Cells(DernLigne, 3).Value
                                          designation = Right(designation, Len(designation) - 1)
                                          new_dossier = chemin_copie & "\" & commande & "-" & designation
                                          new_dossier = Left(new_dossier, Len(new_dossier) - 1)
                                          
                                          fichier_copié = Left(fichier_copié, Len(fichier_copié) - 1)
                                              
                                          FileCopy fichier_copié, new_dossier & ".zip"  'zip
                                                      
                                          Dim repfichier As String
                                          'suppression des répertoires
                                              Kill fichier_copié
                                              repfichier = Left(fichier_copié, Len(fichier_copié) - 4)
                                  
                                                  Set FSO = CreateObject("Scripting.FileSystemObject")
                                  
                                  
                                                  If Right(repfichier, 1) <> "\" Then
                                                      repfichier = repfichier & "\"
                                                  End If
                                  
                                                  If Len(Dir(repfichier, vbDirectory)) > 0 Then
                                                      On Error Resume Next
                                      
                                                      'Supprimer les fichiers
                                                      FSO.DeleteFile repfichier & "*.*", True
                                      
                                                      'Supprime les sous-dossiers
                                                      FSO.DeleteFolder repfichier & "*.*", True
                                      
                                                      'Supprime le dossier principal
                                                      RmDir repfichier
                                                      On Error GoTo 0
                                                  End If
                                      End If
                                      
                                  ActiveWorkbook.Save
                                  Application.ScreenUpdating = True
                                  Application.Quit
                                  Exit Sub
                                  
                                  
                                  
                                  CodeErreur:
                                  If Err.Number = 53 Then
                                  Application.ScreenUpdating = True
                                  Exit Sub
                                  Else
                                  MsgBox "Une erreur s'est produite..."
                                  Application.ScreenUpdating = True
                                  End If
                                  End Sub



                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    22 mars 2022 à 10:43:53

                                    a priori pas de vérification que new_dossier existe avant de faire la copie en ligne 110

                                    les lignes 104 et 106 servent à quoi ? (on retire un caractère à droite ou gauche de la chaine, mais pourquoi ? si c'est pour supprimer un éventuel espace, autant utiliser Trim())

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      22 mars 2022 à 12:03:02

                                      Effectivement new_dossier n'est pas testé mais il s'agit simplement du chemin et du nom du zip qui va être créé au moment de la copie. chemin_copie qui est uniquement le chemin de ce nouveau zip est quand à lui bien testé. Ma méthode de copie n'est peu être pas la bonne? La fonction Name pourrait-elle me permettre de déplacer mon fichier? Toujours est t'il que le couper coller fonctionne avec ce code et j'insiste mais si j'exécute la macro VBA manuellement elle fonctionne parfaitement, pour cela je "triche" en créant le fichier txt manuellement avant d'ouvrir le fichier Excel. Seule la création et la suppression de ce fichier n'a pas lieu puisque cela est fait via le batch.

                                      Et concernant les lignes 104 et 106 elles servent effectivement à supprimer les espaces et je vais donc utiliser la fonction Trim comme tu le conseille.

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        22 mars 2022 à 12:54:31

                                        FileCopy ne génère pas de zip, il va juste changer l'extension sans faire de compression

                                        Name devrait aussi faire le déplacement, mais tu as aussi FSO.MoveFile pour déplacer un fichier. https://docs.microsoft.com/fr-fr/office/vba/language/reference/user-interface-help/movefile-method

                                        Remplace peut-être aussi ActiveWorkbook par ThisWorkbook (la différence c'est que ThisWorkbook, c'est le classeur qui contient le code exécuté, alors ActiveWorkbook est le classeur actuellement actif)

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          22 mars 2022 à 14:26:18

                                          J'ai modifié mon code pour utiliser la fonction FSO.MoveFile et ThisWorkbook mais le problème de l'Excel qui s'ouvre à la fin est toujours la.

                                          J'ai aussi modifié afin que le fichier texte soit supprimé dans le vba comme tu me l'avais suggéré au début et non dans le batch. J'ai supprimé le wait que j'avais mis dans mon batch. Mais j'ai toujours un second Excel qui s'ouvre à la fin de la macro...

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            22 mars 2022 à 15:10:20

                                            de ce que j'ai pu trouver, il semblerait qu'il faille quitter l'application puis fermer le classeur

                                            Application.Quit
                                            ThisWorkbook.Close True 'à la place de ActiveWorkbook.Save, on ferme le classeur en l'enregistrant



                                            -
                                            Edité par umfred 22 mars 2022 à 15:10:44

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              22 mars 2022 à 15:58:04

                                              Je pense que j'ai enfin résolu mon problème.

                                              J'ai fais ce que tu ma dis umfred mais le problème persistait. Ce qui causait le problème était enfaite l'origine de ce poste, cad l'ouverture d'Excel via le batch.

                                              set monfichier= %Lecteur% & "\Archive etudes\Archive Envoi client.xls"
                                              start /WAIT excel.exe %monfichier%

                                               la ligne set monfichier .... semble suffire pour ouvrir le fichier Excel souhaité (je me rappelle pas que celui-ci s'ouvrait au début sinon je n'aurai pas eu besoin de faire ce poste)

                                              Et la seconde ligne avec le start ouvrait le second Excel qui posait problème, je l'ai donc simplement supprimé et cela semble fonctionner.

                                              Merci pour votre aide, j'espère ne pas avoir besoin de rouvrir le poste

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                22 mars 2022 à 18:39:24

                                                Bonsoir,

                                                Ta ligne set a changé depuis le code posté plus haut et a une mauvaise syntaxe.

                                                Ta variable monfichier contient uniquement "EspaceLettre:Espace" exemple : G: 

                                                Car le symbole & signifie "nouvelle commande".

                                                Et donc il va exécuter ton fichier Excel via le chemin relatif fourni avec le programme par défaut pour cette extension.

                                                -
                                                Edité par Zaibai 22 mars 2022 à 19:00:07

                                                • Partager sur Facebook
                                                • Partager sur Twitter

                                                Batch ouverture de fichier Excel

                                                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                • Editeur
                                                • Markdown