Bonjour,
Le contexte :
J'avais une application existante excel qui faisait de l'acquisition de donnée via un driver de matériel spécifique, qui rendait des données disponibles par un système DDE.
à ce fichier je dois ajouter des données disponibles sur des équipements par protocole modbus RTU.
J'ai donc tenté de faire un script en python pour faire l'acquisition des données modbus.
Pour transféré mes données de python vers mon appli excel, j'utilise un fichier xlsx, qui me sert de tampon entre les 2 applications.
mon appli python li donc les données modbus, et ensuite les écrit dans un fichier xlsx.
Pour synchroniser l'ensemble, mon appli vba lance le script python, et au bout d'une tempo, lance sa lecture dans le fichier excel xlsx, et créer une ligne d'archivage.
J'avais réussi a faire une appli qui fonctionne en lançant le script python depuis excel par l'intermédiaire d'un batch.bat.
le problème étant les appel de prompt qui fait que ce n'est pas convivial à utiliser.
J'ai donc chercher à lancer l'appli python directement depuis excel.
J'ai bien trouvé la commande qui exécute le script python, le script s’exécute partiellement et pas en totalité.
Voir le code python ci dessous
(j 'ai bien les print qui affichent les valeurs dans le prompt)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 import minimalmodbus import serial import time from openpyxl import load_workbook colision = 0 # EXTRACTION DES DONNEES vitesse = 123.0 couple = 123.0 temp = 123.0 #MISE A L'ECHELLE DES DONNEES couplech=(couple / 10) tempech=(temp /10) # RENVOI DES VALEURS DANS LE PROMPT print('vitesse =', vitesse, 'tr/min') print('couple =', couplech, 'Nm') print('temperature =',tempech,'°C') time.sleep(0.3) try: #ECRITURE DES DONNEES DANS UN FICHIER EXCEL wb = load_workbook(filename = 'BDD_MODBUS.xlsx') ws1 = wb.active ws1['A1'] = vitesse ws1['B1'] = couplech ws1['C1'] = tempech wb.save(filename = 'BDD_MODBUS.xlsx') time.sleep(0.3) # GESTION DES EXCEPTIONS D'ACCES AU FICHIER EXCEL BDD_MODBUS except PermissionError: colision = colision + 1 print("nombre de colisions = ",colision)
et ci dessous le code vba
Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59 'Fonction de récupération des données dans le fichier excel fermé pour données température et variateur Private Function ExtraireValeur(ByVal Dossier As String, ByVal Fichier As String, ByVal Feuille As String, ByVal Cellule As String) Dim Argument As String Fichier = Replace(Fichier, "'", "''") Argument = "'" & Dossier & "[" & Fichier & "]" & Feuille & "'!" & Range(Cellule).Address(, , xlR1C1) ExtraireValeur = ExecuteExcel4Macro(Argument) End Function Sub rec() ' renseignement des parametres pour exécution fonction sDossier = "D:\PYTHON\" sNomFichier = "BDD_MODBUS.xlsx" sNomFeuille = "Feuil1" If (Enregistrement = 1) Then mypy = "D:\PYTHON\modbus2.py" X = Shell("C:\Users\micka\AppData\Local\Programs\Python\Python37\python.exe" & " " & mypy, 1) If X = 0 Then MsgBox "Impossible de lancer Python !", vbOKOnly End If Application.Wait (Now + TimeValue("00:00:08")) 'Exécution récuparation de données Sheets("Feuil1").Cells(10, 10) = ExtraireValeur(sDossier, sNomFichier, sNomFeuille, "A1") Sheets("Feuil1").Cells(10, 11) = ExtraireValeur(sDossier, sNomFichier, sNomFeuille, "B1") Sheets("Feuil1").Cells(10, 12) = ExtraireValeur(sDossier, sNomFichier, sNomFeuille, "C1") Sheets("Feuil1").Range("A10").Value = Now Sheets("Feuil2").Cells(Compteur + 5, 1).Value = Sheets("Feuil1").Range("A10").Value Sheets("Feuil2").Cells(Compteur + 5, 2).Value = Sheets("Feuil1").Range("B10").Value Sheets("Feuil2").Cells(Compteur + 5, 3).Value = Sheets("Feuil1").Range("C10").Value Sheets("Feuil2").Cells(Compteur + 5, 4).Value = Sheets("Feuil1").Range("D10").Value Sheets("Feuil2").Cells(Compteur + 5, 5).Value = Sheets("Feuil1").Range("E10").Value Sheets("Feuil2").Cells(Compteur + 5, 6).Value = Sheets("Feuil1").Range("F10").Value Sheets("Feuil2").Cells(Compteur + 5, 7).Value = Sheets("Feuil1").Range("G10").Value Sheets("Feuil2").Cells(Compteur + 5, 8).Value = Sheets("Feuil1").Range("H10").Value Sheets("Feuil2").Cells(Compteur + 5, 9).Value = Sheets("Feuil1").Range("I10").Value Sheets("Feuil2").Cells(Compteur + 5, 10).Value = Sheets("Feuil1").Range("J10").Value Sheets("Feuil2").Cells(Compteur + 5, 11).Value = Sheets("Feuil1").Range("K10").Value Sheets("Feuil2").Cells(Compteur + 5, 12).Value = Sheets("Feuil1").Range("L10").Value Application.OnTime Now + TimeSerial(0, 0, Sheets("Attaque Al").Range("E22").Formula), "rec" Compteur = Compteur + 1 End If End Sub
Pouvez vous me dire pourquoi lorsque j'éxécute le script python manuellement ( doubleclik sur le .py) l'ensemble du script s'éxécute (copie des données dans le xlsx)
et lorsque le code vba tourne, on a bien l'affichage des print dans le prompt, mais la requete d'écriture dans le xlsx ne se fait pas ?
Je vous remerci
Partager