Question [Résolu] Fusion fichier Excel avec Powershell

Plus d'informations
il y a 7 ans 2 mois #28352 par Atou
Réponse de Atou sur le sujet Re:Fusion ficier Excel avec Powershell
J'ai essayer et non j'ai toujours la même erreur ...

Je ne comprend également pas ou est la partie du code qui permet de copier coller le temps d'utilisation et le nombre de lancement du logiciel ...

Je suis de plus en plus désespéré ...

Voilà tout mon code si sa peut vous aidez :
[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+',' '
}
}


#Fonction pour l'ajout des logiciels manquant
Function Mark-Users($Workbook, $UsersToMark) {
$Workbook.Activate()
$lastCol = $ExcelWorkbookOld.Worksheets.item(1).UsedRange.columns.count + 1
$Row = 1
$Logiciel = $Workbook.ActiveSheet.Range(\"A\" + $Row).Text
while ($Logiciel.Length) {
if ($UsersToMark -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
}
}
Function Mark-Logi($Workbook, $UsersToAtou) {
$Workbook.Activate()
$lastCol = $ExcelWorkbookOld.Worksheets.item(1).UsedRange.columns.count + 1
$Row = 1
$Logiciel = $Workbook.ActiveSheet.Range(\"A\" + $Row).Text
while ($Logiciel.Length){
if ($UsersToMark -eq $Logiciel){
$Workbook.Activate()
$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(\"E:\2K19\Scriptexcel\DESTINATION3.xlsx\"«»)
$ExcelWorkbookNew = $ExcelApplication.Workbooks.Open(\"E:\2K19\Scriptexcel\SOURCE3.xlsx\"«»)

#Copie de l'entête de base
$rng1=\"T1:U2\"
$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 =\"Janvier 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


$UsersToMark = @()
$Comparison | %{
if ($_.SideIndicator -eq \"<=\"«») {
$UsersToMark += $_.Logiciel
}
}
if ($_.SideIndicator -eq \"=>\"«»){
$UsersToAtou += $_.Logiciel
}

Mark-Users -Workbook $ExcelWorkbookNew -UsersToMark $UsersToMark
Mark-Logi -Workbook $ExcelWorkbookNew -UsersToMark $UsersToAtous

[/code:1]<br><br>Message édité par: Atou45, à: 26/02/19 14:49

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 7 ans 2 mois #28353 par Hicham Madini
ajoute

[code:1]$UsersToAtou = @()[/code:1]

aprés
[code:1]$UsersToMark = @()[/code:1]<br><br>Message édité par: hichammadd, à: 26/02/19 15:05

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 7 ans 2 mois #28357 par Atou
Réponse de Atou sur le sujet Re:Fusion ficier Excel avec Powershell
J'ai bien ajouter cette ligne et rien n'y fait, j'ai toijours la même erreur ...

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 7 ans 2 mois #28358 par Hicham Madini
hmm ok je vais voir, en fait tu as toutes les données pour réaliser ton script, c'est une question de 20 min.

@+++ je t'oublierais pas t'inquiète :)

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 7 ans 2 mois #28359 par Atou
Réponse de Atou sur le sujet Re:Fusion ficier Excel avec Powershell
Je suis bien d'accord que pour quelqu'un qui est assez doué avec powershell comme toi c'est une affaire de 20 min mais bon tu vois j'ai encore des bases très faibles en powershell surtout avec excel ...

Le problème que j'ai aussi c'est que tu a fais beaucoup de chose sur le script et je ne comprend pas tout, il manque peut être quelques commentaires pour que j'arrive à peu près à tout comprendre et à finir le script moi même ...

Je te remercie d'avance<br><br>Message édité par: Atou45, à: 27/02/19 08:15

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 7 ans 2 mois #28362 par Hicham Madini
Re,
non mais moi aussi je suis comme toi, tout nouveau :D
Ton projet m'a intéréssé aussi ;)

donc voilà:
1- oublie/efface tous les anciens scripts.
2- utilise le fichier Destination attaché
3- plus de questions hen :D puisque j'ai commenté un peu le script

[code:1]# Fonction pour récupérer les données de la première colonne de chaque fichier
Function Get-WorkbookData($Workbook, $Row) {
$Workbook.Activate()
$Logiciel = $Workbook.ActiveSheet.Range(\&quot;A\&quot; + $Row).Text
while ($Logiciel.Length) {
$obj = @{
\&quot;Logiciel\&quot; = $Logiciel;
}
New-Object –Typename PSObject –Prop $obj
$Row++
$j = $Row
$Logiciel = $Workbook.ActiveSheet.Range(\&quot;A\&quot; + $Row).Text -replace '(^\s+|\s+$)','' -replace '\s+',' '
}
}

# fonction pour colorer les différences et de faire la mise à jour du fichier Destination
Function Update-Destination($Workbook, $LogicielToMark, $LogicielToCopy) {
$Workbook.Activate()
$lastCol = $wsD.UsedRange.columns.count
$Row = 1
$Logiciel = $Workbook.ActiveSheet.Range(\&quot;A\&quot; + $Row).Text
while ($Logiciel.Length) {
if ($LogicielToMark -contains $Logiciel) {
$Workbook.Activate()
$Workbook.ActiveSheet.Range(\&quot;A\&quot; + $Row).copy()
$Destination.Activate()
$lastRow = $wsD.UsedRange.rows.count + 1
$wsD.Range(\&quot;A\&quot; + $lastRow).select()
$Destination.ActiveSheet.Paste()
$Workbook.ActiveSheet.Range(\&quot;B\&quot; + $Row).copy()
$wsD.Cells($lastRow , $lastCol).select()
$Destination.ActiveSheet.Paste()
$Workbook.ActiveSheet.Range(\&quot;C\&quot; + $Row).copy()
$wsD.Cells($lastRow , $lastCol - 1).select()
$Destination.ActiveSheet.Paste()
$Workbook.ActiveSheet.Range(\&quot;A\&quot; + $Row).Cells.Font.ColorIndex = 3
}
Else {
if ($LogicielToCopy -contains $Logiciel) {
$Workbook.Activate()
$CurrentRow = $wsD.Columns.item(1).find($Logiciel).row
$Workbook.ActiveSheet.Range(\&quot;B\&quot; + $Row).copy()
$Destination.Activate()
$wsD.Cells($CurrentRow , $lastCol).select()
$Destination.ActiveSheet.Paste()
$Workbook.ActiveSheet.Range(\&quot;C\&quot; + $Row).copy()
$wsD.Cells($CurrentRow , $lastCol - 1).select()
$Destination.ActiveSheet.Paste()
}

}
$Row++
$Logiciel = $Workbook.ActiveSheet.Range(\&quot;A\&quot; + $Row).Text
}
}

# Fonction pour trier les plages
Function Tri-Plage($ws, $Row, $Cell) {
$lastCol = $ws.UsedRange.columns.count
$lastrow = $ws.UsedRange.rows.count
$objRange = $ws.Range($ws.Cells($Row, 1), $ws.Cells($lastrow, $lastCol))
$objRange1 = $ws.Range($Cell)
[void] $objRange.Sort($objRange1)
}

Add-Type -AssemblyName \&quot;Microsoft.Office.Interop.Excel\&quot; | out-null
add-type -assemblyName \&quot;Microsoft.VisualBasic\&quot;

# InputBox pour inserer le bon mois
$mois = [Microsoft.VisualBasic.Interaction]::InputBox(\&quot;Entrez le mois et l'année au format 'Janvier 19'\&quot;, \&quot;Nouvel mois\&quot;«»)

# Ouvrir Excel
$ExcelApplication = New-Object -ComObject \&quot;Excel.Application\&quot;
$ExcelApplication.Visible = $true

# ouvrir les deux fichiers à comparer
$Destination = $ExcelApplication.Workbooks.Open(\&quot;DESTINATION2.xlsx\&quot;«»)
$Source = $ExcelApplication.Workbooks.Open(\&quot;SOURCE3.xlsx\&quot;«»)

# définire les feuilles à comparer de chaque fichiers
$wsD = $Destination.Worksheets.item(1)
$wsS = $Destination.Worksheets.item(1)

# copier l'entête du nouveau mois
$rng1=\&quot;T1:U2\&quot;
$rng2=\&quot;V1:W2\&quot;
$xl = new-object -c excel.application
$Destination.Activate()
$rng = $wsD.Range($rng1).Copy()
$wsD.Range($rng2).Select()
$wsD.Paste()
$wsD.Range(\&quot;V1\&quot;«»).value = $mois

#Trier la feuille du document Destination
Tri-Plage $wsD 3 \&quot;A3\&quot;

#Trier la feuille du document Source
Tri-Plage $wsS 2 \&quot;A2\&quot;

# recupérer les données des colonnes à comparer
$DestinationData = Get-WorkbookData -Workbook $Destination 3 # à partir de la ligne 3 à cause de l'entête
$SourceData = Get-WorkbookData -Workbook $Source 2 # à partir de la ligne 2 à cause de l'entête

# comparer les données récuperer
$Comparison = Compare-Object -ReferenceObject $SourceData -DifferenceObject $DestinationData -Property \&quot;Logiciel\&quot; -IncludeEqual:$true

# table de hachage (les résultats de recherche sont stockés dedans)
$LogicielToMark = @()
$LogicielToCopy = @()
$Comparison | %{
if ($_.SideIndicator -eq \&quot;&lt;=\&quot;«») {
$LogicielToMark += $_.Logiciel
}
Else{ if ($_.SideIndicator -eq \&quot;==\&quot;«»){
$LogicielToCopy += $_.Logiciel
}
}
}

# execution opérations coloration et mise à jour
Update-Destination -Workbook $Source -LogicielToMark $LogicielToMark -LogicielToCopy $LogicielToCopy

#Trier la feuille du document Destination aprés la mise à jour
Tri-Plage $wsD 3 \&quot;A3\&quot;

# ajuster le format de la feuille du document Destination
$objRange = $wsD.Range($wsD.Cells(3, 1), $wsD.Cells($lastrow, $lastCol))
7..12 | ForEach {
$objRange.Borders.Item($_).LineStyle = 1
$objRange.Borders.item($_).Weight = -4138 #2
$objRange.Borders.item($_).Color = 0
}

# selectionner la cellule A1, c'est pas obligatoire
$wsD.Range(\&quot;A1\&quot;«»).select()

#$Destination.Save() &lt;== à activer pour sauvegarder
#$Source.Save() &lt;== à activer pour sauvegarder
#$ExcelApplication.Quit() &lt;== à activer pour fermer Excel
[/code:1]<br><br>Message édité par: hichammadd, à: 27/02/19 10:20
Pièces jointes :

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.045 secondes
Propulsé par Kunena