Question [Résolu] Fusion fichier Excel avec Powershell

Plus d'informations
il y a 7 ans 2 mois #28455 par Hicham Madini
Bonjour Atou,

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 :P

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 :laugh:

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.

Plus d'informations
il y a 7 ans 2 mois #28464 par Hicham Madini
Bonjour Atou,

bon je me suis concentré sur ton script une fois pour toute afin de finir cette histoire :D
premièrement tu copies tes formules dans les colonnes D et E jusqu'à la dernière ligne \&quot;NON VIDE\&quot;! 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 \&quot;Microsoft.VisualBasic\&quot;
$Mois = [Microsoft.VisualBasic.Interaction]::InputBox(\&quot;Entrez le mois et l'année au format 'Janvier 19'\&quot;, \&quot;Nouvel mois\&quot;«»)

# 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(\&quot;A\&quot; + $Row).Text
while ($Logiciel.Length) {
$obj = @{
\&quot;Logiciel\&quot; = $Logiciel;
}
New-Object –Typename PSObject –Prop $obj
$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($LogicielToMark, $LogicielToCopy) {
$Source.Activate()
$Row = 1
$Logiciel = $Source.ActiveSheet.Range(\&quot;A\&quot; + $Row).Text
while ($Logiciel.Length) {
if ($LogicielToMark -contains $Logiciel) {
$Source.Activate()
$Source.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()
$wsD.Range(\&quot;D\&quot; + ($lastRow -1) + \&quot;:E\&quot; + ($lastRow -1)).copy() # copier les formules pour calculer le Cumul
$wsD.Range(\&quot;D\&quot; + $lastRow).select()
$Destination.ActiveSheet.Paste() # coller les formules pour calculer le Cumul
$Source.ActiveSheet.Range(\&quot;B\&quot; + $Row).copy()
$wsD.Cells($lastRow, $lastCol + 2).select()
$Destination.ActiveSheet.Paste()
$Source.ActiveSheet.Range(\&quot;C\&quot; + $Row).copy()
$wsD.Cells($lastRow, $lastCol +1).select()
$Destination.ActiveSheet.Paste()
$Source.ActiveSheet.Range(\&quot;A\&quot; + $Row).Cells.Font.ColorIndex = 3
}
Else {
if ($LogicielToCopy -contains $Logiciel) {
$Source.Activate()
$CurrentRow = $wsD.Columns.item(1).find($Logiciel).row
$Source.ActiveSheet.Range(\&quot;B\&quot; + $Row).copy()
$Destination.Activate()
$wsD.Cells($CurrentRow , $lastCol + 2).select()
$Destination.ActiveSheet.Paste()
$Source.ActiveSheet.Range(\&quot;C\&quot; + $Row).copy()
$wsD.Cells($CurrentRow , $lastCol +1).select()
$Destination.ActiveSheet.Paste()
}

}
$Row++
$Logiciel = $Source.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

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

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

# 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=\&quot;F1:G2\&quot;
$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 \&quot;A3\&quot;
Tri-Plage $wsS 2 \&quot;A2\&quot;

# 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 \&quot;Logiciel\&quot; -IncludeEqual:$true

# table d'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 $LogicielToMark $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
$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(\&quot;A1\&quot;«»).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 :laugh:

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

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