Question [Résolu] Fusion fichier Excel avec Powershell

Plus d'informations
il y a 7 ans 3 mois #28316 par Hicham Madini
Ah non mais je n'ai besin de rien! le dernier poste je l'ai écrit vers midi, il y a surement un bug :D

pour ton scrit je peux pas ce weekend mais le lundi je m'y pencherais au debut de la semaine prochaine.

Bonne sourée et bon weekend

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

Plus d'informations
il y a 7 ans 3 mois #28320 par Atou
Réponse de Atou sur le sujet Re:Fusion ficier Excel avec Powershell
Bon weekend un peu en retard :pinch:

Concernant ton script, je ne comprend pas, lorsque je le lance j'ai cette erreur :

Compare-Object : Impossible de lier l'argument au paramètre « DifferenceObject », car il a la valeur Null.

Alors qu'avant tout fonctionnait parfaitement, je vais essayer de faire des recherches de mon côté je te tiens au courant si je trouve une solution. ;)

Merci d'avance

Après quelques recherches, dans tes lignes :

$OldData = Get-WorkbookData -Workbook $ExcelWorkbookOld 2
$NewData = Get-WorkbookData -Workbook $ExcelWorkbookNew 1

Le 1 et 2 correspondent aux numéro de colonne j'imagine, si c'est cela, pourquoi avoir mit un 2 ? Lorsque je modifie le 2 en 1, je n'ai plus d'erreurs mais les logiciels qui devraient être colorés en rouge ne le sont pas.

Merci d'avance ;)<br><br>Message édité par: Atou45, à: 25/02/19 07:53

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

Plus d'informations
il y a 7 ans 3 mois #28321 par Hicham Madini
Bjr,

je suis perdu avec tes postes, combien de sujet as tu ouvert?

essaie ce code avec les fichiers initials que t'as mis dans ton zip

[code:1]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+',' '
}
}

Function Mark-Users($Workbook, $UsersToMark) {
$Workbook.Activate()
$lastCol = $ExcelWorkbookOld.Worksheets.item(1).UsedRange.columns.count + 1
$Row = 1
$Logiciel = $Workbook.ActiveSheet.Range(\&quot;A\&quot; + $Row).Text
while ($Logiciel.Length) {
if ($UsersToMark -contains $Logiciel) {
$Workbook.Activate()
$lago = $Workbook.ActiveSheet.Range(\&quot;A\&quot; + $Row).copy()
$Workbook.ActiveSheet.Range(\&quot;A\&quot; + $Row).Cells.Font.ColorIndex = 3

}

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

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
$ExcelWorkbookOld = $ExcelApplication.Workbooks.Open(\&quot;DESTINATION2.xlsx\&quot;«»)
$ExcelWorkbookNew = $ExcelApplication.Workbooks.Open(\&quot;SOURCE3.xlsx\&quot;«»)

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


$UsersToMark = @()
$Comparison | %{
if ($_.SideIndicator -eq \&quot;&lt;=\&quot;«») {
$UsersToMark += $_.Logiciel
}
}

Mark-Users -Workbook $ExcelWorkbookNew -UsersToMark $UsersToMark

#$ExcelApplication.Quit()[/code:1]

le 2 et 1 (ou ici 3 et 2) sont les nombres de lignes où il doit commencer sa comparaison.

J'ai bien pensé à ton but, à mon avis Powershell n'est pas fait pour resoudre ce genre de problème, il vaut mieux passer par une macro, c'est plus rapide et plus simple je pense :D
@++

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

Plus d'informations
il y a 7 ans 3 mois #28322 par Atou
Réponse de Atou sur le sujet Re:Fusion ficier Excel avec Powershell
J'ai ouvert 2 postes mais je n'arrivais plus à accéder au premier.

J'ai également bien conscience qu'avec une macro tout cela serait simplifié mais c'est un \&quot;petit projet\&quot; qu'on me demande à mon stage ... :pinch:

Sachant que j'ai déjà un gros projet à bouclé qui est assez long je ne pense pas avoir le temps de finir celui-ci tout seul.

Il m'est demandé de faire ce script en Powershell, je n'ai donc pas le choix.

Si tu ne peux pas m'aider j'essaierais de me débrouiller même si cela sera un peu compliqué. Et si tu ne peux pas m'aider j'ai un dernier service à te demander, est ce que tu pourrais mettre un peu plus de commentaire dans ton code histoire que je comprenne à peu près tout, je fais des recherches en même temps sur internet mais je ne comprends pas tout ? :pinch:

Merci d'avance ;)<br><br>Message édité par: Atou45, à: 25/02/19 08:53

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

Plus d'informations
il y a 7 ans 3 mois #28326 par Hicham Madini
Bon si t'insiste à faire ca en Powershell, il te faut un petit plan:

voici un site qui t'aidera un peu
sqlnotesfromtheunderground.wordpress.com...nts-with-powershell/


1- definir [code:1]$wsDest = $ExcelWorkbookOld.Worksheets.item(1)
$wsSource = $ExcelWorkbookNew.Worksheets.item(1)[/code:1]
2- calculer la derniere ligne et la derniere colonne de ton fichier Destination:
[code:1]
$lastRow = $WS.UsedRange.rows.count
$lastCol = $WS.UsedRange.columns.count[/code:1]

3- copier la plage T1:U2 et l'inserer dans V1:V2
[code:1]
$range = $wsDest.Range(“T1:U2”).select
$range.Copy() | out-null
$Range = $wsDest.Range(“V1”)
$wsDest.Paste($range)[/code:1]

4- copier les differences aprés la derniere ligne de ton fichier Destination
[code:1]
$wsDest.Range(\&quot;A\&quot; + $lastRow).select()
$wsDest.Paste()
$bCell = $wsSource.Range(\&quot;B\&quot; + $Row).copy()
$wsDest.Cells($lastRow , $lastCol - 1).select()
$wsDest.Paste()
$cCell = $wsSource.Range(\&quot;C\&quot; + $Row).copy()
$wsDest.Cells($lastRow , $lastCol - 2).select()
$wsDest.Paste()[/code:1]

ici tu fais la même chose pour recuperer les les données des autres lignes

6- et enfin tu fais un tri de la table en fonction de la colonne A à partir de A3 jusqu'à la fin de la table

et c'est tout je pense

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

Plus d'informations
il y a 7 ans 3 mois #28328 par Atou
Réponse de Atou sur le sujet Re:Fusion ficier Excel avec Powershell
C'est déjà très bien mais le problème c'est que la liste de logiciels dans les deux fichiers n'est pas dans le même ordre du coup quand je vais faire mon copier-coller, rien ne sera dans le bon ordre.:blink:

J'ai intégrer ton code dans une boucle en l'adaptant et lorsque je lance mon script voila l'erreur :

Exception de HRESULT : 0x800A03EC
Au caractère E:\2K19\Scriptexcel\COMPARAISON.ps1:64 : 9
+ $wsDest.Cells($lastRow , $lastCol - 2).select()

Sachant que je suis sous Excel 2010.<br><br>Message édité par: Atou45, à: 25/02/19 10:59

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

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