Code qui freeze excel et Vba (Problème)

Résolu
cs_choupinoob Messages postés 27 Date d'inscription dimanche 25 janvier 2009 Statut Membre Dernière intervention 27 juin 2011 - 14 juin 2011 à 16:39
cs_choupinoob Messages postés 27 Date d'inscription dimanche 25 janvier 2009 Statut Membre Dernière intervention 27 juin 2011 - 17 juin 2011 à 14:55
Bonjour à tous.
Voila j'ai adapté un code permettant de récupérer les valeurs d'un port série pour m'en servir sur Excel.

Malheureusement ce code, me permet (par l'appuie sur un bouton), de récupérer uniquement une seule fois les valeurs émise. Ensuite le programme freeze et je suit obligée de passer par ctrl+alt+Suprr pour le fermer.
Je vous joint ici le code et toute aide serait la bienvenue.

Merci beaucoup.


===========================Partie communication========================
Public valeur As String
Public fin_trame As Boolean

'Ouverture du port à l'ouverture du Userform
Private Sub UserForm_Activate()
    
On Error GoTo Gestion_erreur

    'Vider le buffer
    MSComm1.InBufferCount = 0
    
    'Vérification que les paramètres du port n'ont pas changés
    If MSComm1.CommPort <> 2 Or MSComm1.Settings <> "1200,o,7,1" Or MSComm1.InputLen <> 1 Or MSComm1.Handshaking <> comXOnXoff Then
        
        'choisir un port série
        MSComm1.CommPort = 2 ' 2 est le n° de port sur lequel est connecté l'appareil
        
        'Paramétrage du port; les valeurs sont fournies par le constructeur de l'appareil.
        'L'appareil utilisé dans cet exemple requiert les valeurs suivantes: 1200 bauds, bit de parité, 7 bits de données, 1 bit d'arrêt
        MSComm1.Settings = "1200,o,7,1"
        
        ' indique au contrôle qu'il doit lire 1 seul caractère
        MSComm1.InputLen = 1
        
        'Indique le type de contrôle de flux
        MSComm1.Handshaking = comXOnXoff
        
    End If
    
    'ouvre le port
    MSComm1.PortOpen = True

    Ufrm_Comm.Hide
   
Exit Sub

Gestion_erreur:
Ufrm_Comm.Hide
Fermeture_port
MsgBox "Aucun matériel connecté sur le port Comm2"

End Sub

'Script qui se lance à la reception de données sur le port Com
Private Sub MSComm1_OnComm()

    Dim tampon As String
    
    Select Case MSComm1.CommEvent
    
        Case comEvReceive       ' Si on reçoit des données
            tampon = MSComm1.Input
            Call Traitement(tampon) ' Routine de traitement
        
        'Case comEvSend          ' Il y a des caractères à envoyer
        'Case comEvEOF           ' On a reçu le caractère EOF
        
    End Select

End Sub

'Script permettant de mettre en forme les données reçu sur le port Com
Sub Traitement(tampon As String)
    
    'Si le caractère récupéré n'est pas un "saut de ligne" ou un "retour chariot"
    If tampon <> Chr$(10) And tampon <> Chr$(13) Then
                        
        If tampon = "." Then
            tampon = ","    'Remplacement du "." par une ","
        ElseIf tampon = " " Then
            tampon = ""     'Non prise en compte des "espace"
        End If
        
        'Si la dernière trame avais fini d'être récupérée
        If fin_trame = True Then
            valeur = ""                 'Initialisation de la variable
            fin_trame = False           'Initialisation de la mémorisation de fin de trame
        End If
        
        'Insertion de données reçues dans la variable
        valeur = valeur & tampon
    
    'Si le caractère récupéré est un saut de ligne (Dernier caractère de la trame)
    ElseIf tampon = Chr$(10) Then
        Ufrm_interface.TxtB_poids.Value = valeur  'Ecriture du poids dans le champs TextBox de l'interface
        fin_trame = True    'Mémorisation fin de trame atteinte
    End If
    
End Sub



=======================Partie interface=======================

'Script permettant de lancer un tarage de la balance
Private Sub CommandButton2_Click()

    'Si la communication sur le port Comm n'est pas mis en route
    If Ufrm_Comm.MSComm1.PortOpen = False Then
        
        'Ouverture du UserForm permettant de lancer la communication sur le port Comm
        Ufrm_Comm.Show
    
    End If
    
    'Si la communication sur le port Comm est bien en route
    If Ufrm_Comm.MSComm1.PortOpen = True Then
    
        Ufrm_Comm.MSComm1.Output = Chr(27) & Chr(84) & Chr(13) & Chr(10)    'Envoie des caractères "ESC" + "T" + "CR" + "LF"
        
    End If
    
End Sub








'Script qui se lance à la fermeture du UserForm
Private Sub UserForm_Terminate()
    
    'Appel de la routine de fermeture du port de communication
    Fermeture_port

End Sub


5 réponses

bigfish_le vrai Messages postés 1835 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 20 novembre 2013 15
16 juin 2011 à 10:27
Salut,

Je pense que le probleme vient du fait que tu essais d'ouvrir un port déjà ouvert.

En fait si tout c'est bien passé la première fois, à aucun moment ton code ne ferme le port !

Ufrm_Comm.Hide ne termine pas la form ! elle est toujours en mémoire mais non visible.

Pour que l’événement "terminate" ce déclenche il faut utiliser :

Unload Ufrm_Comm

mais attention tu ne pourras pas juste remplacer Ufrm_Comm.Hide par Unload Ufrm_Comm sinon tout s'arrete.
Il faut bien positionner Unload Ufrm_Comm en fin de traitement.

Tu peux peut être essayer en plus de ce que je t'ai dit précédemment d'ajouter une ligne qui verifi si le port est déjà ouvert avant de tenter de l'ouvrir à nouveau.
Soit à l'initialisation de la form soit dans ta sub "UserForm_Activate"

A+
3
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
14 juin 2011 à 20:01
Salut

Exécute-le en pas-à-pas pour savoir où ça déconne :
Débogage :
- F9 sur une ligne de code; elle change de couleur
Le programme s'y arrêtera au prochain passage
Survole avec la souris tes variables pour visualiser leur contenu, ou va dans la fenêtre de debogage (Ctrl-G) et tape
? maVariable
pour qu'elle s'inscrive dans la fenêtre.
- F8 (VB6) ou F10 (.Net) pour avancer d'une ligne de code
- F5 pour continuer normalement

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
cs_choupinoob Messages postés 27 Date d'inscription dimanche 25 janvier 2009 Statut Membre Dernière intervention 27 juin 2011
15 juin 2011 à 08:48
Alors, j'ai tenté le pas à pas. Le programme freeze toujours lorsque je re clique pour récupérer une deuxième valeur sans que je puisse voir quel ligne de code en est la cause.
En débogage, ma variable est bien égale aux valeurs émises.
0
cs_choupinoob Messages postés 27 Date d'inscription dimanche 25 janvier 2009 Statut Membre Dernière intervention 27 juin 2011
17 juin 2011 à 11:50
YOP bigfish_le_vrai!

Hum, en gros à la place de l'ouverture du port, je check si il est déjà ouvert, si oui rien ne se créé, si non il s'ouvre?

Ensuite, Je remplace le .Hide par unload (par exemple dans le bouton "terminer")?

Ok pour le second point mais pour le premier je ne voit pas comment faire cela, si tu avais quelques pistes..

Et merci de m'avoir répondu (même quelques jours après). Car j'en suit toujours au même point :/
0

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

Posez votre question
cs_choupinoob Messages postés 27 Date d'inscription dimanche 25 janvier 2009 Statut Membre Dernière intervention 27 juin 2011
17 juin 2011 à 14:55
Edit, j'ai réussi à trouvé le truc, ta solution marche bigfish_le_vrai! (Merci beaucoup en passant, je pensait de plus en plus à la pendaison )

J'ai une autre question d'ordre plus technique du coup, ce poids que je récupère sous la forme +/- x,xxxkg, puis-je l'utiliser comme une variable appliquable comme toutes autres?


Merci d'avance et encore merci!
0
Rejoignez-nous