设置单元格的值join

我将解释我find的所有东西,但总之我只想在后面的代码中设置单元格A1的值 。 我已经尝试创buildExcel加载项 – 获取单元格值加上其他链接,所有这些技术只有当我在macros上运行它们,但我想要从一个函数执行它们。

所以让我开始解释一下:

我不明白为什么我得到一个奇怪的行为,当我在一个函数上运行相同的代码与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上注释过的代码如果通过直接运行macros运行,效果会很好。 如果我把这个代码放在函数Test中不起作用。 该代码正在Visual Studio的加载项目中执行以下方法:

在这里输入图像说明

例外是:

System.Runtime.InteropServices.COMException由用户代码未处理HResult = -2146827284消息= HRESULTexception:0x800A03EC
在Microsoft.Office.Interop.Excel.Range.set_Value2(对象值)上的System.RuntimeType.ForwardCallToInvokeMember(stringmemberName,BindingFlags标志,对象目标,Int32 [] aWrapperTypes,MessageData和msgData)上的StackTrace :: =“ErrorCode = -2146827284”在C:\ Users \ Antonio \ Dropbox_Temp \ visual studio \中的ReadWrite.ImportData()中添加testing\ ProbeAddIn \ ProbeAddIn \ Class1.cs:line 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 

我怎样才能使macros内部的代码和函数运行相同的方式? 当用户键入公式时,而不是用户运行macros时,我想触发该方法的执行。 即使我有运行macros的function,我得到了相同的exception唯一的办法,我没有得到一个例外是如果第一件事情是一个macros…

不知道,但你有问题可能是因为,当你的function被激活的Excel应用程序处于编辑模式 ,所以不能接受任何来自外部的input,因此当您尝试插入数据的exception。

如果你想以一种干净的方式连续更新一个单元,你需要的是一个RTD服务器

从你的单元格中,你只需要调用:

 =RTD("my.super.rtdserver",,"mydata") 

您的RTD服务器会不时地通知Excel新的数据,并在Excel准备就绪时让Excel 进行callback