如何不挂Excel?

我有这个问题,我的易失性,macros型UDF设置调用单元格旁边的几个单元格的值完美工作,除非在工作表中使用两次(或更多):Excel状态栏开始闪烁“正在计算…” 。

我不是一个真正的挂起,而是一个沉重的重新计算:在示例函数的计数器绘制没有实际挂起的琐碎。

此外,我不确定使用易失性UDF,因为我需要自动重新计算,但只能在input更改,而不是不断的轮询。

我做了三个function的示例模块:

  • VolatileNyanCat – 类似于我的UDF:一个SetValue调用。 如果使用两次, Excel挂起
  • NonVolatileOneNyanCat – 如上,但不易变。 不挂,但我需要自动重新计算。
  • HangNyanCat – 它在两个不同的范围内两次调用SetValueExcel挂起。

我认为这与ExcelAsyncUtil.QueueAsMacro如何工作和线程安全有关,但我在这里感到困惑。

 Imports ExcelDna.Integration Imports ExcelDna.Integration.XlCall Public Module Example <ExcelFunction(IsMacroType:=True, IsVolatile:=True)> Public Function VolatileNyanCat() As String Dim caller = CType(XlCall.Excel(XlCall.xlfCaller), ExcelReference) Dim NyanCat(,) As String = {{"Nyan", "Cat"}} Dim nc As New ExcelReference(caller.RowFirst + 1, caller.RowLast + 1, caller.ColumnFirst, caller.ColumnLast + 1, caller.SheetId) Static nyy As Integer = 1 ExcelAsyncUtil.QueueAsMacro(Sub() nyy += 1 nc.SetValue(NyanCat) End Sub) Return "NYA! x " + CStr(nyy) End Function <ExcelFunction(IsMacroType:=True)> Public Function NonVolatileOneNyanCat() As String Dim caller = CType(XlCall.Excel(XlCall.xlfCaller), ExcelReference) Dim NyanCat(,) As String = {{"Nyan", "Cat"}} Dim nc As New ExcelReference(caller.RowFirst + 1, caller.RowLast + 1, caller.ColumnFirst, caller.ColumnLast + 1, caller.SheetId) Static nyy As Integer = 1 ExcelAsyncUtil.QueueAsMacro(Sub() nyy += 1 nc.SetValue(NyanCat) End Sub) Return "NYA! x " + CStr(nyy) End Function <ExcelFunction(IsMacroType:=True, IsVolatile:=True)> Public Function HangNyanCat() As String Dim caller = CType(XlCall.Excel(XlCall.xlfCaller), ExcelReference) Dim nyan(,) As String = {{"Nyan"}} : Dim cat(,) As String = {{"Cat"}} Dim n As New ExcelReference(caller.RowFirst + 1, caller.RowLast + 1, caller.ColumnFirst, caller.ColumnLast, caller.SheetId) Dim c As New ExcelReference(caller.RowFirst + 1, caller.RowLast + 1, caller.ColumnFirst + 1, caller.ColumnLast + 1, caller.SheetId) Static nyy As Integer = 1 ExcelAsyncUtil.QueueAsMacro(Sub() n.SetValue(nyan) c.SetValue(cat) nyy += 1 End Sub) Return "NYA! x " + CStr(nyy) End Function End Module 

ExcelAsyncUtil.QueueAsMacro尽快运行代码 – 在这种情况下,计算完成时。 但是你运行的macros在表单上设置了一些值,所以易失性函数将再次计算。 其中排队一个新的macros设置一些细胞…等等,所以一切似乎按预期工作。

从UDF内部设置其他单元格是不推荐和阻止的Excel – 这就是为什么你必须通过奇怪的macros路由。 如果你可以重构你的函数而没有这样的副作用,Excel将变得更加快乐。