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