VBA功能强制重新计算

时间:2015-04-15 17:37:15

标签: excel vba excel-vba

我有一个DLL,我使用包含Declare Function <func> Lib的子程序通过Excel VBA函数调用。为了控制dll的位置,我使用Application.VBE在运行时创建一个包含函数引用的模块(有点乱,但似乎唯一有效的解决方案)。

一切正常,但修改模块有不受欢迎的后果,即在评估后,单元格被立即标记为脏,导致i)没有结果写入单元格,ii)立即重新评估函数。

有没有办法防止功能弄脏电池?

伪代码(实际代码非常可怕)

模块1:

Function main()
  newModule = Proj.vbcomponents.Add(1).CodeModule.AddFromString(stng)
  main = module2.callDll()
End Function

Module2(包含在stng中):

Declare Function <func> Lib
Function callDll()
  callDll = func
End Function

我使用=main()

在工作表单元格中调用该函数

谢谢!

更新

我尝试过转换为手动计算,但这似乎无法解决上述问题。以下代码演示了该问题

Function main()
  Application.Calculation = xlCalculationManual
  Dim stng As String
  stng = _
  "Function callDll()" & Chr(13) & _
  "callDll = 1" & Chr(13) & _
  "End Function"
  On Error Resume Next
  ThisWorkbook.VBProject.VBComponents.Remove ThisWorkbook.VBProject.VBComponents(6)
  On Error GoTo 0
  ThisWorkbook.VBProject.VBComponents.Add(vbext_ct_StdModule).CodeModule.AddFromString (stng)
  main = Module2.callDll()
End Function

Function mainAlt()
  mainAlt = Module2.callDll()
End Function

=main()的工作表调用返回零,但调用=mainAlt()会返回正确的结果(一)

请注意,应用程序可扩展性的视觉基础......&#39;需要启用它作为参考,以便工作,并且我懒洋洋地假设创建的模块将具有索引6.

干杯

1 个答案:

答案 0 :(得分:0)

事先关闭计算:

Application.Calculation = xlCalculateManual

准备好后,您可以使用...

强制进行计算
Application.Calculate

...然后将其重新打开:

Application.Calculation = xlCalculationAutomatic