Instabilité de code
Bonsoir
en general c'est pas là qu'il y a conflit avec le clipboard
copypicture xlscreen,xlbitmap ne necessite pas de gestion d'attente
c'est plûtot après cette ligne que ca se gate avec les clipboard en 64 bit qui sont un peu lent
a moins que tu le fasse plusieurs fois d'affilé(au quel cas j'ai la solution )
le projet c'est quoi
que veux tu faire de cette capture ?
re,
Un test, 100 fois créer votre signature en 20 sec sans erreur fatal, un problème = quand copypicture n'était prêt du premier coup.. Il y aura 100 fichiers "jpg" dans votre répértoire, chaqu'un avec un autre numéro dans les cellules vertes.
Bonjour BsAIv
comme je l'ai dit précédemment
ce n'est pas le .copypicture qui est en erreur (même si la ligne pointé est cette ligne)
le problême est la gestion de capacité du clipboard en terme d'octet et donc aussi en terme de temps
car
- il lui faut du temps pour digérer le copy(emmagasiner le les data ( en windows meta file puisque XLPICTURE)de la copy
- et il lui faut du temps pour se libérer du delete du chart car il est en memoire aussi
- sans parler des autres variables
ensuite les gestion d'erreur c'est bien mais si on peut éviter c'est mieux
car là aussi le stack d'erreur a ses limites
alors certes ca fait passer la dinde dans le gosier mais ca mange de la memoire pour le reste de l'utilisation de excel(même instances)
donc je te propose de reprendre ton truc
1° je vais créer le graph d'export qu'une fois il est contenu dans une variable STATIC
2° je vais le créer sur la feuille active' en effet il n'est pas obligé d'être sur la feuille de la plage concernée par la copie tes alignement on ne gere pas l'erreur on teste 3° et je vais le placer en dehors de la plage même si je ne suis pas sur la feuille concernée pour eviter de copier une partie du graph dans la capture
4° pour tes alignements on test d'abords d'abords si c'est fait et si c'est alors on le fait
5° une fois le copy effectuer on active le chart( au cas ou la copy serait une plage d'une autre feuille(IMPORTANT à partir de office 2013)
6° ta boucle d'attente on while avec les deux condition pictures.count 0 et cnt<1000 on fait sauter ta ligne if
7° car en effet ces deux conditionS pour la boucle s'exeptent et s'accorde en même temps ( ca c'est juste une facon de raisonner et donc de manière de coder )
8° une fois exporté on delete pas le graph on le vide de sa picture
9° une fois la sub teerminé elle est rapellé le graph est deja là (donc economie d'uc)
donc en résumé
on lance la sub dans une boucle de 1 à 100
la premiere fois elle crée le graph et fait le job
toutes les autres fois elle fait juste le job
et tu constatera qu'il n'y a aucune gestion d'erreur
mon chrono dans les captures un peu plus bas parle de lui même
voila
Public b1, i
Sub Signatures_100_Fois()
Dim cnt As Integer
t0 = Timer
For i = 1 To 100 'parcourir la macro "Signature ..." 100 fois
If b1 Then cnt = cnt + 1: b1 = False
Sheets("GESTION").Range("N2").Resize(, 2).Value = Array(i, Now) 'numéro et temps dans N2:O2
Signature_Click
Next
MsgBox "100 loops in " & Format(Timer - t0, "0.00") & vbLf & cnt & " ""problème(s)"" cependant"
Application.ScreenUpdating = True
End Sub
Sub Signature_Click()
Static graph As ChartObject
Dim Plage As Range, cnt&, Chemin$
Chemin = ThisWorkbook.Path & "\" & "signaturetemp_" & i & ".jpg"
If Dir(Chemin) <> "" Then Kill Chemin 'on ecrase l'existant
Application.ScreenUpdating = False
With Sheets("GESTION")
DoEvents
.Range("M2").Value = "ComboBox2" & " " & "TextBox1" & " " & "TextBox2"
.Range("M3").Value = "TextBox5"
.Range("M4").Value = "ComboBox3"
'__________________________________________________
'ajouter l'image de la Cie
'__________________________________________________
Set Plage = .Range("M2:P4")
If Plage.VerticalAlignment <> xlCenter Then Plage.VerticalAlignment = xlCenter
If Plage.HorizontalAlignment <> xlCenter Then Plage.HorizontalAlignment = xlCenter
'On ne le crée qu'une fois le graphique(merci pour la mémoire et l'UC ) :):):)
'on place le graph en dehors de la plage -)
'(pour ne pas le capturer avec si le sheet actif est le même que le parent de la plage capturée )
If graph Is Nothing Then
Set graph = ActiveSheet.ChartObjects.Add(Plage.Left + Plage.Width + 20, Plage.Top, Plage.Width, Plage.Height)
ActiveSheet.Shapes(graph.Name).Line.Visible = False 'on lui enlève les bordures
End If
Plage.CopyPicture xlScreen, xlPicture
'DoEvents 'pas vraiment utile mais bon
With graph
'on boucle tant qu'il n'y a pas d'image dans le graph et que cnt est plus petit que 100
'ces deux condition sont complementaitaire et en même temps s'exepte l'une de l'autre
Do While .Chart.Pictures.Count = 0 And cnt < 1000
.Activate
.Chart.Paste
DoEvents
cnt = cnt + 1
Loop
.Chart.Export Chemin, "jpg"
.Chart.Pictures(1).Delete
Do While .Chart.Pictures.Count > 0: DoEvents: Loop
End With
If i = 100 Then graph.Delete: Set graph = Nothing
Set Plage = Nothing
End With
End Subtestete a partir de la feuille ou la plage se trouve et test à partir de l'autre feuille
copie à partir de la feuille ou se trouve la plage
copie à partir de l'autre feuille
re,
supér !!!
On ne doit pas faire ce boucle de 100 fois, mais c'était pour prouver que la macro "Signature_Click" n'était plus instable.
re
oui j'avais compris que la boucle etait pour le test de solidité (raisonnement /code)
en tout cas comme tu le vois
toi en gérant des erreurs tu y arrive en 20 sec
moi sans gestion et surtout sans erreurs je suis à entre 4 et 5 sec
ne pas oublier que quand on fait une copiepicture de la plage d'une autre feuille avant le paste un ".Activate" est necessaire pour le graph
c'est comme ça depuis 2013
Bonjour à vous deux,
merci des réponse, désolé j'étais en vacance et je ne me suis plus penché sur le sujet.
Me voila revenu.
@PatrickT : mon objectif c'est de créer une signature qui sera stocké dans mon fichier excel pour chaque personnel existant. Et chaque fois que ce personnel clique pour signer le document, on récupère cette image.
Mais il peut nous arriver de rajouter plusieurs personnes en même temps et c'est là que le code beug.
je vais tester ton code dans la semaine quand j'aurai du temps.
@BsAlv, je vais regarder également le fichier fourni.
je reviens vers vous deux pour vous donnez celle utilisée. ;)
Salut,
Combien de signatures, donc d'images? tu dois gérer au maximum ?
@Jean-Paul franchement c'est très aléatoire mais rarement plus de 5.