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.

9arno51.xlsb (40.45 Ko)

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 Sub

testete a partir de la feuille ou la plage se trouve et test à partir de l'autre feuille

12arno51.xlsb (37.50 Ko)

copie à partir de la feuille ou se trouve la plage

demo

copie à partir de l'autre feuille

demo

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.

Rechercher des sujets similaires à "instabilite code"