Question Recherche Excel - Suite

Plus d'informations
il y a 12 ans 11 mois #14637 par yunyun
Recherche Excel - Suite a été créé par yunyun
Bonjour à tous, j'ai pu terminer le mon projet utilisant Excel.

Cependant je suis confronté à une certaine lenteur vis-à-vis de l'execution d'une recherche dans mon fichier Excel. Est t'il possible d'accélérer cette recherche ? De l'optimiser ? En effet je dois executer mon script à chaque démarrage de session sur un parc relativement vaste et cela pourrait ralentir considérablement certaines machines

Je vous remercie par avance pour votre aide :side:

[code:1]
#Ouverture Excel
$appexcel = New-Object -comobject Excel.Application
$appexcel.Visible = $false
#Déclaration du classeur
$classeur = $appexcel.Workbooks.open(\"C:\Documents and Settings\jfcarrere\Mes documents\TableauCharte.xlsx\"«»)
#Déclaration Feuille de travail
$c = $classeur.Worksheets.Item(1)
$c.activate()

#Recherche signature charte
$ligne = 2
$col = 2
$chartsignee = 0

for ( $i = 0; $i -le 700; $i++ ){

#Arrete la recherche si la signature est trouvée
if($c.Cells.Item($ligne, $col).Value() -match $env:username){
$chartsignee = 1
Break
}
#Lis le nom suivant si la signature n'est pas trouvée
elseif($c.Cells.Item($ligne, $col).Value() -notmatch $env:username){
$ligne++
#Arrête la recherche de signature si tout les noms ont été lus
if($c.Cells.Item($ligne, 1).Value() -eq $Null){
Break
}
}
}

#Arrêt du programme si charte déjà signée
if($chartsignee -eq 1){
#Fermeture Excel
$classeur.Save()
$classeur.close()
$appexcel.quit()
}

if($chartsignee -eq 0){
#Definition de la fenêtre -> $form
$form = new-object Windows.Forms.form
$form.Size = new-object System.Drawing.Size @(300,150)
$form.Text = \"Charte Informatique\"
#Affiche les contrôles (en haut à droite).
$form.ControlBox = 0
#Affiche la fenêtre dans la bar des tâches.
$form.ShowInTaskbar = 1
#Affiche la fenêtre toujours au premier plan.
$form.TopMost = 1
$form.autoscale = $false
$form.FormBorderStyle = 'Fixed3D'

#Definition du bouton valider -> $boutton1
$boutton1 = new-object System.Windows.Forms.Button
$boutton1.Text = 'VALIDER'
$boutton1.Location = new-object System.Drawing.Size(30,25)
$boutton1.size = new-object System.Drawing.Size(90,30)
$boutton1.add_Click({$label1.text = \"Vous avez accepté la charte informatique\"
$chartok = 3
$form.Close()})

#Definition de la confirmation de validation -> $label1
$label1 = New-Object System.Windows.Forms.Label
$label1.Location = new-object System.Drawing.Size(30,65)
$label1.size = new-object System.Drawing.Size(130,30)
$label1.set_ForeColor(\"Green\"«»)

#Definition du bouton valider -> $boutton2
$boutton2 = new-object System.Windows.Forms.Button
$boutton2.Text = 'REFUSER'
$boutton2.Location = new-object System.Drawing.Size(160,25)
$boutton2.size = new-object System.Drawing.Size(90,30)
$boutton2.add_Click({$label2.text = \"Vous avez refusé la charte informatique\"
$chartok = 4
$form.Close()})


#Definition de la confirmation de validation -> $label2
$label2 = New-Object System.Windows.Forms.Label
$label2.Location = new-object System.Drawing.Size(160,65)
$label2.size = new-object System.Drawing.Size(130,30)
$label2.set_ForeColor(\"Red\"«»)

#Affichage de la fenêtre
$form.Controls.Add($boutton1)
$form.Controls.Add($label1)
$form.Controls.Add($boutton2)
$form.Controls.Add($label2)

$Form.Add_Shown({$form.Activate()})
[void]$form.showdialog()

#Signature de la charte automatique si appui sur VALIDER
if($chartok -eq 3){

$ligne = 2
$col = 1

#Recherche première ligne vide
while($c.Cells.Item($ligne, 1).Value() -ne $Null){
$ligne++
}

#Ecriture
#Heure signature charte
$c.Cells.Item($ligne,$col) = get-date
$col++
#Nom d'utilisateur ayant ouvert la session
$c.Cells.Item($ligne,$col) = $env:username
$ligne++

#Fermeture Excel
$classeur.Save()
$classeur.close()
$appexcel.quit()
}

#Redémarrage de l'ordinateur si appui sur refuser
if($chartok -eq 4){
#Redémarrage de l'ordinateur - invite de commandes
#cmd.exe /C 'shutdown -r -t 60 -c \"Vous avez refusé la charte informatique - Redémarage\"'
#Déconnexion utilisateur - invite de commandes
cmd.exe /C 'logoff.exe'
}
}[/code:1]<br><br>Message édité par: yunyun, à: 23/04/13 17:01

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

Plus d'informations
il y a 12 ans 11 mois #14640 par Matthew BETTON
Réponse de Matthew BETTON sur le sujet Re:REcherche Excel - Suite
Bonjour,

N'y a t'il pas moyen que ton script travaille sur un fichier au format csv (récupérer chaque ligne en tant que objet dont les propriétés sont les colonnes, via la Cmdlet Import-CSV), plutôt que de travailler sur du .xls via l'objet COM 'Excel.Application' ?

Via cette dernière solution, question performances, ça ne sera effectivement pas fabuleux ...

@ +

Matthew BETTON

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

Plus d'informations
il y a 12 ans 11 mois #14659 par yunyun
Réponse de yunyun sur le sujet Re:REcherche Excel - Suite
Je devais conserver ce format Excel car il doit être lisible à envie par le plus grand nombre.

J'ai trouvé le moyen d'effectuer la recherche de façon bien plus effective à l'aide du code suivant en lieu et place de ma boucle for. La nouvelle recherche ne dure même pas 3s pour recherche sur 500 ligne au lieu de plus de 2m30 auparavant :

[code:1]$range = $classeur.sheets.item(1).Range(\&quot;B1:B500\&quot;«»)

#Arrete la recherche si la signature est trouvée
if($range.value2 -contains $env:username){
$chartsignee = 1
}
[/code:1]

Le code final permet donc de :
-&gt; Vérifier que l'utilisateur a déjà accepter la charte au moyen d'un recherche dans le fichier Excel

-&gt; Lui afficher la charte et lui proposer de la signer s'il ne l'a pas déjà fait, si la charte est déjà signée le script est terminé

-&gt; Lui afficher la charte simultanément à une boite permettant d'accepter ou de refuser la charte.

-&gt; En fonction de sa réponse :
- Enregistrer sa signature dans le fichier Excel ainsi que l'heure de celle-ci pour recherche ultérieure
- Fermer la session

Le code final complet est le suivant :

[code:1]
#Ouverture Excel
$appexcel = New-Object -comobject Excel.Application
$appexcel.Visible = $false
#Déclaration du classeur
$classeur = $appexcel.Workbooks.open(\&quot;XXX CHEMIN D'ACCES TABLEAU\&quot;«»)
#Déclaration Feuille de travail
$c = $classeur.Worksheets.Item(1)
$c.activate()

#Recherche signature charte
$ligne = 2
$col = 2
$chartsignee = 0

$range = $classeur.sheets.item(1).Range(\&quot;B1:B500\&quot;«»)

#Arrete la recherche si la signature est trouvée
if($range.value2 -contains $env:username){
$chartsignee = 1
}


#Fermeture Excel
$classeur.Save()
$classeur.close()
$appexcel.quit()

if($chartsignee -eq 0){
#Definition de la fenêtre -&gt; $form
$form = new-object Windows.Forms.form
$form.Size = new-object System.Drawing.Size (300,150)
$form.StartPosition = \&quot;Manual\&quot;
$form.Location = new-object System.Drawing.Size (5,5)
$form.Text = \&quot;Charte Informatique\&quot;
#Affiche les contrôles (en haut à droite).
$form.ControlBox = 0
#Affiche la fenêtre dans la bar des tâches.
$form.ShowInTaskbar = 1
#Affiche la fenêtre toujours au premier plan.
$form.TopMost = 1
$form.autoscale = $false
$form.FormBorderStyle = 'Fixed3D'


#Definition du bouton valider -&gt; $boutton1
$boutton1 = new-object System.Windows.Forms.Button
$boutton1.Text = 'ACCEPTER'
$boutton1.Location = new-object System.Drawing.Size(30,25)
$boutton1.size = new-object System.Drawing.Size(90,30)
$boutton1.add_Click({$label1.text = \&quot;Vous avez accepté la charte informatique\&quot;
$chartok = 3
$form.Close()})

#Definition de la confirmation de validation -&gt; $label1
$label1 = New-Object System.Windows.Forms.Label
$label1.Location = new-object System.Drawing.Size(30,65)
$label1.size = new-object System.Drawing.Size(130,30)
$label1.set_ForeColor(\&quot;Green\&quot;«»)

#Definition du bouton valider -&gt; $boutton2
$boutton2 = new-object System.Windows.Forms.Button
$boutton2.Text = 'REFUSER'
$boutton2.Location = new-object System.Drawing.Size(160,25)
$boutton2.size = new-object System.Drawing.Size(90,30)
$boutton2.add_Click({$label2.text = \&quot;Vous avez refusé la charte informatique\&quot;
$chartok = 4
$form.Close()})


#Definition de la confirmation de validation -&gt; $label2
$label2 = New-Object System.Windows.Forms.Label
$label2.Location = new-object System.Drawing.Size(160,65)
$label2.size = new-object System.Drawing.Size(130,30)
$label2.set_ForeColor(\&quot;Red\&quot;«»)

#Affichage de la fenêtre
$form.Controls.Add($boutton1)
$form.Controls.Add($label1)
$form.Controls.Add($boutton2)
$form.Controls.Add($label2)

#Ouvre la charte en pdf
start-process (\&quot;XXX CHEMIN D'ACCES CHARTE\&quot;«») -windowstyle Maximized

#Ouvre la fenêtre de dialogue
$Form.Add_Shown({$form.Activate()})
[void]$form.showdialog()


#Signature de la charte automatique si appui sur ACCEPTER
if($chartok -eq 3){

#Ouverture Excel
$appexcel = New-Object -comobject Excel.Application
$appexcel.Visible = $false
#Déclaration du classeur
$classeur = $appexcel.Workbooks.open(\&quot;XXX CHEMIN D'ACCES TABLEAU\&quot;«»)
#Déclaration Feuille de travail
$c = $classeur.Worksheets.Item(1)
$c.activate()

$ligne = 2
$col = 1

#Recherche première ligne vide
while($c.Cells.Item($ligne, 2).Value() -ne $Null){
$ligne++
}

#Enregistrement signature
#Heure signature charte
$c.Cells.Item($ligne,$col) = get-date
$col++
#Nom d'utilisateur ayant ouvert la session
$c.Cells.Item($ligne,$col) = $env:username
$col++

$c.Cells.Item($ligne,$col) = \&quot;A signé la charte informatique\&quot;
#Colorer case ?
#$c.Cells.Item($ligne,$col).interior.colorindex = 4

#Fermeture Excel
$classeur.Save()
$classeur.close()
$appexcel.quit()
}

#Si appui sur bouton REFUSER
if($chartok -eq 4){

#Déconnexion utilisateur - invite de commandes
cmd.exe /C 'logoff.exe'
}
}[/code:1]

Qu'en pensez vous ?<br><br>Message édité par: yunyun, à: 23/04/13 16:46

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

Plus d'informations
il y a 12 ans 10 mois #14665 par Matthew BETTON
Réponse de Matthew BETTON sur le sujet Re:REcherche Excel - Suite
Bonsoir,

Qu'en pensez vous ?


Pour être clair :

- Je trouve qu'il y a du boulot
- Je vous félicite parce que vous êtes parvenu à votre fin
- Je trouve la solution difficile à maintenir pour une autre personne : Vous comprenez votre script parce que c'est vous qui l'avez développé.

Difficile de vous en dire plus, ne connaissant pas le contexte d'application, les impacts, etc... et ne connaissant pas non plus le fameux fichier excel utilisé en entrée de votre script.

Je devais conserver ce format Excel car il doit être lisible à envie par le plus grand nombre.


Je pense qu'il y a confusion entre :

- Ce que les utilisateurs observerons lorsqu'ils ouvriront leur session et qu'ils n'auront, malheureusement, pas signé la fameuse charte ;
- Le document Excel qui est fourni à titre de consultation.

Développer un bout de code pour se \&quot;balader\&quot; dans un fichier Excel et y trouver des informations, ce n'est pas courant, notamment sous PowerShell. Ça l'est encore moins lorsqu'il s'agit de le faire lors de l'ouverture de session d'un utilisateur.

Votre solution \&quot;ne dure même pas 3s\&quot; : Ok, mais dans quel contexte ? 18 000 utilisateurs ? Le lundi matin lorsque tout le monde arrive au travail et se connecte ? Tout est relatif :)

Le genre de chose pour lequel, à une époque (parce que maintenant les projets se montent à des allures qui ne le permettent pas... ou que des personnes on choisi de supprimer pour gagner autre chose :whistle: ) il pouvait être demandé / nécessaire / impératif! de faire une capture réseau, d'analyser, de fournir des chiffres, de valider, d'assumer puis de mettre en production (je n'ai pas dit \&quot;assumer après avoir mis en production\&quot; ;) ).

Cela reste évidemment mon avis personnel...

2 questions qui me viennent à l'esprit :

- Si une personne, autre que vous, modifie votre fichier Excel, garantissez vous que votre code continuera de fonctionner ?

- Si 2 utilisateurs, ou plus, accèdent en même temps au fameux fichier Excel, que se passe-t'il ?

Bonne soirée

Matthew BETTON<br><br>Message édité par: Matthew BETTON, à: 23/04/13 22:23

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

Plus d'informations
il y a 12 ans 10 mois #14667 par yunyun
Réponse de yunyun sur le sujet Re:REcherche Excel - Suite
Pour vous permettre de comprendre le contexte je vais m'autoriser de vous le décrire :whistle:

Je suis en stage depuis deux semaines au sein d'une association d'environ 500 personnes au côté du responsable informatique.

Etant très très occupé il n'a que très peu de temps (entre la maintenance des serveurs, celle du parc, et les pannes géniales que certains utilisateurs arrivent à nous présenter)à consacrer à l'automatisation de certaines tâches. Dans ce cadre il m'a demandé de me renseigner sur le PowerShell et de commencer par réaliser \&quot;un script permettant de faire signer à tout le monde la charte informatique\&quot;, cela ayant bien évidemment vocation à servir inciter à la respecter en pouvant leur rappeler quand bon lui semble qu'ils ont signé celle-ci, garder une preuve de leur signature qui leur paraitra concrète est donc très important dans ce cadre (on en a qui ne savent pas ce qu'est le menu démarrer quand même !).

Si une personne, autre que vous, modifie votre fichier Excel, garantissez vous que votre code continuera de fonctionner ?


Non il ne fonctionnera plus forcément, mais le fichier qui sera modifié en temps réel et sur lequel chaque utilisateur disposera des droits d'écriture doit être caché.

Une copie consultable en lecture seule (par réplication) leur sera accessible plus facilement je pense.

Si 2 utilisateurs, ou plus, accèdent en même temps au fameux fichier Excel, que se passe-t'il ?


Pour l'un le fichier s'ouvrira et se fermera de façon automatique.

Pour l'autre une copie s'enregistre après une ouverture en lecture seule. C'est pour cela que réduire le temps d'accès (en plus de la variable confort qui est évidemment importante) était important. C'est également pour ca que je referme le fichier au milieu du script pour l'ouvrir à nouveau par la suite.

Il s'agit de mon premier script terminé, je ne peux etre que d'accord quand à votre point de vue sur une utilisation à très grande échelle, et vos solutions et idées qui pourraient l'améliorer sont les bienvenues !

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

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