我有一个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.
干杯
答案 0 :(得分:0)
事先关闭计算:
Application.Calculation = xlCalculateManual
准备好后,您可以使用...
强制进行计算Application.Calculate
...然后将其重新打开:
Application.Calculation = xlCalculationAutomatic