在Excel上获取python XLwings用户定义的函数以定期运行

假设我有这个在python v3.6 xlwings v0.11中定义的UDF在Excel 2016上运行。

import xlwings as xw @xw.func def random_val(x): import random return random.random()*x 

UDF被导入到支持xlwings的Excel工作表中。 我已经testing了公式=random_val(2)在单元格A1工作正常。

我的问题是如何以1分钟的时间间隔运行此UDF,以便每分钟在单元格A1刷新输出。

这可以通过macros轻松完成。

 import xlwings as xw @xw.sub def my_macro(): import time import random wb = xw.Book.caller() while True: time.sleep(60) wb.sheets[0].range('A1').value = random.random() 

点击导入Python UDF之后,可以通过Alt + F8执行,或者通过绑定到一个button来使用这个macros。 对于后者,请确保在“文件”>“选项”>“自定义function区”下select了“开发人员”选项卡。 然后,在Developer选项卡下,可以通过Insert> Form Controls插入一个button。 绘制button后,系统会提示您为其分配一个macros,然后可以selectmy_macro。

这可能不是你所期望的,但它的工作方式是你想要的。

因此,想象你的function打印在HH:MM:SS的时间是这样的:

 Public Function MyTimeMinutesSeconds() As String Application.Volatile MyTimeMinutesSeconds = Format(Hour(Now), "00") & ":" & _ Format(Minute(Now), "00") & ":" & _ Format(Second(Now), "00") End Function 

因此,如果每N秒重新计算一次工作表,那么函数将每N秒调用一次并更新。 这是如何调用它是这样的:

 Option Explicit Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Public Sub Starting() Dim i As Long: i = 1 [a1].Formula = "=MyTimeMinutesSeconds()" While i < 6 Sleep (500) Calculate i = i + 1 Wend End Sub 

你得到的是在excel中一个不错的时钟:

在这里输入图像说明


技巧是在函数的Application.Volatile部分:

工作表上的任何单元格中发生计算时,都必须重新计算易失性函数 。 非易失性function仅在inputvariables发生变化时重新计算。 如果该方法不在用于计算工作表单元格的用户定义函数内,则此方法不起作用。