在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发生变化时重新计算。 如果该方法不在用于计算工作表单元格的用户定义函数内,则此方法不起作用。