我将解释我发现的所有内容,但简而言之,我只是想要在代码中设置单元格A1的值。我已尝试Create Excel Add-in - get cell value加上其他链接,所有这些技术只有在我在宏上运行它们才有效但我想从一个函数执行它们。
让我开始解释:
我不明白为什么当我在一个函数和一个Sub上运行相同的代码时,我会得到一个奇怪的行为。请看以下示例:
Dim TimeToRun
Sub Macro1()
'Dim addIn As COMAddIn
'Dim automationObject As Object
'Set addIn = Application.COMAddIns("ProbeAddIn")
'Set automationObject = addIn.Object
'automationObject.ImportData
MsgBox "Hello world"
End Sub
Sub Macro2()
TimeToRun = Now + TimeValue("00:00:01")
Application.OnTime TimeToRun, "Macro1" ' run Macro1 on 1 seconds
End Sub
Function Test()
TimeToRun = Now + TimeValue("00:00:01")
Application.OnTime TimeToRun, "Macro1" ' run Macro1 on 1 seconds
End Function
请注意,Macro2
和函数Test
具有相同的代码。为什么如果我运行Macro2它工作正常(消息框显示)。但是如果我去一个单元格并输入=Test()
,那么即使我有相同的代码,我也会收到错误!
我之所以展示这个例子的原因是因为我在Macro1上注释掉的代码在我通过直接运行宏来运行它时效果很好。如果我将该代码放在函数Test中,它就不起作用。该代码在visual studio上的加载项项目中执行以下方法:
例外是:
System.Runtime.InteropServices.COMException未被用户代码处理 HResult = -2146827284消息=来自HRESULT的异常:0x800A03EC
Source =“”ErrorCode = -2146827284 StackTrace: 在System.RuntimeType.ForwardCallToInvokeMember(String memberName,BindingFlags flags,Object target,Int32 [] aWrapperTypes, MessageData&安培; MSGDATA) 在Microsoft.Office.Interop.Excel.Range.set_Value2(对象值) 在C:\ Users \ Antonio \ Dropbox_Temp \ visual studio \中的ReadWrite.ImportData()中添加 test \ ProbeAddIn \ ProbeAddIn \ Class1.cs:第82行InnerException:
我得到了那个例外,因为我跑了:
Function Test()
Dim addIn As COMAddIn
Dim automationObject As Object
Set addIn = Application.COMAddIns("ProbeAddIn")
Set automationObject = addIn.Object
automationObject.ImportData
End Function
而不是
Sub Test()
Dim addIn As COMAddIn
Dim automationObject As Object
Set addIn = Application.COMAddIns("ProbeAddIn")
Set automationObject = addIn.Object
automationObject.ImportData
End Function
如何使宏和函数内的代码以相同的方式运行?当用户在公式中键入而非用户运行宏时,我想触发该方法的执行。 即使我有运行宏的函数我得到相同的异常我没有得到异常的唯一方法是运行的第一件事是宏......
答案 0 :(得分:2)
不确定,但您遇到的问题可能是因为当您的函数被触发时,Excel应用程序处于编辑模式,因此无法接受来自外部的任何输入,因此您遇到异常尝试插入数据。
如果您想以干净的方式连续更新单元格,您需要的是 RTD服务器。
您只需致电:
=RTD("my.super.rtdserver",,"mydata")
RTD服务器会不时向Excel通知新数据,并让Excel 回拨在准备就绪时检索它们。