[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 =...

patricktoulon

XLDnaute Barbatruc
bonjour
moi non plus je comprends pas très bien a la vue de la moitié de code que tu a donné
tu copie quoi et vers quoi
a la vue de ton code tu fait l'inverse de ton enoncé
il faut s'exprimer correctement
ne pas confondre "copier sur" et " copier a partir de"
 

danielco

XLDnaute Accro
Bonjour Daniel,

Oui bien sûr ! ce serait même plus propre, mais je sais encore moins comment le faire ^^
Voici un classeur exemple avec un userform et un command button. Clique sur le bouton de laa feuille pour afficher le userform Le bouton est désactivé pour 5 mn :

VB:
Private Sub UserForm_Activate()
  Me.CommandButton1.Enabled = False
  Application.OnTime Now + TimeValue("00:05:00"), "Activation"
End Sub

Si tu ne sais pas l'adapter à ton code, dis-le.

Daniel
 

Pièces jointes

  • 200801.xlsm
    24.2 KB · Affichages: 7

patricktoulon

XLDnaute Barbatruc
re
bonjour
c'est intéressant cette question si j'ai bien compris
copier d' une autre app vers excel en laissant le temps suffisant pour effectuer la tache avant l’exécution du reste du code

si tu n'est pas plus précis que ça dans ton enoncé tu n'aura que des réponses approximatives
du genre avec application.ontime
 

Anthonymctm

XLDnaute Occasionnel
bonjour
moi non plus je comprends pas très bien a la vue de la moitié de code que tu a donné
tu copie quoi et vers quoi
a la vue de ton code tu fait l'inverse de ton enoncé
il faut s'exprimer correctement
ne pas confondre "copier sur" et " copier a partir de"
Oui je copie a partir d'une autre app et je le colle sur excel.
(Pour moi je fais le copier sur l'app et je colle sur excel mais bon :p)
L'app est sur serveur via RDP et la base de données herbées en SQL et utilisée via Access (je crois)
 

Anthonymctm

XLDnaute Occasionnel
Voici un classeur exemple avec un userform et un command button. Clique sur le bouton de laa feuille pour afficher le userform Le bouton est désactivé pour 5 mn :

VB:
Private Sub UserForm_Activate()
  Me.CommandButton1.Enabled = False
  Application.OnTime Now + TimeValue("00:05:00"), "Activation"
End Sub

Si tu ne sais pas l'adapter à ton code, dis-le.

Daniel
Ok, j'ai, ça pourrait être pas mal, maintenant ça résout pas mon problème de modifier le temps d'attente.
Quand tu disais " désactiver le bouton OK le temps de la copie " je pensais qu'on pouvait vérifier par la macro que la copie soit terminée.

Donc la ce qui faudrait faire c'est multiplier les 00:05:00 (00:00:20 dans mon exemple) par le nombre d'année à analyser (DateDiff("yyyy", DateDebutAnalyse, Now dans mon exemple)
 

patricktoulon

XLDnaute Barbatruc
re
Bonjour
c'est quoi ton soucis en fait
l'attente de chargement dans le clipboard ou l'attente du paste complet
ce sont deux choses différentes
d'ailleurs sais tu si c'est l'un ou l'autre ton problème

je te propose un truc
on va faire un test

tu va faire ton copier a la main sur cette dite app
et tu va tester ceci tout de suite apres et me dire si le text correspond a la fin de ce qui a été copié
VB:
public Property Get presse_papier() As String
presse_papier = CreateObject("htmlfile").parentwindow.clipboardData.GetData("TEXT")
End Property

Sub test()
Dim Texte$
Texte = presse_papier
msgbox right(Texte,100)
End Sub
le format des données on s'en fou pour l'instant
si ça répond comme je crois tu n'a pas besoins de gestion d'attente et combien meme si il y en avait besoins j'ai une solution pour ca
je reviens plus tard je pars en exterieur ;)
 
Dernière édition:

Anthonymctm

XLDnaute Occasionnel
re
Bonjour
c'est quoi ton soucis en fait
l'attente de chargement dans le clipboard ou l'attente du paste complet
ce sont deux choses différentes
je te propose un truc
on va faire un test

tu va faire ton copier a la main sur cette dite app
et tu va tester ceci tout de suite apres et me dire si le text correspond a la fin de ce qui a été copié
VB:
public Property Get presse_papier() As String
presse_papier = CreateObject("htmlfile").parentwindow.clipboardData.GetData("TEXT")
End Property

Sub test()
Dim Texte$
Texte = presse_papier
msgbox right(Texte,100)
End Sub
le format des données on s'en fou pour l'instant
si ça répond comme je crois tu n'a pas besoins de gestion d'attente et combien meme si il y en avait besoins j'ai une solution pour ca
L'attente c'est pour le copier.

Alors j'ai testé le bout de code, si je lance la maccro pendant la copie, ça ne fonctionne pas, j'ai uniquement mon précédent copiage, ça n'attend pas que la copie soit terminée.

En revanche si j'attend complètement que la copie soit terminée, là oui j'ai bien les 100 derniers caractères.

Je t'ai mis une image lorsque la copie est en cours
 

Pièces jointes

  • 2020_08_03_14_36_43_Démarrer.png
    2020_08_03_14_36_43_Démarrer.png
    58.1 KB · Affichages: 11

patricktoulon

XLDnaute Barbatruc
re
il faudrait donc déjà pour commencer
que tu vide le clipboard avant!!!! de copier que l'on puisse comparer la même chose et faire la gestion d'attente en chargement de clip
etce que cela est possible pour toi est ce que c'ette ergonomie te conviendrait ?
 

Anthonymctm

XLDnaute Occasionnel
re
il faudrait donc déjà pour commencer
que tu vide le clipboard avant!!!! de copier que l'on puisse comparer la même chose et faire la gestion d'attente en chargement de clip
etce que cela est possible pour toi est ce que c'ette ergonomie te conviendrait ?
Ok, j'ai vidé le clipboard (en copiant des cellules excel puis en faisant echap)
La quand je copie puis que je lance la macro test avant que la copie soit terminée j'ai un message d'erreur : Erreur d'éxécution 94 : utilisation incorrecte de Null
 

patricktoulon

XLDnaute Barbatruc
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
 

Statistiques des forums

Discussions
311 718
Messages
2 081 866
Membres
101 827
dernier inscrit
kubinou