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 2 mois #28455
par Hicham Madini
Réponse de Hicham Madini sur le sujet Re:Fusion ficier Excel avec Powershell
Bonjour Atou,
Pas du tout la fonction fait son travail! l'erreur se trouve ailleurs
plus précisément ici:
[code:1]# copier l'entête du nouveau mois
$rng1=\"T1:U2\" # tu peux toujours copier les mêmes céllules
$rng2=\"V1:W2\" # mais si tu les colles toujours sur la même plage, que vas t-il se passer? [/code:1]
donc il faut que tu modifie la variable $rng2, elle doit se calculer dynamiquement
et ne me pousse pas à le faire moi même, je sais que tu peux reussir seul. Tu sais comment trouver la dernière céllule d'une ligne ==> donc t'as aucun problème.
Aller fais un effort
tout à fait!
En fait ton script n'est pas vraiment fini, il y a encore des fautes hein et il faut penser à vider (réinitialiser) tes variables à la fin du script, puisque tu l'utilise deux, trois fois successivement.....
@+++<br><br>Message édité par: hichammadd, à: 13/03/19 08:02
L'erreur vient de la fonction qui permet de faire la mise à jour du fichier de destination, j'ai fait des tests mais qui ne sont pas concluant.
Pas du tout la fonction fait son travail! l'erreur se trouve ailleurs
plus précisément ici:
[code:1]# copier l'entête du nouveau mois
$rng1=\"T1:U2\" # tu peux toujours copier les mêmes céllules
$rng2=\"V1:W2\" # mais si tu les colles toujours sur la même plage, que vas t-il se passer? [/code:1]
donc il faut que tu modifie la variable $rng2, elle doit se calculer dynamiquement
et ne me pousse pas à le faire moi même, je sais que tu peux reussir seul. Tu sais comment trouver la dernière céllule d'une ligne ==> donc t'as aucun problème.
Aller fais un effort
Je pensais de base que le script regardait la dernière colonne non remplie et donc qu'il déduisait automatiquement qu'il fallait copier-coller sur la colonne juste à côté
tout à fait!
En fait ton script n'est pas vraiment fini, il y a encore des fautes hein et il faut penser à vider (réinitialiser) tes variables à la fin du script, puisque tu l'utilise deux, trois fois successivement.....
@+++<br><br>Message édité par: hichammadd, à: 13/03/19 08:02
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 #28464
par Hicham Madini
Réponse de Hicham Madini sur le sujet Re:Fusion ficier Excel avec Powershell
Bonjour Atou,
bon je me suis concentré sur ton script une fois pour toute afin de finir cette histoire
premièrement tu copies tes formules dans les colonnes D et E jusqu'à la dernière ligne \"NON VIDE\"! et tu sauvegardes ton fichier destination.
Aprés utilise le script, il insert lui même tes formules dans les nouvelles lignes.
[code:1]# InputBox pour inserer le bon mois
Add-type -AssemblyName \"Microsoft.VisualBasic\"
$Mois = [Microsoft.VisualBasic.Interaction]::InputBox(\"Entrez le mois et l'année au format 'Janvier 19'\", \"Nouvel mois\"«»)
# si le nom du mois est vide on quitte le script
if ($Mois) {
# 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(\"A\" + $Row).Text
while ($Logiciel.Length) {
$obj = @{
\"Logiciel\" = $Logiciel;
}
New-Object –Typename PSObject –Prop $obj
$Row++
$Logiciel = $Workbook.ActiveSheet.Range(\"A\" + $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($LogicielToMark, $LogicielToCopy) {
$Source.Activate()
$Row = 1
$Logiciel = $Source.ActiveSheet.Range(\"A\" + $Row).Text
while ($Logiciel.Length) {
if ($LogicielToMark -contains $Logiciel) {
$Source.Activate()
$Source.ActiveSheet.Range(\"A\" + $Row).copy()
$Destination.Activate()
$lastRow = $wsD.UsedRange.rows.count + 1
$wsD.Range(\"A\" + $lastRow).select()
$Destination.ActiveSheet.Paste()
$wsD.Range(\"D\" + ($lastRow -1) + \":E\" + ($lastRow -1)).copy() # copier les formules pour calculer le Cumul
$wsD.Range(\"D\" + $lastRow).select()
$Destination.ActiveSheet.Paste() # coller les formules pour calculer le Cumul
$Source.ActiveSheet.Range(\"B\" + $Row).copy()
$wsD.Cells($lastRow, $lastCol + 2).select()
$Destination.ActiveSheet.Paste()
$Source.ActiveSheet.Range(\"C\" + $Row).copy()
$wsD.Cells($lastRow, $lastCol +1).select()
$Destination.ActiveSheet.Paste()
$Source.ActiveSheet.Range(\"A\" + $Row).Cells.Font.ColorIndex = 3
}
Else {
if ($LogicielToCopy -contains $Logiciel) {
$Source.Activate()
$CurrentRow = $wsD.Columns.item(1).find($Logiciel).row
$Source.ActiveSheet.Range(\"B\" + $Row).copy()
$Destination.Activate()
$wsD.Cells($CurrentRow , $lastCol + 2).select()
$Destination.ActiveSheet.Paste()
$Source.ActiveSheet.Range(\"C\" + $Row).copy()
$wsD.Cells($CurrentRow , $lastCol +1).select()
$Destination.ActiveSheet.Paste()
}
}
$Row++
$Logiciel = $Source.ActiveSheet.Range(\"A\" + $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 \"Microsoft.Office.Interop.Excel\" | out-null
# Ouvrir Excel
$ExcelApplication = New-Object -ComObject \"Excel.Application\"
$ExcelApplication.Visible = $true
# ouvrir les deux fichiers à comparer
$Destination = $ExcelApplication.Workbooks.Open(\"DESTINATION3.xlsx\"«»)
$Source = $ExcelApplication.Workbooks.Open(\"SOURCE3.xlsx\"«»)
# définire les feuilles à comparer de chaque fichiers
$wsD = $Destination.Worksheets.item(1)
$wsS = $Source.Worksheets.item(1)
# définire la dernière colonne et la dernière ligne
$lastCol = $wsD.UsedRange.columns.count
$lastrow = $wsD.UsedRange.rows.count
# copier l'entête
$rng1=\"F1:G2\"
$rng2 = $wsD.Range($wsD.Cells(1 , $lastCol + 2), $wsD.Cells(2 , $lastCol +3))
$Destination.Activate()
$wsD.Range($rng1).Copy()
$wsD.Cells(1 , $lastCol + 1).select()
$wsD.Paste()
$wsD.Cells(1 , $lastCol + 1).value = $Mois
#Trier la feuille du document Destination et la feuille du document Source
Tri-Plage $wsD 3 \"A3\"
Tri-Plage $wsS 2 \"A2\"
# recupérer les données des colonnes à comparer
$DestinationData = Get-WorkbookData $Destination 3 # à partir de la ligne 3 à cause de l'entête
$SourceData = Get-WorkbookData $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 \"Logiciel\" -IncludeEqual:$true
# table d'hachage (les résultats de recherche sont stockés dedans)
$LogicielToMark = @()
$LogicielToCopy = @()
$Comparison | %{
if ($_.SideIndicator -eq \"<=\"«») {
$LogicielToMark += $_.Logiciel
}
Else{ if ($_.SideIndicator -eq \"==\"«»){
$LogicielToCopy += $_.Logiciel
}
}
}
# execution opérations coloration et mise à jour
Update-Destination $LogicielToMark $LogicielToCopy
#Trier la feuille du document Destination aprés la mise à jour
Tri-Plage $wsD 3 \"A3\"
# ajuster le format de la feuille du document Destination
$lastrow = $wsD.UsedRange.rows.count
$objRange = $wsD.Range($wsD.Cells(3, 1), $wsD.Cells($lastrow , $lastCol +2))
7..12 | ForEach {
$objRange.Borders.Item($_).LineStyle = 1
$objRange.Borders.item($_).Weight = -4138
$objRange.Borders.item($_).Color = 0
}
# selectionner la cellule A1, c'est pas obligatoire
$wsD.Range(\"A1\"«»).select()
$Destination.close($true) # sauvegarder le fichier Destination
$Source.close($true) # sauvegarder le fichier Source
$ExcelApplication.Quit() # fermer Excel
Remove-Variable * -ErrorAction SilentlyContinue #vider les variables
[gc]::collect() # terminer les Processus Excel
}[/code:1]
Bonne chance et surtout surtout surtout ne plus rien dire
bon je me suis concentré sur ton script une fois pour toute afin de finir cette histoire
premièrement tu copies tes formules dans les colonnes D et E jusqu'à la dernière ligne \"NON VIDE\"! et tu sauvegardes ton fichier destination.
Aprés utilise le script, il insert lui même tes formules dans les nouvelles lignes.
[code:1]# InputBox pour inserer le bon mois
Add-type -AssemblyName \"Microsoft.VisualBasic\"
$Mois = [Microsoft.VisualBasic.Interaction]::InputBox(\"Entrez le mois et l'année au format 'Janvier 19'\", \"Nouvel mois\"«»)
# si le nom du mois est vide on quitte le script
if ($Mois) {
# 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(\"A\" + $Row).Text
while ($Logiciel.Length) {
$obj = @{
\"Logiciel\" = $Logiciel;
}
New-Object –Typename PSObject –Prop $obj
$Row++
$Logiciel = $Workbook.ActiveSheet.Range(\"A\" + $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($LogicielToMark, $LogicielToCopy) {
$Source.Activate()
$Row = 1
$Logiciel = $Source.ActiveSheet.Range(\"A\" + $Row).Text
while ($Logiciel.Length) {
if ($LogicielToMark -contains $Logiciel) {
$Source.Activate()
$Source.ActiveSheet.Range(\"A\" + $Row).copy()
$Destination.Activate()
$lastRow = $wsD.UsedRange.rows.count + 1
$wsD.Range(\"A\" + $lastRow).select()
$Destination.ActiveSheet.Paste()
$wsD.Range(\"D\" + ($lastRow -1) + \":E\" + ($lastRow -1)).copy() # copier les formules pour calculer le Cumul
$wsD.Range(\"D\" + $lastRow).select()
$Destination.ActiveSheet.Paste() # coller les formules pour calculer le Cumul
$Source.ActiveSheet.Range(\"B\" + $Row).copy()
$wsD.Cells($lastRow, $lastCol + 2).select()
$Destination.ActiveSheet.Paste()
$Source.ActiveSheet.Range(\"C\" + $Row).copy()
$wsD.Cells($lastRow, $lastCol +1).select()
$Destination.ActiveSheet.Paste()
$Source.ActiveSheet.Range(\"A\" + $Row).Cells.Font.ColorIndex = 3
}
Else {
if ($LogicielToCopy -contains $Logiciel) {
$Source.Activate()
$CurrentRow = $wsD.Columns.item(1).find($Logiciel).row
$Source.ActiveSheet.Range(\"B\" + $Row).copy()
$Destination.Activate()
$wsD.Cells($CurrentRow , $lastCol + 2).select()
$Destination.ActiveSheet.Paste()
$Source.ActiveSheet.Range(\"C\" + $Row).copy()
$wsD.Cells($CurrentRow , $lastCol +1).select()
$Destination.ActiveSheet.Paste()
}
}
$Row++
$Logiciel = $Source.ActiveSheet.Range(\"A\" + $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 \"Microsoft.Office.Interop.Excel\" | out-null
# Ouvrir Excel
$ExcelApplication = New-Object -ComObject \"Excel.Application\"
$ExcelApplication.Visible = $true
# ouvrir les deux fichiers à comparer
$Destination = $ExcelApplication.Workbooks.Open(\"DESTINATION3.xlsx\"«»)
$Source = $ExcelApplication.Workbooks.Open(\"SOURCE3.xlsx\"«»)
# définire les feuilles à comparer de chaque fichiers
$wsD = $Destination.Worksheets.item(1)
$wsS = $Source.Worksheets.item(1)
# définire la dernière colonne et la dernière ligne
$lastCol = $wsD.UsedRange.columns.count
$lastrow = $wsD.UsedRange.rows.count
# copier l'entête
$rng1=\"F1:G2\"
$rng2 = $wsD.Range($wsD.Cells(1 , $lastCol + 2), $wsD.Cells(2 , $lastCol +3))
$Destination.Activate()
$wsD.Range($rng1).Copy()
$wsD.Cells(1 , $lastCol + 1).select()
$wsD.Paste()
$wsD.Cells(1 , $lastCol + 1).value = $Mois
#Trier la feuille du document Destination et la feuille du document Source
Tri-Plage $wsD 3 \"A3\"
Tri-Plage $wsS 2 \"A2\"
# recupérer les données des colonnes à comparer
$DestinationData = Get-WorkbookData $Destination 3 # à partir de la ligne 3 à cause de l'entête
$SourceData = Get-WorkbookData $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 \"Logiciel\" -IncludeEqual:$true
# table d'hachage (les résultats de recherche sont stockés dedans)
$LogicielToMark = @()
$LogicielToCopy = @()
$Comparison | %{
if ($_.SideIndicator -eq \"<=\"«») {
$LogicielToMark += $_.Logiciel
}
Else{ if ($_.SideIndicator -eq \"==\"«»){
$LogicielToCopy += $_.Logiciel
}
}
}
# execution opérations coloration et mise à jour
Update-Destination $LogicielToMark $LogicielToCopy
#Trier la feuille du document Destination aprés la mise à jour
Tri-Plage $wsD 3 \"A3\"
# ajuster le format de la feuille du document Destination
$lastrow = $wsD.UsedRange.rows.count
$objRange = $wsD.Range($wsD.Cells(3, 1), $wsD.Cells($lastrow , $lastCol +2))
7..12 | ForEach {
$objRange.Borders.Item($_).LineStyle = 1
$objRange.Borders.item($_).Weight = -4138
$objRange.Borders.item($_).Color = 0
}
# selectionner la cellule A1, c'est pas obligatoire
$wsD.Range(\"A1\"«»).select()
$Destination.close($true) # sauvegarder le fichier Destination
$Source.close($true) # sauvegarder le fichier Source
$ExcelApplication.Quit() # fermer Excel
Remove-Variable * -ErrorAction SilentlyContinue #vider les variables
[gc]::collect() # terminer les Processus Excel
}[/code:1]
Bonne chance et surtout surtout surtout ne plus rien dire
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.034 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- [Résolu] Fusion fichier Excel avec Powershell