Ma macro ne fonctionne bien qu'en pas a pas...
Résolu
?kri
Messages postés
43
Date d'inscription
Statut
Membre
Dernière intervention
-
Patrice33740 Messages postés 8561 Date d'inscription Statut Membre Dernière intervention -
Patrice33740 Messages postés 8561 Date d'inscription Statut Membre Dernière intervention -
J'ai crée une macro Excel pour récupérer les données d'un multimètre et ensuite les traiter dans Excel. La macro fonctionne bien en pas a pas (récuperation des octets un par un dans la feuille), mais en exécution les cellules restent vides (le décalage se fait bien). J'ai essayé en laissant le doigt appuyé sur F8.. Même problème...
La macro va trop vite pour Excel?
Le code est là:
Private Sub CommandButton1_Click()
Sheets("Lancement").Activate
Range("A1").Select
'choisir un port série
MSComm1.CommPort = 2
'DMM
'19200 bauds, Parite Impaire, 7 bits de données, 1 bit d'arrêt
MSComm1.Settings = "19200,o,7,1"
'Vide le buffer
MSComm1.InBufferCount = 0
MSComm1.InputMode = 0
'ouvre le port
MSComm1.PortOpen = True
MSComm1.InputLen = 17 'fixe le nombre de caracteres a lire
Seq = MSComm1.Input 'place la sequence lue dans Seq
'affiche un message
UserForm1.Label2.Visible = True
Label2.Caption = ""
UserForm1.Repaint
'vide les cellules de la feuille
Range("A1:O1").ClearContents
Dim Pos As String
Pos = 1
Do While Pos <= 15
Dim Resultat As String
Resultat = Mid(Seq, Pos, 1)
ActiveCell.Value = Resultat
Label1.Caption = Resultat
ActiveCell.Offset(0, 1).Select
Pos = Pos + 1
Loop
'ferme le port
MSComm1.PortOpen = False
Label2.Caption = "Capture terminée"
End Sub
Private Sub CommandButton2_Click()
Unload Me
End Sub
La macro va trop vite pour Excel?
Le code est là:
Private Sub CommandButton1_Click()
Sheets("Lancement").Activate
Range("A1").Select
'choisir un port série
MSComm1.CommPort = 2
'DMM
'19200 bauds, Parite Impaire, 7 bits de données, 1 bit d'arrêt
MSComm1.Settings = "19200,o,7,1"
'Vide le buffer
MSComm1.InBufferCount = 0
MSComm1.InputMode = 0
'ouvre le port
MSComm1.PortOpen = True
MSComm1.InputLen = 17 'fixe le nombre de caracteres a lire
Seq = MSComm1.Input 'place la sequence lue dans Seq
'affiche un message
UserForm1.Label2.Visible = True
Label2.Caption = ""
UserForm1.Repaint
'vide les cellules de la feuille
Range("A1:O1").ClearContents
Dim Pos As String
Pos = 1
Do While Pos <= 15
Dim Resultat As String
Resultat = Mid(Seq, Pos, 1)
ActiveCell.Value = Resultat
Label1.Caption = Resultat
ActiveCell.Offset(0, 1).Select
Pos = Pos + 1
Loop
'ferme le port
MSComm1.PortOpen = False
Label2.Caption = "Capture terminée"
End Sub
Private Sub CommandButton2_Click()
Unload Me
End Sub
A voir également:
- Ma macro ne fonctionne bien qu'en pas a pas...
- Telecharger macro convertir chiffre en lettre excel - Télécharger - Tableur
- Télécharger macro convertir chiffre en lettre excel - Télécharger - Tableur
- Jitbit macro recorder - Télécharger - Confidentialité
- Mon ordinateur ne va pas bien - Guide
- Tapez cette phrase, en respectant bien les espaces et la ponctuation. - Guide
6 réponses
Difficile de répondre sans multimètre et sans utiliser le port série
mais sur le plan séquentiel, ton code n'est pas très cohérent, il serait préférable d'utiliser cet ordre :
Cordialement
Patrice
mais sur le plan séquentiel, ton code n'est pas très cohérent, il serait préférable d'utiliser cet ordre :
Private Sub CommandButton1_Click() Dim Pos As String Dim Resultat As String 'affiche un message UserForm1.Label2.Visible = True Label2.Caption = "" UserForm1.Repaint 'choisir un port série MSComm1.CommPort = 2 'DMM '19200 bauds, Parite Impaire, 7 bits de données, 1 bit d'arrêt MSComm1.Settings = "19200,o,7,1" 'Vide le buffer MSComm1.InBufferCount = 0 MSComm1.InputMode = 0 'ouvre le port MSComm1.PortOpen = True MSComm1.InputLen = 17 'fixe le nombre de caracteres a lire Seq = MSComm1.Input 'place la sequence lue dans Seq 'ferme le port MSComm1.PortOpen = False Label2.Caption = "Capture terminée" Sheets("Lancement").Activate Range("A1").Select 'vide les cellules de la feuille Range("A1:O1").ClearContents Pos = 1 Do While Pos <= 15 Resultat = Mid(Seq, Pos, 1) ActiveCell.Value = Resultat Label1.Caption = Resultat ActiveCell.Offset(0, 1).Select Pos = Pos + 1 Loop End Sub
Cordialement
Patrice
Merci d'avoir répondu.
Il est vrai que mon code n'est pas très soigné, mais mes dernières expériences de programmation étaient en basic sous Dos... au siècle dernier. Je manque donc un peu d'entrainement.
Pour en revenir à mon petit problème, la macro tourne puisque les cellules sont vidées, que la sélection se déplace comme prévu, et que la macro se termine normalement.
Les données lues en pas a pas sont exactes ( confirmées avec un logiciel d'extraction de données port série via un émulateur USB/Série et le datasheet du constructeur) et correspondent à l'affichage du multimètre. (calculs faits dans le classeur)
Je travaille sous Excel 2000, Win 7 64bits
J'ai fait les modifications que vous avez suggérées mais cela ne change rien.
Faudrait-il introduire un délai pour que les cellules aient le temps de se remplir, et si oui, comment?
Merci de votre aide,
Kri
Il est vrai que mon code n'est pas très soigné, mais mes dernières expériences de programmation étaient en basic sous Dos... au siècle dernier. Je manque donc un peu d'entrainement.
Pour en revenir à mon petit problème, la macro tourne puisque les cellules sont vidées, que la sélection se déplace comme prévu, et que la macro se termine normalement.
Les données lues en pas a pas sont exactes ( confirmées avec un logiciel d'extraction de données port série via un émulateur USB/Série et le datasheet du constructeur) et correspondent à l'affichage du multimètre. (calculs faits dans le classeur)
Je travaille sous Excel 2000, Win 7 64bits
J'ai fait les modifications que vous avez suggérées mais cela ne change rien.
Faudrait-il introduire un délai pour que les cellules aient le temps de se remplir, et si oui, comment?
Merci de votre aide,
Kri
Re,
Je ne suis spécialiste des ports séries mais la lecture s'opère en une seule fois :
Au lieu d'exécuter en pas à pas, tu peut placer des points d'arrêt aux endroits stratégiques pour voir si le délai est nécessaire et où le placer si besoin.
« Faudrait-il introduire un délai pour que les cellules aient le temps de se remplir, et si oui, comment? » Non, absolument pas, les données sont contenues dans «Seq», la boucle ne sert qu'à les répartir dans les différentes cellules.
Je ne suis spécialiste des ports séries mais la lecture s'opère en une seule fois :
Seq = MSComm1.Input. Lors de l'exécution en pas à pas, le délai entre chaque instruction est gigantesque. Peut-être faut-il ajouter un délai entre l'ouverture du port et la lecture ???
Au lieu d'exécuter en pas à pas, tu peut placer des points d'arrêt aux endroits stratégiques pour voir si le délai est nécessaire et où le placer si besoin.
« Faudrait-il introduire un délai pour que les cellules aient le temps de se remplir, et si oui, comment? » Non, absolument pas, les données sont contenues dans «Seq», la boucle ne sert qu'à les répartir dans les différentes cellules.
Merci Patrice
Effectivement le temps d'acquisition du port était trop long.
Du coup la séquence n'était pas stockée. J'ai donc rajouté la ligne
Application.Wait (Now+TimeValue ("0:00:02")) avant le stockage de la séquence
Il faudrait probablement mettre un délai plus long avec un port à 4800 Bauds.
Je continue
Merci encore
Kri
Effectivement le temps d'acquisition du port était trop long.
Du coup la séquence n'était pas stockée. J'ai donc rajouté la ligne
Application.Wait (Now+TimeValue ("0:00:02")) avant le stockage de la séquence
Il faudrait probablement mettre un délai plus long avec un port à 4800 Bauds.
Je continue
Merci encore
Kri
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Merci Patrice
Effectivement le temps d'acquisition du port était trop long.
Du coup la séquence n'était pas stockée. J'ai donc rajouté la ligne
Application.Wait (Now+TimeValue ("0:00:02")) avant le stockage de la séquence
Il faudrait probablement mettre un délai plus long avec un port à 4800 Bauds.
Je continue
Merci encore
Kri
Effectivement le temps d'acquisition du port était trop long.
Du coup la séquence n'était pas stockée. J'ai donc rajouté la ligne
Application.Wait (Now+TimeValue ("0:00:02")) avant le stockage de la séquence
Il faudrait probablement mettre un délai plus long avec un port à 4800 Bauds.
Je continue
Merci encore
Kri