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

时间:2017-09-07 05:20:37

标签: python excel xlwings

假设我在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刷新输出。

2 个答案:

答案 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的一个很好的滴答时钟:

enter image description here

诀窍在于函数的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。