Question
[Résolu] Fusion fichier Excel avec Powershell
- Hicham Madini
- Hors Ligne
- Membre premium
-
Réduire
Plus d'informations
- Messages : 98
- Remerciements reçus 0
il y a 7 ans 3 mois #28331
par Hicham Madini
Réponse de Hicham Madini sur le sujet Re:Fusion ficier Excel avec Powershell
oui ben l'idée c'est de tout copier sur la feuille \"Suivi Utilisation Applications\" et aprés tu fais un tri. (c'est juste mon idée)
tu peux aussi faire un tri des deux fihciers directement aprés de leur ouverture et aprés tu commences la comparaison et le copier/coller.
Bon je t'ai fait une partie, il te reste à copier les élements qui coincident et de coller leurs données dans les colonnes V et W.
Fait attention à ton fichier destination, il faut suprimer les lignes de 171 à 190 (mal formater) avant de lancer le script! J'ai utilisé ton fichier initial sans rien changer!
[code:1]Function Get-WorkbookData($Workbook, $Row) {
$Workbook.Activate()
$Logiciel = $Workbook.ActiveSheet.Range(\"A\" + $Row).Text
while ($Logiciel.Length) {
$obj = @{
\"Logiciel\" = $Logiciel;
}
New-Object –Typename PSObject –Prop $obj
$Row++
$j = $Row
$Logiciel = $Workbook.ActiveSheet.Range(\"A\" + $Row).Text -replace '(^\s+|\s+$)','' -replace '\s+',' '
}
}
Function Mark-Logiciel($Workbook, $LogicielToMark) {
$Workbook.Activate()
$lastCol = $ExcelWorkbookOld.Worksheets.item(1).UsedRange.columns.count + 1
$Row = 1
$Logiciel = $Workbook.ActiveSheet.Range(\"A\" + $Row).Text
while ($Logiciel.Length) {
if ($LogicielToMark -contains $Logiciel) {
$Workbook.Activate()
$lago = $Workbook.ActiveSheet.Range(\"A\" + $Row).copy()
$Workbook.ActiveSheet.Range(\"A\" + $Row).Cells.Font.ColorIndex = 3
$ExcelWorkbookOld.Activate()
$lastRow = $ExcelWorkbookOld.Worksheets.item(1).UsedRange.rows.count + 1
$ExcelWorkbookOld.Worksheets.item(1).Range(\"A\" + $lastRow).select()
$ExcelWorkbookOld.ActiveSheet.Paste()
$lago1 = $Workbook.ActiveSheet.Range(\"B\" + $Row).copy()
$ExcelWorkbookOld.Worksheets.item(1).Cells($lastRow , $lastCol - 1).select()
$ExcelWorkbookOld.ActiveSheet.Paste()
$lago2 = $Workbook.ActiveSheet.Range(\"C\" + $Row).copy()
$ExcelWorkbookOld.Worksheets.item(1).Cells($lastRow , $lastCol - 2).select()
$ExcelWorkbookOld.ActiveSheet.Paste()
}
$Row++
$Logiciel = $Workbook.ActiveSheet.Range(\"A\" + $Row).Text
}
}
Add-Type -AssemblyName \"Microsoft.Office.Interop.Excel\" | out-null
# Ouvrir Excel
$ExcelApplication = New-Object -ComObject \"Excel.Application\"
$ExcelApplication.Visible = $true
# ouvrir les deux fichiers à comparer
$ExcelWorkbookOld = $ExcelApplication.Workbooks.Open(\"DESTINATION2.xlsx\")
$ExcelWorkbookNew = $ExcelApplication.Workbooks.Open(\"SOURCE3.xlsx\")
$rng1=\"T1:U2\" # l'entête à copier
$rng2=\"V1:W2\"
$xl = new-object -c excel.application
$ExcelWorkbookOld.Activate()
$rng = $ExcelWorkbookOld.Worksheets.item(1).Range($rng1).Copy()
$x=$ExcelWorkbookOld.Worksheets.item(1).Range($rng2).Select()
$ExcelWorkbookOld.Worksheets.item(1).Paste()
$x=$ExcelWorkbookOld.Worksheets.item(1).Range(\"V1\").value =\"Janver 19\"
# recupérer les données des colonnes à comparer
$OldData = Get-WorkbookData -Workbook $ExcelWorkbookOld 3
$NewData = Get-WorkbookData -Workbook $ExcelWorkbookNew 2
# comparer les données récuperer
$Comparison = Compare-Object -ReferenceObject $NewData -DifferenceObject $OldData -Property \"Logiciel\" -IncludeEqual:$false
$LogicielToMark = @()
$Comparison | %{
if ($_.SideIndicator -eq \"<=\") {
$LogicielToMark += $_.Logiciel
}
}
Mark-Logiciel -Workbook $ExcelWorkbookNew -LogicielToMark $LogicielToMark
#$ExcelApplication.Quit()[/code:1]
Bonne chance pour le reste
<br><br>Message édité par: hichammadd, à: 26/02/19 10:33
tu peux aussi faire un tri des deux fihciers directement aprés de leur ouverture et aprés tu commences la comparaison et le copier/coller.
Bon je t'ai fait une partie, il te reste à copier les élements qui coincident et de coller leurs données dans les colonnes V et W.
Fait attention à ton fichier destination, il faut suprimer les lignes de 171 à 190 (mal formater) avant de lancer le script! J'ai utilisé ton fichier initial sans rien changer!
[code:1]Function Get-WorkbookData($Workbook, $Row) {
$Workbook.Activate()
$Logiciel = $Workbook.ActiveSheet.Range(\"A\" + $Row).Text
while ($Logiciel.Length) {
$obj = @{
\"Logiciel\" = $Logiciel;
}
New-Object –Typename PSObject –Prop $obj
$Row++
$j = $Row
$Logiciel = $Workbook.ActiveSheet.Range(\"A\" + $Row).Text -replace '(^\s+|\s+$)','' -replace '\s+',' '
}
}
Function Mark-Logiciel($Workbook, $LogicielToMark) {
$Workbook.Activate()
$lastCol = $ExcelWorkbookOld.Worksheets.item(1).UsedRange.columns.count + 1
$Row = 1
$Logiciel = $Workbook.ActiveSheet.Range(\"A\" + $Row).Text
while ($Logiciel.Length) {
if ($LogicielToMark -contains $Logiciel) {
$Workbook.Activate()
$lago = $Workbook.ActiveSheet.Range(\"A\" + $Row).copy()
$Workbook.ActiveSheet.Range(\"A\" + $Row).Cells.Font.ColorIndex = 3
$ExcelWorkbookOld.Activate()
$lastRow = $ExcelWorkbookOld.Worksheets.item(1).UsedRange.rows.count + 1
$ExcelWorkbookOld.Worksheets.item(1).Range(\"A\" + $lastRow).select()
$ExcelWorkbookOld.ActiveSheet.Paste()
$lago1 = $Workbook.ActiveSheet.Range(\"B\" + $Row).copy()
$ExcelWorkbookOld.Worksheets.item(1).Cells($lastRow , $lastCol - 1).select()
$ExcelWorkbookOld.ActiveSheet.Paste()
$lago2 = $Workbook.ActiveSheet.Range(\"C\" + $Row).copy()
$ExcelWorkbookOld.Worksheets.item(1).Cells($lastRow , $lastCol - 2).select()
$ExcelWorkbookOld.ActiveSheet.Paste()
}
$Row++
$Logiciel = $Workbook.ActiveSheet.Range(\"A\" + $Row).Text
}
}
Add-Type -AssemblyName \"Microsoft.Office.Interop.Excel\" | out-null
# Ouvrir Excel
$ExcelApplication = New-Object -ComObject \"Excel.Application\"
$ExcelApplication.Visible = $true
# ouvrir les deux fichiers à comparer
$ExcelWorkbookOld = $ExcelApplication.Workbooks.Open(\"DESTINATION2.xlsx\")
$ExcelWorkbookNew = $ExcelApplication.Workbooks.Open(\"SOURCE3.xlsx\")
$rng1=\"T1:U2\" # l'entête à copier
$rng2=\"V1:W2\"
$xl = new-object -c excel.application
$ExcelWorkbookOld.Activate()
$rng = $ExcelWorkbookOld.Worksheets.item(1).Range($rng1).Copy()
$x=$ExcelWorkbookOld.Worksheets.item(1).Range($rng2).Select()
$ExcelWorkbookOld.Worksheets.item(1).Paste()
$x=$ExcelWorkbookOld.Worksheets.item(1).Range(\"V1\").value =\"Janver 19\"
# recupérer les données des colonnes à comparer
$OldData = Get-WorkbookData -Workbook $ExcelWorkbookOld 3
$NewData = Get-WorkbookData -Workbook $ExcelWorkbookNew 2
# comparer les données récuperer
$Comparison = Compare-Object -ReferenceObject $NewData -DifferenceObject $OldData -Property \"Logiciel\" -IncludeEqual:$false
$LogicielToMark = @()
$Comparison | %{
if ($_.SideIndicator -eq \"<=\") {
$LogicielToMark += $_.Logiciel
}
}
Mark-Logiciel -Workbook $ExcelWorkbookNew -LogicielToMark $LogicielToMark
#$ExcelApplication.Quit()[/code:1]
Bonne chance pour le reste
Connexion ou Créer un compte pour participer à la conversation.
- Atou
- Auteur du sujet
- Hors Ligne
- Membre senior
-
Réduire
Plus d'informations
- Messages : 65
- Remerciements reçus 0
il y a 7 ans 3 mois #28332
par Atou
Réponse de Atou sur le sujet Re:Fusion ficier Excel avec Powershell
Je te remercie beaucoup pour ton aide, je vais essayer de finir ce script dans les jours à venir lorsque j'aurais un peu de temps libre.
Je te retournerais le script si j'arrive à le terminer.
Merci beaucoup
Je te retournerais le script si j'arrive à le terminer.
Merci beaucoup
Connexion ou Créer un compte pour participer à la conversation.
- Atou
- Auteur du sujet
- Hors Ligne
- Membre senior
-
Réduire
Plus d'informations
- Messages : 65
- Remerciements reçus 0
il y a 7 ans 3 mois #28333
par Atou
Réponse de Atou sur le sujet Re:Fusion ficier Excel avec Powershell
J'aurais juste un dernier service à te demander,est ce que tu pourrais commenter un peu ton code parce que je suis un peu dépasser par rapport à ton niveau. 
Merci d'avance
<br><br>Message édité par: Atou45, à: 25/02/19 12:53
Merci d'avance
Connexion ou Créer un compte pour participer à la conversation.
- Atou
- Auteur du sujet
- Hors Ligne
- Membre senior
-
Réduire
Plus d'informations
- Messages : 65
- Remerciements reçus 0
il y a 7 ans 2 mois #28340
par Atou
Réponse de Atou sur le sujet Re:Fusion ficier Excel avec Powershell
J'ai commencer à plancher sur ton script, je me demandais, est ce que je peux récupérer cette ligne pour faire ma comparaison pour ajouter les temps d'utilisation et les nombres de lancement :
if ($UsersToMark -contains $Logiciel) {
Si je comprends bien cela correspond à : Si UserToMark contient Logiciel on exécute la suite.
Ce que je ne comprend pas c'est que cette partie fait l'inverse, si je comprend bien le code qui suit cette partie permet d'ajouter les logiciel manquant.
Bon la je t'avoue que c'est encore un peu le blocage ...<br><br>Message édité par: Atou45, à: 26/02/19 10:42
if ($UsersToMark -contains $Logiciel) {
Si je comprends bien cela correspond à : Si UserToMark contient Logiciel on exécute la suite.
Ce que je ne comprend pas c'est que cette partie fait l'inverse, si je comprend bien le code qui suit cette partie permet d'ajouter les logiciel manquant.
Bon la je t'avoue que c'est encore un peu le blocage ...<br><br>Message édité par: Atou45, à: 26/02/19 10:42
Connexion ou Créer un compte pour participer à la conversation.
- Hicham Madini
- Hors Ligne
- Membre premium
-
Réduire
Plus d'informations
- Messages : 98
- Remerciements reçus 0
il y a 7 ans 2 mois #28342
par Hicham Madini
Réponse de Hicham Madini sur le sujet Re:Fusion ficier Excel avec Powershell
oui mais il faut faire attention à l'indicateur!
Connexion ou Créer un compte pour participer à la conversation.
- Atou
- Auteur du sujet
- Hors Ligne
- Membre senior
-
Réduire
Plus d'informations
- Messages : 65
- Remerciements reçus 0
il y a 7 ans 2 mois #28343
par Atou
Réponse de Atou sur le sujet Re:Fusion ficier Excel avec Powershell
Ah oui d'accord j'ai bien compris pour le SideIndicator, dans un sens sa veut dire que le logiciel n'est pas présent et dans l'autre il y est.
Sa va être compliqué pour la suite mais bon je vais essayer de mon débrouiller je te dirais ce que sa donne demain je pense, je vais essayer de résoudre mon problème aujourd'hui.
Sa va être compliqué pour la suite mais bon je vais essayer de mon débrouiller je te dirais ce que sa donne demain je pense, je vais essayer de résoudre mon problème aujourd'hui.
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.041 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- [Résolu] Fusion fichier Excel avec Powershell