[VBA] Ajouter un message si utilisateur n'a pas assez attendu

Anthonymctm

XLDnaute Occasionnel
Bonjour Le forum,

Question un peu bête mais que je ne parviens pas à résoudre :rolleyes:

Dans une partie de ma macro, je dois copier des données sur un autre logiciel.
Il y a facilement plus de 5 000 lignes générées par an, donc plus de 25 000 d'ici 5 ans.
La copie prend du temps, elle est indiqué en bas du logiciel en petit mais si on regarde pas on ne le voit pas.
Le soucis, vous l'aurez deviné, c'est que si on colle avant que ça ai finit de copier, j'ai des données incomplète (je me suis déjà fait avoir)
Actuellement ça prend 40s pour 10 000 lignes, donc 20s par année analysée.

J'arrive à modifier le timer pour que l'on calcule le temps d'attente mini, mais passé 3ans donc 60s d'attente j'arrive pas augmenter les minutes.

Faudrait pouvoir multiplier des durée mais je ne sais pas comment faire :confused:

Voici le bout de code en question :
VB:
DateDebutAnalyse = "22/12/2018"
Attente = DateDiff("yyyy", DateDebutAnalyse, Now) * 20
DébutAttente = Now
MsgBox "Avant de cliquer sur OK, copier les données de :" & vbCrLf & "Carnet des commandes clients > Analyse > Analyse globale (par cumul) > Double clique MO rélisée"
If Format(Now - DébutAttente, "hh:mm:ss") < "00:00:" & Attente Then
MsgBox "Attention, il est nécessaire d'attendre que la copie soit terminé" & vbCrLf & "Cela dure au moins 5sec par année annalysée"
End If

    With Sheets("Détails MO réel")
    .Select
    .Columns("A:O").ClearContents
    .Range("A1").Select
    .Paste 'on colle
    End With
 
Solution
re
et la voila avec un garde fou avec un delay de 10 secondes avant abandon (a toi de mettre les secondes qui te paraissent raisonnables change 10 pour ce que tu veux )
VB:
Dim pret As Boolean
Public Property Get presse_papier() As String
    presse_papier = "oui"
    On Error Resume Next
    presse_papier = CreateObject("htmlfile").parentwindow.clipboardData.GetData("TEXT")
    If Err.Number = 94 Then presse_papier = "non": Err.Clear
End Property



Sub test()
    Dim Texte$, T, T1
    T1 = Timer
    Do While presse_papier = "non"
        T = Timer: Do While Timer - T < 1: Loop
        If Timer - T1 > 10 Then Exit Do    'delay de 10 secondes avant d'avorter ; a modifier selon la tolérence souhaitée
    Loop
    If presse_papier =...

Anthonymctm

XLDnaute Occasionnel
re
peut être pourrions nous nous servir de ca justement "tant que c'est nul c'est que c'est occupé"

même operation tu copie et tu lance ceci
VB:
Dim pret As Boolean
Public Property Get presse_papier() As String
    On Error Resume Next
    presse_papier = CreateObject("htmlfile").parentwindow.clipboardData.GetData("TEXT")
End Property



Sub test()
    Dim Texte$, T
    Texte = presse_papier
    Do While pret = False
        T = Timer: Do While Timer - T < 1: Loop
        On Error Resume Next
        If Texte = presse_papier Then pret = True
        On Error GoTo 0
        Texte = presse_papier
    Loop
MsgBox "c'est pret à coller"
'activesheet.paste
End Sub
Ca ne semble pas fonctionner, le msgbox arrive dessuite.
J'ai remis ton MsgBox Right(Texte, 100) et il pop vide mais il pop quand même
 

patricktoulon

XLDnaute Barbatruc
re
VB:
Dim pret As Boolean
Public Property Get presse_papier() As String
    presse_papier = "oui"
    On Error Resume Next
    presse_papier = CreateObject("htmlfile").parentwindow.clipboardData.GetData("TEXT")
If Err.Number = 94 Then presse_papier = "non": Err.Clear
End Property



Sub test()
    Dim Texte$, T
     Do While presse_papier = "non"
        T = Timer: Do While Timer - T < 1: Loop
      Loop
MsgBox "c'est pret à coller"
MsgBox Right(presse_papier, 100)
'activesheet.paste
End Sub
 

Anthonymctm

XLDnaute Occasionnel
alors ca marche ?
Oui !
Par contre je ne suis pas sur de savoir comment vider mon presse papier.
Quand je fais Application.CutCopyMode = False ça fonctionne si j'ai des donénes copiées depuis excel.
Mais en l'occurence j'avais copié ce bout de code pour l'intégrer à la macro (Application.CutCopyMode = False) et là le code ne fonctionne pas, donc je retrouvais dans msg box : Application.CutCopyMode = False

Je sais pas si c'est très clair ^^'

En tout cas si j'ai des cellules copiées avant, ça marche bien !

Par contre il faudrait que tu me dises comment je sors de mon msg box initial, celui qui dit à l'utilisateur de copier les données
 

patricktoulon

XLDnaute Barbatruc
tu le vide plus le clip
la dernière mouture par du principe que tant que le clip board est occupé a gloutonner des donner son acces déclenche une erreur que je remplace par "non" des qu'il est pret c'est "oui"
c'est tout
on pourrait même se passer de l'erreur 94 ; et utiliser error tout court au cas ou il y aurais une autre erreur pour autre chose

pour répondre a ta question comme je te l'ai dis ca vide pas le clip ta methode ca vide simplement le buffer d'excel

et tu n'a plus besoins de message "veuillez attendre...." ca se fait tout seul
si tu veux on peut faire ca dans un userform (pseudo message si tu tiens vraiment au message
 

Anthonymctm

XLDnaute Occasionnel
tu le vide plus le clip
la dernière mouture par du principe que tant que le clip board est occupé a gloutonner des donner son acces déclenche une erreur que je remplace par "non" des qu'il est pret c'est "oui"
c'est tout
on pourrait même se passer de l'erreur 94 ; et utiliser error tout court au cas ou il y aurais une autre erreur pour autre chose

pour répondre a ta question comme je te l'ai dis ca vide pas le clip ta methode ca vide simplement le buffer d'excel

et tu n'a plus besoins de message "veuillez attendre...." ca se fait tout seul
si tu veux on peut faire ca dans un userform (pseudo message si tu tiens vraiment au message
Non mais ce que je veux dire c'est que dans ma macro j'ai plusieurs copier/coller à faire.
Donc l'utilisateur doit aller à plusieurs endroit du logiciel pour faire les copier.
Et à chaque fois il faut que j'indique à l'utilisateur où aller faire son copier.
C'est ce message que j'aimerais fermer quand le collage est terminé.
 

Anthonymctm

XLDnaute Occasionnel
je pige pas très bien si tu a un msgbox excel ne peut plus rien faire alors là tu me perd :p :p ;)
ta question est dépourvu de sens dans ce contexte
Non mais en fait c'est moi qui m'embrouille, je voulais rajouter un fonctionnalité inutile, je vais simplement appliquer ton code après que l'utilisateur ait cliqué sur OK.
Si il a suffisement attendu, alors ça sera bon direct, sinon ça moulinera jusqu'à ce que le clipboard soit bon
 

patricktoulon

XLDnaute Barbatruc
a la bonne heure!!!!

Si il a suffisement attendu, alors ça sera bon direct, sinon ça moulinera jusqu'à ce que le clipboard soit bon
c'est le but de la sub hein!! mouliner jusqu'a que le clip soit prêt le msgbox est la juste pour te le dire et rien d'autre

voila plus besoins de calculer x seconde de plus ou de moins ca se debloque une fois que c'est pret et c'est tout
;)
 

patricktoulon

XLDnaute Barbatruc
re
et la voila avec un garde fou avec un delay de 10 secondes avant abandon (a toi de mettre les secondes qui te paraissent raisonnables change 10 pour ce que tu veux )
VB:
Dim pret As Boolean
Public Property Get presse_papier() As String
    presse_papier = "oui"
    On Error Resume Next
    presse_papier = CreateObject("htmlfile").parentwindow.clipboardData.GetData("TEXT")
    If Err.Number = 94 Then presse_papier = "non": Err.Clear
End Property



Sub test()
    Dim Texte$, T, T1
    T1 = Timer
    Do While presse_papier = "non"
        T = Timer: Do While Timer - T < 1: Loop
        If Timer - T1 > 10 Then Exit Do    'delay de 10 secondes avant d'avorter ; a modifier selon la tolérence souhaitée
    Loop
    If presse_papier = "non" Then
        MsgBox "le delay d'attente a été dépassé"
    Else
        MsgBox "c'est pret à coller"
        MsgBox Right(presse_papier, 100)
        'activesheet.paste
    End If
End Sub
 

Statistiques des forums

Discussions
311 733
Messages
2 082 019
Membres
101 872
dernier inscrit
Colin T