Question Gestion date Excel avec Powershell

Plus d'informations
il y a 5 ans 1 mois #28493 par Hicham Madini
Mlle Charlotte s'il te plaît :laugh:

Mais avec plaisir Atou, bonne chance et à la prochaine.<br><br>Message édité par: hichammadd, à: 18/03/19 09:40

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

Plus d'informations
il y a 5 ans 1 mois #28512 par Atou
Réponse de Atou sur le sujet Re:Gestion date Excel avec Powershell
Nouvelle contrainnnnte :

Je me suis mal compris avec ma chef ...

Concernant mon script, je dois mettre en vert ou en rouge les logiciels qui sont utilisés plus de 100h ou moins de 10h ...
Donc il faut faire une addition des deux \&quot;cumul\&quot; et si leur temps est supérieur à 100h on colorie en vert et si le temps est inférieur à 10h, on colorie en rouge ...

Lorsque cela est fait je doit également trier la colonne des logiciels suivant leur couleurs, regrouper les logiciels par couleur ...

Je vais essayer quelques trucs mais je ne pense pas savoir faire le tri par couleur si tu peux m'aider ...

Merci d'avance ;)

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

Plus d'informations
il y a 5 ans 1 mois #28513 par Atou
Réponse de Atou sur le sujet Re:Gestion date Excel avec Powershell
J'ai pensé à sa pour colorier les logiciels :

[code:1]
for ($i = 3; $i -le $lastrow; $i++) {

# On va tout d'abord à la colonne numéro 5(E) puis à la colonne numéro 7(G)
for ($j = 5 ; $j -le 7; $j += 2){
$wsD.Cells(\&quot;A\&quot; + $j)|%{ if($_.value2 -ge 4.16666666666667){ $_.interior.colorindex = 4 } }
$wsD.Cells(\&quot;A\&quot; + $j)|%{ if($_.value2 -le 0.416666666666667){ $_.interior.colorindex = 3 } }
$wsD.Cells(\&quot;A\&quot; + $j)|%{ if($_.value2 -gt 0.416666666666667 -and $_.value2 -lt 4.16666666666667 ){ $_.interior.colorindex = 5 } }
}
}
[/code:1]

Mais bon visiblement quand je met \&quot;A\&quot; au lieu de $i, sa ne lui plaît pas :pinch:

J'ai également essayer de faire l'addition des deux cumul et sa ne lui plaît pas non plus :S

Message édité par: Atou45, à: 20/03/19 08:52<br><br>Message édité par: Atou45, à: 20/03/19 09:07

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

Plus d'informations
il y a 5 ans 1 mois #28514 par Atou
Réponse de Atou sur le sujet Re:Gestion date Excel avec Powershell
Voilà tout le script si tu en a besoin :

[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 2019'\&quot;, \&quot;Nouveau 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;:G\&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 de façon alphabétique
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;E:\SCRIPT TOTAL\DESTINATION4.xlsx\&quot;«»)
$Source = $ExcelApplication.Workbooks.Open(\&quot;E:\SCRIPT TOTAL\graph_app_ZAV.xlsm\&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;

# Récupé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
}
}
}

# Exécution 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
}

# Remplissage des cellules suivant le temps d'utilisation, si &gt; 100h = vert, si &lt; 10h = rouge
# On commence à i = 3 pour éviter l'entête et on va jusque la dernière ligne de la liste des logiciels
for ($i = 3; $i -le $lastrow; $i++) {

# On va tout d'abord à la colonne numéro 5(E) puis à la colonne numéro 7(G)
for ($j = 5 ; $j -le 7; $j += 2){
$wsD.Cells(\&quot;A\&quot; + $j)|%{ if($_.value2 -ge 4.16666666666667){ $_.interior.colorindex = 4 } }
$wsD.Cells(\&quot;A\&quot; + $j)|%{ if($_.value2 -le 0.416666666666667){ $_.interior.colorindex = 3 } }
$wsD.Cells(\&quot;A\&quot; + $j)|%{ if($_.value2 -gt 0.416666666666667 -and $_.value2 -lt 4.16666666666667 ){ $_.interior.colorindex = 5 } }
}
}

# Sélectionner 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 pour pouvoir ré-exécuter le script si plusieurs mois doivent êtres ajoutés
[gc]::collect() # Terminer les processus Excel
}

[/code:1]<br><br>Message édité par: Atou45, à: 20/03/19 09:07

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

Plus d'informations
il y a 5 ans 1 mois #28516 par Atou
Réponse de Atou sur le sujet Re:Gestion date Excel avec Powershell
J'ai tenté quelque chose mais visiblement c'est pas très concluant :laugh:

[code:1]
for ($i = 3; $i -le $lastrow; $i++) {
for ($j = 5 ; $j -le 7; $j += 2){
$k=1
# On va tout d'abord à la colonne numéro 5(E) puis à la colonne numéro 7(G)
$wsD.Cells($i, $k)|%{ if($wsD.Cells($i, $j)|%{ -ge 4.16666666666667}){$wsD.Cells($i, $j).interior.colorindex = 4 } }
$wsD.Cells($i, $k)|%{ if($wsD.Cells($i, $j)|%{ -le 0.416666666666667}){$wsD.Cells($i, $j).interior.colorindex = 3 } }
$wsD.Cells($i, $k)|%{ if($wsD.Cells($i, $j)|%{ -gt 0.416666666666667 -and $wsD.Cells($i, $j)|% -lt 4.16666666666667 }){ $_.interior.colorindex = 5 } }
}
}
[/code:1]

[code:1]

Exception de HRESULT : 0x800A01A8
Au caractère E:\SCRIPT TOTAL\Script Stats ZAV.ps1:171 : 9
+ $wsD.Cells($i, $k)|%{ if($wsD.Cells($i, $j)|%{ -gt 0.41666666 ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : OperationStopped: (:«») [], COMException
+ FullyQualifiedErrorId : System.Runtime.InteropServices.COMException
[/code:1]<br><br>Message édité par: Atou45, à: 20/03/19 10:48

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

Plus d'informations
il y a 5 ans 1 mois #28519 par Hicham Madini
Slt Atou,

essaie comme ca:

[code:1]for ($i = 3; $i -le $lastrow; $i++) {

$somme = $wsD.Cells($i , 5).value2 + $wsD.Cells($i , 7).value2

$somme|%{ if($_ -le 0.416666666666667){
$wsD.Cells($i , 5).interior.colorindex = 3
$wsD.Cells($i , 7).interior.colorindex = 3 } };

$somme|%{ if($_ -ge 4.16666666666667){
$wsD.Cells($i , 5).interior.colorindex = 4
$wsD.Cells($i , 7).interior.colorindex = 4 } }
}[/code:1]

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

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