假设我在python v3.6 xlwings v0.11中定义了这个UDF,以便在Excel 2016上运行。
function fun1(){
console.log("done in fun1")
return
}
function fun3(){
console.log("done in fun3")
return
}
function fun2(){
var then = new Date().getTime() + 5000;
// wait five seconds the hard way
while(new Date().getTime() < then) {
};
console.log("done in fun2")
return
}
fun1()
fun2()
fun3()
将UDF导入到支持xlwings的Excel工作表中。我已经测试过,单元格A1中的公式import xlwings as xw
@xw.func
def random_val(x):
import random
return random.random()*x
工作正常。
我的问题是如何以1分钟的固定时间间隔运行此UDF,以便每分钟在单元格A1刷新输出。
答案 0 :(得分:3)
这可能不是您所期望的,但它可以按您希望的方式工作。
因此,假设您的函数以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
部分:
只要在工作表上的任何单元格中进行计算,就必须重新计算volatile function。仅当输入变量发生变化时,才会重新计算非易失性函数。如果它不在用于计算工作表单元格的用户定义函数内,则此方法无效。
答案 1 :(得分:3)
这可以通过宏轻松完成。
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执行此宏或通过绑定它来使用此宏。到一个按钮。对于后者,请确保在File&gt;下选择了Developer选项卡。选项&gt;自定义功能区。然后,在“开发人员”选项卡下,您可以通过“插入”按钮插入按钮。表格控制。绘制按钮后,系统将提示您为其指定一个宏,您可以选择my_macro。