0

我将解释我发现的所有内容,但简而言之,我只想在后面的代码中设置单元格 A1 的值。我已经尝试过创建 Excel 插件 - 获取单元格值以及其他链接,所有这些技术只有在我在宏上运行它们但我想从函数中执行它们时才有效。

那么让我开始解释:

我不明白为什么当我在函数和 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 Message=Exception from HRESULT: 0x800A03EC
Source="" ErrorCode=-2146827284 StackTrace: at System.RuntimeType.ForwardCallToInvokeMember(String memberName, BindingFlags flags, Object target, Int32 [] aWrapperTypes, MessageData& msgData) 在 Microsoft.Office.Interop.Excel.Range.set_Value2(Object value) 在 ReadWrite.ImportData() 在 C:\Users\Antonio\Dropbox_Temp\visual studio\Probe 添加测试\ProbeAddIn\ProbeAddIn \Class1.cs:第 82 行内部异常:

我得到了那个例外,因为我跑了:

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

如何使宏和函数中的代码以相同的方式运行?我想在用户键入公式而不是在用户运行宏时触发该方法的执行。即使我让函数运行宏,我也会得到相同的异常我没有得到异常的唯一方法是,如果首先运行的是宏......

4

1 回答 1

2

不确定,但您遇到的问题可能是因为当您的函数被触发时,Excel 应用程序处于编辑模式,因此无法接受来自外部的任何输入,因此当您尝试插入数据时出现异常。

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

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

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

您的RTD 服务器会不时通知 Excel 新数据,并让 Excel在准备好时回调以检索它们。

于 2012-12-19T21:44:37.017 回答