Actualiser un programe python avant une macro
Bonjour tout le monde, j'ai commencé à apprendre le VBA il n'y a pas longtemps et jusque là j'ai réussi à m'en sortir (beaucoup grâce à ce forum, merci), mais actuellement je rencontre un problème. J'ai un programme sur ma worksheet, lorsque le clique sur une colone de cellules, le programme me lance une macro pour executer un autre programme python dans une cellule et ainsi actualiser son résultat retourné (il s'agit d'une valeur dépandant du temps). Ensuite je veux que ça copie-colle cette valeur dans une autre cellule pour la sauvegarder. Le problème c'est que malgré toutes les tentatives de code différents que j'ai fait j'en reviens toujours au même cas, il me colle une erreure car mon programme python est #BUSY pendant tout mon programme. J'ai essayé des Application.Wait, des RefreshAll, ou encore de faire en plusieurs macros mais rien ne change. Si quelqu'un a une solution je suis très intéressé. Voici un exemple avec ma dernière tentative du programme. Merci d'avance pour votre aide.
Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Application.Intersect(Target, Range("H1").EntireColumn) Is Nothing Then
Call Macro3
Workbooks(1).RefreshAll
Application.Wait (Now + TimeValue("0:00:10"))
Call Macro5
Target.Show
End If
Sub Macro3()
Range("A1").Activate
ActiveCell.Formula2R1C1 = _
"=PY(***Mon code Python***)
End Sub
Sub Macro5()
'Cette macro sert de test'
Range("B1").Value = 5
End SubBonjour,
Avez-vous essayé quelque chose comme ceci ? Je ne sais pas si les fonctions python en cellule "taggent" correctement l'état de calcul, espérons que oui.
Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Application.Intersect(Target, Range("H1").EntireColumn) Is Nothing Then
Call Macro3
Application.Calculate
If Not Application.CalculationState = xlDone Then
DoEvents
End If
Call Macro5
Target.Show
End If
End SubMerci beacoup d'avoir pris de votre temps pour m'aider. Cependant, le problème n'est pas réglé, même si toutefois il est différent. Avant ma macro5 affichait un 5 dans ma cellule B1 au même moment que le #BUSY disparaissait, maintenant le 5 apparait avant même que le #BUSY s'en aille. Par ailleur j'ai oublié de le dire dans mon poste précédent mais ma macro5 ne colle pas la valeur de mon programme python, car je voulais une macro simple pour mes tests, mais j'ai d'abord essayé en copie-collant la valeur du python, cela m'écrit dans la cellule erreur2051.
Sub Macro5()
Range("B1").Value = CStr(Range("A1").Value)
End SubD'accord. Après quelques tests effectivement j'observe que les cellules python n'affectent pas l'état de calcul du classeur. Donc a priori impossible de savoir quand le calcul est terminé… Du coup oui j'imagine que votre solution avec un Timer de 10 secondes est sans doute la plus simple.
Si jamais, il est peut-être possible de traiter votre call python directement dans Excel, le calcul est-il complexe ?
Non le code python ne l'est absolument pas c'est juste un petit algorythme qui me fait un "code" en fonction de la date et de l'heure, il s'execute normalement en même pas 1 seconde. Je peux peut être le faire en VBA mais connaissant beaucoup mieux python j'ai préféré faire avec. Je sais que excel à besoin d'internet pour executer du python c'est sans doute pour ca qu'il prend un peu plus de temps, mais sans le timer de 10 secondes, il prend seulement 1 seconde, 2 maximum.
from os import wait
from datetime import datetime, time, date
import pytz
x = time(5, 00, 00)
y = time(13, 00, 00)
z = time(21, 00, 00)
heure = datetime.now(pytz.timezone('Europe/Paris'))
heurefr = heure.time()
e = 3
if x <= heurefr <= y:
e = 1
if y <= heurefr <= z:
e = 2
a = heure.strftime("%w")
b = date.today().isocalendar()[1]
c = heure.strftime("%y")
c = c[-1:]
str(e)+a+str(b)+cOui effectivement. Je vous dis ça car l'intégration de Python dans Excel est encore assez bateau, et donc quand vous la combinez avec d'autres interactions comme VBA on se trouve vite face à des problèmes.
Bon en l'occurence le code en question me semble facilement adaptable en VBA. Si vous pouviez me confirmer, l'objectif c'est de prendre l'heure-date actuelle (à Paris) et de la formater selon une présentation spécifique ? C'est possible en VBA aussi.
J'ai juste du mal à comprendre la variable e (découpe de la journée en 3 plages ?)
Pour info, en VBA Now function (Visual Basic for Applications) | Microsoft Learn vous renvoie "maintenant", basé sur le fuseau horaire du PC. Ensuite si vous voulez un formatage particulier (numéro de semaine et autre) je dirai de le faire directement dans le classeur avec les nombreuses formules de date disponibles.
Bonjour, oui mon code à pour but de me renvoyer un nombre sous la forme : Quel tier de la journée / n° jour de la semaine / n° semaine / dernier chiffre de l'année Par exemple à l'heure où j'envoie ce message ça donne : 15165
Ca m'avais l'air d'être très compliqué voir impossible à faire en VBA, mais puisque vous dites que c'est possible je vais m'y atteler, en essayant de ne avoir à pas revenir vous solliciter
Même si le problème n'a pas été résolu, merci beaucoup pour votre aide.
Hello,
Avec LibreOffice , tu peux utiliser le python comme langage de programmation.
Voici le code d'une macro python "embarquée" dans un classeur qui fait ton calcul et qui met le résultat dans la cellule nommée Resultat en B2 :
# coding: utf-8
from __future__ import unicode_literals
from datetime import datetime, time, date
import pytz
def calculPython(*args):
doc = XSCRIPTCONTEXT.getDocument()
feuille = doc.CurrentController.getActiveSheet()
#On efface les résultats précédents
doc.NamedRanges.getByName("Resultat").getReferredCells().clearContents(31)
x = time(5, 00, 00)
y = time(13, 00, 00)
z = time(21, 00, 00)
heure = datetime.now(pytz.timezone('Europe/Paris'))
heurefr = heure.time()
e = 3
if x <= heurefr <= y:
e = 1
if y <= heurefr <= z:
e = 2
a = heure.strftime("%w")
b = date.today().isocalendar()[1]
c = heure.strftime("%y")
c = c[-1:]
doc.NamedRanges.getByName("Resultat").getReferredCells().String = str(e)+a+str(b)+c
A noter que je n'ai pas mis ton from os import wait qui n'existe pas dans le python de LibreOffice (3.8) et qui n'est pas utilisé.
Ami calmant, J.P
Merci beaucoup de m'avoir répondu, mais j'ai finalement réussi à refaire mon programme en VBA, il fonctionne et je n'ai plus aucun problème avec le rafraichissement pour mes autres calculs.
Bonne journée et merci encore.