Flash info

"La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information. "

Albert Einstein (1879-1955)

 
Accueil arrow Forum

Bienvenue sur le forum PowerShell-Scripting.com

 
gregmurf
Utilisateur

PowerShelleur Confirmé
Messages: 121
graphgraph
Karma: 0  
Attente de fin d'exécution EXCEL - 13/04/18 10:01 Bonjour,à tous,
est-ce qu'avec ce code:
Code:

 $excel = new-object -comobject excel.application     $filePath "\\serveur\partage\fichier1.xlsm"     $workbook $excel.Workbooks.Open($FilePath)     $excel.Visible $true     $worksheet $workbook.worksheets.item(1)     Write-Host "Running macro in excel to scrub data."     $excel.Run("Execution_Batch")     $workbook.close()     $excel.quit()     $excel = new-object -comobject excel.application     $filePath "\\serveur\partage\fichier2.xlsm"     $workbook $excel.Workbooks.Open($FilePath)     $excel.Visible $true     $worksheet $workbook.worksheets.item(1)     Write-Host "Running macro in excel to scrub data."     $excel.Run("Execution_Batch")     $workbook.close()     $excel.quit()


La seconde exécution attendra la fin de l'exécution du premier Excel ?

Powershell: la vie est belle
  | | L'administrateur a désactivé l'accés public en écriture.
Laurent Dardenne
Utilisateur

PowerShelleur Platinum
Messages: 5507
graph
Karma: 204  
Re:Attente de fin d'exécution EXCEL - 16/04/18 19:49 Salut,
gregmurf écrit:
Bonjour,à tous,
est-ce qu'avec ce code
La seconde exécution attendra la fin de l'exécution du premier Excel ?

Pour moi, difficile à dire.
L'objet COM est peut être encore en mémoire car ici sa libération n'est pas forcée.
L'instance pourrait être la même, mais le classeur fermé.

Le mieux est de tester, temps que je n'ai pas, et vérifier si l'ID du process (et ou l'instance COM ?) est identique.

Quel risque comptes-tu éviter ici ?
Tutoriels PowerShell
  | | L'administrateur a désactivé l'accés public en écriture.
gregmurf
Utilisateur

PowerShelleur Confirmé
Messages: 121
graphgraph
Karma: 0  
Re:Attente de fin d'exécution EXCEL - 25/04/18 11:11 Bonjour et merci,
en fait, je dois lancer plusieurs macro, mais pour lancer la seconde par exemple, il faut que la première ait fini de tourner.

Le code batch etait:
Code:

 "C:\Program Files (x86)\Microsoft Office\Office14\EXCEL.EXE" //cmd/Execution_Batch "c:\dossier\macro1.xlsm" set fichiers="blabla1*.pdf" forfiles /%racine% /%fichiers% /-%nbjours% //"cmd /c @FILE @FDATE"  forfiles /%racine% /%fichiers% /-%nbjours% //"cmd /c del @FILE"  "C:\Program Files (x86)\Microsoft Office\Office14\EXCEL.EXE" //cmd/Execution_Batch "c:\dossier\macro2.xlsm" set fichiers="blabla2*.pdf" forfiles /%racine% /%fichiers% /-%nbjours% //"cmd /c @FILE @FDATE"  forfiles /%racine% /%fichiers% /-%nbjours% //"cmd /c del @FILE" 



Que j'ai transformé en:
Code:

     $excel = new-object -comobject excel.application     $filePath "c:\dossier\macro1.xlsm"     $workbook $excel.Workbooks.Open($FilePath)     $excel.Visible $False     $worksheet $workbook.worksheets.item(1)     $excel.Run("Execution_Batch")     $workbook.close()     $excel.quit()     if ((Get-ChildItem -path $path -Recurse -Include "blabla1*.pdf" -Force Where-Object { ((Get-Date) - $_.LastWriteTime).totaldays -gt 1 }) -ne $null)         {          Remove-Item -path $path -Recurse -Include "blabla1*.pdf" -Force      }     $excel = new-object -comobject excel.application     $filePath "c:\dossier\macro2.xlsm"     $workbook $excel.Workbooks.Open($FilePath)     $excel.Visible $False     $worksheet $workbook.worksheets.item(1)     $excel.Run("Execution_Batch")     $workbook.close()     $excel.quit()     if ((Get-ChildItem -path $path -Recurse -Include "blabla2*.pdf" -Force Where-Object { ((Get-Date) - $_.LastWriteTime).totaldays -gt 1 }) -ne $null)         {          Remove-Item -path $path -Recurse -Include "blabla2*.pdf" -Force      }

Powershell: la vie est belle
  | | L'administrateur a désactivé l'accés public en écriture.
Laurent Dardenne
Utilisateur

PowerShelleur Platinum
Messages: 5507
graph
Karma: 204  
Re:Attente de fin d'exécution EXCEL - 25/04/18 17:28 On peut supposer que le méthode Run est synchrone :

Remarks

You cannot use named arguments with this method. Arguments must be passed by position.

The Run method returns whatever the called macro returns.

L'enchaînement de tes macros pourrait se faire sans avoir à clore l'instance de l'application.

Pour t'en assurer crée des macros de test contenant une création de fichier + une attente (si ça existe).
Ainsi tu peux contrôler l'heure de création et l'enchainement.
Tutoriels PowerShell
  | | L'administrateur a désactivé l'accés public en écriture.
gregmurf
Utilisateur

PowerShelleur Confirmé
Messages: 121
graphgraph
Karma: 0  
Re:Attente de fin d'exécution EXCEL - 14/05/18 10:07 Bonjour,
quelqu'un saurait pourquoi powershell ne veut pas de
Code:

 $workbook.close()


ou même
Code:

 $workbook.close($false)

?

Il me dit
Code:

 Échec lors de l’appel de la méthodecar [System.__ComObjectne contient pas de méthode nommée « close ».


Powershell: la vie est belle
  | | L'administrateur a désactivé l'accés public en écriture.
Laurent Dardenne
Utilisateur

PowerShelleur Platinum
Messages: 5507
graph
Karma: 204  
Re:Attente de fin d'exécution EXCEL - 14/05/18 17:33 Salut,
dans un premier temps vérifie si le contenu de ta variable référence bien un objet Workbook.

Quel est le contexte d'appel de ton objet COM ?
Tutoriels PowerShell
  | | L'administrateur a désactivé l'accés public en écriture.
gregmurf
Utilisateur

PowerShelleur Confirmé
Messages: 121
graphgraph
Karma: 0  
Re:Attente de fin d'exécution EXCEL - 18/05/18 10:45 Comment fais-je pour vérifier cela ?
Et qu'entends-tu par contexte d'appel ?
Désolé pour ces questions.........
Powershell: la vie est belle
  | | L'administrateur a désactivé l'accés public en écriture.
gregmurf
Utilisateur

PowerShelleur Confirmé
Messages: 121
graphgraph
Karma: 0  
Re:Attente de fin d'exécution EXCEL - 18/05/18 10:58 J'ai une autre question: est-ce que le fait de ne lancer qu'une seule fois Excel, puis lancer une à une les macros ne serait pas mieux que d'ouvrir Excel, lancer la marco, le fermer, le réouvrir, etc... ?
Comme ça:
Code:

 $excel = new-object -comobject excel.application     $PathMacro1 "dossier\Macro1.xlsm"     $workbook $excel.Workbooks.Open($PathMacro1)     $excel.Visible $False     $excel.Run("Execution_Batch")     $PathMacro2 "dossier\Macro2.xlsm"     $workbook $excel.Workbooks.Open($PathMacro2)     $excel.Run("Execution_Batch")

Powershell: la vie est belle
  | | L'administrateur a désactivé l'accés public en écriture.
Laurent Dardenne
Utilisateur

PowerShelleur Platinum
Messages: 5507
graph
Karma: 204  
Re:Attente de fin d'exécution EXCEL - 18/05/18 18:04 gregmurf écrit:
Comment fais-je pour vérifier cela ?

Bonne question
Je regarde comment différencier/retrouver le ClsID
gregmurf écrit:

Et qu'entends-tu par contexte d'appel ?

Session utilisateur vs tâche planifiée avec un compte de service par exemple.

gregmurf écrit:
J'ai une autre question: est-ce que le fait de ne lancer qu'une seule fois Excel, puis lancer une à une les macros ne serait pas mieux que d'ouvrir Excel, lancer la macro, le fermer, le réouvrir, etc... ?

C'est fort probable ,mais je n'ai pas plus d'arguments que ça.Faut tester
Tutoriels PowerShell
  | | L'administrateur a désactivé l'accés public en écriture.
Laurent Dardenne
Utilisateur

PowerShelleur Platinum
Messages: 5507
graph
Karma: 204  
Re:Attente de fin d'exécution EXCEL - 19/05/18 11:12 Pour retrouver le type de l'objet COM :
Code:

  $workbook.pstypenames #System.__ComObject#{000208da-0000-0000-c000-000000000046} #System.__ComObject #System.MarshalByRefObject #System.Object

Tutoriels PowerShell
  | | L'administrateur a désactivé l'accés public en écriture.
gregmurf
Utilisateur

PowerShelleur Confirmé
Messages: 121
graphgraph
Karma: 0  
Re:Attente de fin d'exécution EXCEL - 29/05/18 13:21 Bonjour,
étant débutant, je ne sais pas trop quoi faire avec ça....
J'ai revu mon script pour qu'il n'ouvre excel qu'une fois, qu'il exécute les macros à la suite, et qu'il le ferme à la fin.
Mais le problème est qu'excel reste dans les processus...
J'ai essayé ceci
Code:

     $excel = new-object -comobject excel.application     $filePath "chemin_vers_la_macro\macro.xlsm"     $workbook $excel.Workbooks.Open($FilePath)     $excel.Visible $false     $worksheet $workbook.worksheets.item(1)     $excel.Run("Execution_Batch")     $excel.quit()     while( [System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel)){}


Mais... toujours mon petit processus excel.
Powershell: la vie est belle
  | | L'administrateur a désactivé l'accés public en écriture.
Laurent Dardenne
Utilisateur

PowerShelleur Platinum
Messages: 5507
graph
Karma: 204  
Re:Attente de fin d'exécution EXCEL - 29/05/18 19:36 gregmurf écrit:

Mais... toujours mon petit processus excel.

COM garde un compteur de références des objets créés, Il faut donc fermer/supprimer chaque objet COM que tu crées une fois que tu ne l'utilises plus. Sinon la référence reste active et 'empêche' la libération de l'objet COM.
Un exemple :
Code:

  $excel = new-object -com Excel.Application $classeurSource="$PWD\Test.xls" $MonClasseur $excel.Workbooks.Open($classeurSource)   #Les deux appels suivant provoquent une erreur    $MonClasseur.Worksheets[1]    $MonClasseur.Worksheets(1)  #Accéde a la première feuille XL $MonClasseur.Worksheets.Item(1) $Excel.Quit()  #Force la libération des ressources $null=[System.Runtime.InteropServices.Marshal::ReleaseComObject($MonClasseur)] $null=[System.Runtime.InteropServices.Marshal]::ReleaseComObject($excel) [System.GC]::Collect()


On peut aussi affecter $null aux objets qui ne sont plus utilisés (sauf l'objet primaire), mais c'est parfois insuffisant.
Tutoriels PowerShell
  | | L'administrateur a désactivé l'accés public en écriture.
© 2018 PowerShell-Scripting.com