Pouvoir interrompre l’action de ma macro depuis un logiciel actif

zombe

XLDnaute Occasionnel
Salut le forum

Dans le fichier joint, j’ai 2 commandes : GO et STOP.
La commande GO permet d’exécuter la macro et la 2è permet de l’interrompre.
Lorsque j’exécute la macro, elle active d’abord le logiciel sur lequel les informations de la plage Excel doivent y être collées et commence le collage.
Si pendant le processus du collage, je constate un disfonctionnement, je dois interrompre la macro en cliquant sur le bouton STOP.
Pour avoir accès à la commande STOP, je dois réduire le logiciel pour que excel soit actif.
Je souhaite qu’on m’aide à pouvoir interrompre l’action de la macro depuis le logiciel sans être obligé de réduire le logiciel(par la touche ESC).
 

Dranreb

XLDnaute Barbatruc
Re : Pouvoir interrompre l’action de ma macro depuis un logiciel actif

Bonsoir.
Je ne sais ce que vous appelez "réduire le logiciel".
Il est normal de pouvoir interrompre le traitement par ESC. Mais il y a moyen de faire en sorte que cela ne provoque pas d'arrêt immédiat, voir EnableCancelKey, On Error GoTo et test de Err = 18
Cela dit l'instruction DoEvents permet souvent le lancement d'une autre procédure sans interrompre celle qui l'exécute.
Le mieux serait alors que ce bouton STOP se contente de mettre une variable Public ArrêtDemandé As Boolean à True, que la procédure à risque testera au moment où elle pourra s'arrêter le plus proprement possible.
Cordialement.
 

zombe

XLDnaute Occasionnel
Re : Pouvoir interrompre l’action de ma macro depuis un logiciel actif

Salut Dranreb
Merci pour votre contribution positive.
Vous dites :"Je ne sais ce que vous appelez "réduire le logiciel"."
La fonction sendkey envoi les données de ma plage excel vers un autre applicatif (ligiciel de notre société).
Du coup lorsque la macro est exécutée, c'est le logiciel qui est actif et non Excel.
Pourtant, pour arrêter ma macro, je dois revenir sur excel et pour ça je dois activer excel qui est réduit dans la barre des tâches.
J'aurai souhaité si possible que vous traduisez vos explications (solutions) par un cas concret avec mon code afin que par un test je puisse bien comprendre.
Suivant vos explications et les miennes sur votre question comment pouvoir arrêter la macro lorsqu'elle est en cours d'exécution?
Merci encore
 

Dranreb

XLDnaute Barbatruc
Re : Pouvoir interrompre l’action de ma macro depuis un logiciel actif

Je n'ai pas votre code. Aucun fichier n'a été joint. Si vous avez essayé, il n'est pas passé.
Il y a une autre voie à creuser avec Application.OnTime
En effet si une autre application est activée il vaut mieux que plus rien ne s'exécute dans Excel, quitte à ce qu'une macro s'y relance dans les 5 secondes pour vérifier si un résultat de l'autre application est disponible.
Il y a aussi moyen de dialoguer via le presse papier, de combiner tout cela. Tout dépend de ce dont vous avez besoin.
Pour des explications complémentaires, en attendant, consultez l'aide de VBA.
La solution de votre problème (que je ne cerne pas encore très bien) dépend sans doute aussi beaucoup des possibilités du logiciel maison.
À +
 
Dernière édition:

zombe

XLDnaute Occasionnel
Re : Pouvoir interrompre l’action de ma macro depuis un logiciel actif

Merci pour votre promptitude.
D'abord je vous fait decouvrir mon code dans le fichier joint et comme ca tu pourra me comprendre et m'apporter la solution dont j'aurai besoin.
 

Pièces jointes

  • Bouton Stop Macro.xlsm
    34.5 KB · Affichages: 52

Dranreb

XLDnaute Barbatruc
Re : Pouvoir interrompre l’action de ma macro depuis un logiciel actif

Tout dépend de ce que vous pouvez faire depuis votre logiciel.
Si vous pouvez copier quelque chose, je peux le retrouver dans le presse papier.
Cette double procédure (j'espère qu'elle marche toujours dans les nouvelles versions d'Excel) permet de considérer le presse papier comme une variable String nommée PressePapier dans le projet VBA:
VB:
Property Get PressePapier() As String
Dim DOb As New DataObject
On Error Resume Next
DOb.GetFromClipboard: PressePapier = DOb.GetText
If Err Then MsgBox "Pas de données récupérées", vbCritical, "PressePapier"
End Property
Property Let PressePapier(Z As String)
Dim DOb As New DataObject
DOb.SetText Z: DOb.PutInClipboard
End Property
Lui affecter une valeur revient à copier dans le presse papier. La consulter revient à voir si quelque chose a été copié d'une autre source, voire d'une autre application.

Remarque: j'ai trouvé une bizarrerie dans votre Sub attendre: Timer renvoie un nombre de seconde écoulées depuis minuit en Single or les variables auxquelles vous les affectez sont déclarées Long. il s'en suit que pour des durées de moins d'une seconde fin se retrouve = deb et il n'y a pas d'attente.
À +
 
Dernière édition:

zombe

XLDnaute Occasionnel
Re : Pouvoir interrompre l’action de ma macro depuis un logiciel actif

Permet que j'apporte quelque éclaircissements pour voir si nous sommes sur le même chemin.
Pour votre question, je dirai oui car je peux copier des données depuis mon logiciel.
Il faut dire qu'on copie champ par champ.
Je souhaite comprendre quelque chose sur votre code:
quelle est son utilité? Comment pourrais-je l'experimenter (ou dois-je le coller)?
Votre piste semble interessante et je souhaite bien la comprendre.
J'entend souvent parler du pressepapier mais je m'y suis jamais trop interessé.
Merci pour vos éclaircissemnts que j'attend avec votre permission.
 

Dranreb

XLDnaute Barbatruc
Re : Pouvoir interrompre l’action de ma macro depuis un logiciel actif

quelle est son utilité?
je dialogue volontiers avec la calculatrice Windows quelquefois avec ça.
Comment pourrais-je l'experimenter
Sélectionnez un texte d'une application normale quelconque, puis Ctrl+C. Exécutez ensuite une procédure qui fait MsgBox PressePapier, puis, pour l'autre sens, affectez autre chose à PressePapier. Faites un Ctrl+V ailleurs.
(ou dois-je le coller)?
Dans un module ordinaire.
Plus haut:
je dirai oui car je peux copier des données depuis mon logiciel.
Il serait bon d'avoir un peu mieux que ça: par exemple un bouton qui envoie immédiatement une chaîne convenue d'alerte dans le presse papier.
À +
 

zombe

XLDnaute Occasionnel
Re : Pouvoir interrompre l’action de ma macro depuis un logiciel actif

Vraiment je tiens à te remercier pour ton assistance enrichissante.
Vous dites:"Exécutez ensuite une procédure qui fait MsgBox PressePapier, puis, pour l'autre sens, affectez autre chose à PressePapier. Faites un Ctrl+V ailleurs."
J'ai pas trop bien compris cette partie.
Comment exécuter une procedure qui fait msgbox.je vois souvent ce message mais j'ai jamais su à quel moment il apparait. Je souhaite que vous m'aider à le comprendre?
Pour votre dernier point, lorsque j'aurai compris ta question du dessus, je pourrai vous apporter une réponse precise.
merci et je reste dispo pour votre coaching.
 

Dranreb

XLDnaute Barbatruc
Re : Pouvoir interrompre l’action de ma macro depuis un logiciel actif

Vous avez bien une procédure activePack que vous savez lancer !
Les Property PressePapier doivent d'abord été installées naturellement.
Mettez y en tête ces deux instructions qui ne prêteront pas à conséquence:
VB:
MsgBox PressePapier, vbInformation, "Test du presse papier"
PressePapier = "Ce texte se trouve maintenant dans le presse papier"
Avant de la lancer copiez quelque chose que vous reconnaitrez dans le message.
Après exécution, collez quelque part. Si le programme maison ne s'est pas servi du presse papier il devrait venir "Ce texte se trouve maintenant dans le presse papier".
Il est écrit en quoi ce programme maison ?
À +
 

zombe

XLDnaute Occasionnel
Re : Pouvoir interrompre l’action de ma macro depuis un logiciel actif

Salut maître
Voici comment j'ai procédé:
Code:
Public stp As Boolean
 
Sub activePack()
MsgBox PressePapier, vbInformation, "test du presse papier"
 PressePapier = "Ce texte se trouve maintenant dans le presse papier"
Dim i As Integer, MemJ8 As Integer
 
'On Error GoTo gestionerreur
If MsgBox("Avant de confirmer la saisie automatique, assurez-vous que :" & Chr(10) & Chr(10) & "- Les observations du client issues de la vérification des informations ont été prises en compte," & Chr(10) & "- Vous êtes bien positionné sur le menu ouverture simplifié - Nouveau Client Pack ... .", vbYesNo, "Demande de confirmation") = vbYes Then
 
    AppActivate "essai"
    attendre 0.6
J'ai copier le mot confirmer et sensuite j'ai lancé la macro.
A peine lancer et sans avoir déjà collé le mot copier, le msgbox sans contenu apparaît.
Donc je pourrai pas tirer de conclusion pour vous dire en quoi le programme est écrit.
Y'a t-il une étape que j'ai pas respecté?
 

Dranreb

XLDnaute Barbatruc
Re : Pouvoir interrompre l’action de ma macro depuis un logiciel actif

Bizarre.
Bon, j'ai ouvert un nouveau classeur, et j'y ai mis ça dans un nouveau module:
VB:
Option Explicit

Sub Test()
MsgBox PressePapier, vbInformation, "test du presse papier"
 PressePapier = "Ce texte se trouve maintenant dans le presse papier"
End Sub
Property Get PressePapier() As String
Dim DOb As New DataObject
On Error Resume Next
DOb.GetFromClipboard: PressePapier = DOb.GetText
If Err Then MsgBox "Pas de données récupérées", vbCritical, "PressePapier"
End Property
Property Let PressePapier(Z As String)
Dim DOb As New DataObject
DOb.SetText Z: DOb.PutInClipboard
End Property
J'ai été obligé d'ajouter la référence "Microsoft Forms 2.0 Object Library" pour qu'il trouve le type de donnée DataObject, et ça marche.
Attention: en copiant une cellule contenant "confirmer" ça ne donne rien. En sélectionnant ce mot dans la barre de formule, et Ctrl+C, oui. J'exécute Test, il m'affiche bien "confirmer". Je vais dans la barre de formule, Ctrl+V je trouve bien "Ce texte etc."
J'ai choisi de faire les essais avec la barre de formule d'Excel, mais ça marche tout aussi bien avec le Bloc-notes; je viens de faire l'essai aussi.
À +
 
Dernière édition:

zombe

XLDnaute Occasionnel
Re : Pouvoir interrompre l’action de ma macro depuis un logiciel actif

Salut Dranreb
Je viens de reussir cet exercice en suivant tes explications à la lettre.
J'ai tenté de saisir des données dans 3 cellules et les copier pour voir ce que ca va donner mais ce test n'a pas fonctionné. je sais qu'on peut pas voir les données des 3 cellules dans la barre de formule pour les coper mais j'ai essayé cela par curiosité.
Vous demandez en quoi le programme est écrit, moi je dirai que je lis du Français dans le msgbox qui s'affiche.Oubien dois-regardé ailleur pour voir en quoi le programme est écrit?
Maintenant pour revenir à notre sujet initial :pouvoir arrêter ma macro.
Vous avez vu mon code initial.Comment la methode pressepapier pourra m'être utile?
Pour le moment je ne vois pas trop mais je sais que vous voyez plus loin que moi.
Remarque: j'ai trouvé une bizarrerie dans votre Sub attendre: Timer renvoie un nombre de seconde écoulées depuis minuit en Single or les variables auxquelles vous les affectez sont déclarées Long. il s'en suit que pour des durées de moins d'une seconde fin se retrouve = deb et il n'y a pas d'attente.
Pouvez-vous améliorer la partie de mon code qui correspond à votre remarque?
Merci Maître j'apprécie beaucoup votre sens de la disponibilité et je souhaite pas trop en abuser.
 

Dranreb

XLDnaute Barbatruc
Re : Pouvoir interrompre l’action de ma macro depuis un logiciel actif

Bonjour.
Vous dites que c'est un programme de la société où vous travaillez. Savez vous qui l'a développé, et dans quel langage de programmation ? Simple curiosité, on ne sait jamais. S'il était écrit en VB6 par exemple, c'est un langage très proche du VBA mais qui n'est pas hébergé par une application hôte. Et il y a moyen aussi d'y envoyer quelque chose dans le presse papier. Même plus simplement qu'en VBA.
Comment l'utiliser ? : Ne pourrait-on pas ajouter dans la boucle de la Sub Attendre: If PressePapier = "Stop" Then End
Et déclarez y Deb% et Fin% au lieu de deb& et fin& dans leur déclaration, comme pour le paramètre. % c'est du Single, & c'est du Long.
Cordialement.
 

zombe

XLDnaute Occasionnel
Re : Pouvoir interrompre l’action de ma macro depuis un logiciel actif

Salut Maître
Notre service informatique m'a fait savoir que le language de programmation est oracle forms.
Le logiciel a été conçu sous ORACLE(Base de données et autres).
Ne pourrait-on pas ajouter dans la boucle de la Sub Attendre: If PressePapier = "Stop" Then End
Et déclarez y Deb% et Fin% au lieu de deb& et fin& dans leur déclaration, comme pour le paramètre. % c'est du Single, & c'est du Long.
Il faut noter que sub attendre permet de gerer le temps de saisie dans un champ.
Avec la sendkey, on constatait beaucoup d'erreur dans le fonctionnement car trop vite.
Le sub attendre a été intégré pour réduire les mouvements (vitesse) de la sendkey.
Voici mon code initial avec votre solution pour appréciation.
Au lieu de dire je ne sais pas faire je préfère essayé afin que vous me corrigez.
Code:
Public stp As Boolean
 
Sub activePack()
MsgBox PressePapier, vbInformation, "tester le presse papier"
 PressePapier = "Ce texte se trouve maintenant dans le presse papier"
Dim i As Integer, MemJ8 As Integer
 
'On Error GoTo gestionerreur
If MsgBox("Avant de confirmer la saisie automatique, assurez-vous que :" & Chr(10) & Chr(10) & "- Les observations du client issues de la vérification des informations ont été prises en compte," & Chr(10) & "- Vous êtes bien positionné sur le menu ouverture simplifié - Nouveau Client Pack ... .", vbYesNo, "Demande de confirmation") = vbYes Then
 
    AppActivate "essai"
    If PressePapier = "Stop" Then End
    attendre 0.6
 
    For i = 4 To 4
        '***************************
        DoEvents
        If stp = True Then Exit Sub
        If PressePapier = "Stop" Then End
        '***************************
        attendre 0.5
        SendKeys Range("j4").Value & Chr(13), True
        attendre 0.6
    Next
 
    For i = 5 To 5
        '***************************
        DoEvents
        If stp = True Then Exit Sub
        If PressePapier = "Stop" Then End
        '***************************
        attendre 0.5
        SendKeys Range("j5").Value & Chr(13), True
        attendre 0.6
    Next
 
    For i = 6 To 6
        '***************************
        DoEvents
        If stp = True Then Exit Sub
        If PressePapier = "Stop" Then End
        '***************************
        attendre 0.5
        SendKeys Cells(i, 10).Value, True
        attendre 0.6
    Next
 
    For i = 7 To 7
        '***************************
        DoEvents
        If stp = True Then Exit Sub
        If PressePapier = "Stop" Then End
        '***************************
        attendre 0.5
        SendKeys "" & Chr(13), True
        attendre 0.6
    Next
 
    SendKeys "N" & Chr(13), True
    attendre 0.8
 
    SendKeys "{LEFT}"
    SendKeys "{ENTER}"
    attendre 0.7
 
    SendKeys "~"
    attendre 0.8
 
 
    For i = 8 To 25
        '***************************
        DoEvents
        If stp = True Then Exit Sub
        If PressePapier = "Stop" Then End
        '***************************
        ' Si I = 8 alor on mémorise la valeur de la cellule
        If i = 8 Then MemJ8 = Range("J8").Value
        ' Si I = 16 ou 17
        If i = 17 Or i = 18 Then
            ' Si la veleur mémorisée est 3
            If MemJ8 = 3 Then
                ' On inscrit le nom et le prénom du mari
                SendKeys Cells(i, 10).Value, True
                SendKeys "~"
                attendre 0.7
            End If
        Else
            ' Si I à une autre valeur que 16 ou 17
            SendKeys Cells(i, 10).Value, True
            attendre 0.7
            SendKeys "~"
            attendre 0.6
        End If
    Next
 
    For i = 26 To 45
        '***************************
        DoEvents
        If stp = True Then Exit Sub
        If PressePapier = "Stop" Then End
        '***************************
        SendKeys Cells(i, 10).Value, True
        attendre 0.5
        SendKeys "~"
        attendre 0.7
    Next
 
    SendKeys "+{F3}"
    attendre 0.7
 
    For i = 46 To 53
        '***************************
        DoEvents
        If stp = True Then Exit Sub
        If PressePapier = "Stop" Then End
        '***************************
        SendKeys Cells(i, 10).Value, True
        attendre 0.5
        SendKeys "~"
        attendre 0.7
    Next
 
    SendKeys "+{F6}"
    attendre 0.7
 
    For i = 54 To 54
        '***************************
        DoEvents
        If stp = True Then Exit Sub
        If PressePapier = "Stop" Then End
        '***************************
        SendKeys Cells(i, 10).Value, True
        attendre 0.7
    Next
 
    Exit Sub
gestionerreur:
    MsgBox "fichier non ouvert ou réduit dans la barre des tâches : abandon"
End If
End Sub
Sub attendre(sec%)
Dim deb%, fin%
deb% = Timer
fin = deb% + sec%
Do Until Timer >= fin%
DoEvents
Loop
End Sub
 

Discussions similaires

Statistiques des forums

Discussions
312 206
Messages
2 086 219
Membres
103 158
dernier inscrit
laufin