2017-08-14 1 views
0

J'ai une classe de mise à jour d'une valeur en direct:xlwings python retour en continu des données de mise à jour dans UDF

class LiveUpdate(): 

    def __init__(self): 

     self.x=0 

     self.t1 = threading.Thread(target=self._refresh_value) 
     self.t1.start() 

    def _refresh_value(self): 

     while True: 
      self.x=self.x+1 


updater=LiveUpdate() 

@xw.func 
def return_live_x(): 
    return updater.x 

Quand j'appelle return_live_x comme UDF, comment puis-je obtenir pour revenir en continu 1,2,3,4 etc dans Excel?

+0

Il est probable que vous obtiendrez '1000, 3000, 5000' sur appel de' return_live_x'. Lisez à propos de [File d'attente] (https://docs.python.org/3/library/queue.html), considérez l'exemple sur ce site. – stovfl

+0

Ca ne me dérange pas d'obtenir 1,2,5,7,8 etc c'est plus à propos d'obtenir l'UDF pour actualiser automatiquement la valeur dans Excel quand self.x mises à jour et return_live_x() est utilisé dans Excel – Dudey007

Répondre

0

Question: ... son plus sur l'obtention de l'UDF à l'auto actualiser la valeur dans Excel

UDF sont appelés si Excel décide de recalculer ou Touche pressée de le faire manuellement.

Je ne sais pas s'il est possible de démarrer et d'exécuter un script Python pour toujours en arrière-plan en utilisant xlwings.

je pouvais Imagin le follwoing, code non testé:

Remarque: Ce code pourrait conduire à Excel décrochage.

class LiveUpdate(): 
    def __init__(self, wb): 
     self.wb = wb 
     ... 

    def _refresh_value(self): 
     while True: 
      self.x += 1 
      self.wb.sheets[0].range('A1').value = self.x 
      time.sleep(1) 

@xw.func 
def start_LiveUpdate(): 
    LiveUpdate(xw.Book.caller()) 
    return 'started' 
+0

vous pouvez obtenir Python pour démarrer et mise à jour continue si vous utilisez optimzed_connection = True dans le module vba. – Dudey007

+0

im plus intéressé de voir si je peux obtenir start_LiveUpdate pour retourner la valeur la plus à jour de self.x – Dudey007