Ma macro ne fonctionne bien qu'en pas a pas...

Résolu/Fermé
?kri Messages postés 43 Date d'inscription lundi 8 juillet 2013 Statut Membre Dernière intervention 4 décembre 2020 - 1 mars 2014 à 09:13
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 - 2 mars 2014 à 18:21
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
A voir également:

6 réponses

Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 775
Modifié par Patrice33740 le 1/03/2014 à 18:03
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 :
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
0
?kri Messages postés 43 Date d'inscription lundi 8 juillet 2013 Statut Membre Dernière intervention 4 décembre 2020 25
1 mars 2014 à 19:40
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
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 775
2 mars 2014 à 00:16
Re,

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.
0
?kri Messages postés 43 Date d'inscription lundi 8 juillet 2013 Statut Membre Dernière intervention 4 décembre 2020 25
2 mars 2014 à 13:36
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
?kri Messages postés 43 Date d'inscription lundi 8 juillet 2013 Statut Membre Dernière intervention 4 décembre 2020 25
2 mars 2014 à 13:36
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
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 775
2 mars 2014 à 18:21
De rien, au plaisir de te relire sur le Forum.
0