我将解释我发现的所有内容,但简而言之,我只想在后面的代码中设置单元格 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
如何使宏和函数中的代码以相同的方式运行?我想在用户键入公式而不是在用户运行宏时触发该方法的执行。即使我让函数运行宏,我也会得到相同的异常我没有得到异常的唯一方法是,如果首先运行的是宏......