【发布时间】:2012-12-07 07:26:01
【问题描述】:
我将解释我发现的所有内容,但简而言之,我只是想在后面的代码中设置单元格 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
源=“”错误代码=-2146827284 堆栈跟踪: 在 System.RuntimeType.ForwardCallToInvokeMember(字符串成员名称,BindingFlags 标志,对象目标,Int32 [] aWrapperTypes, 消息数据和消息数据) 在 Microsoft.Office.Interop.Excel.Range.set_Value2(对象值) 在 C:\Users\Antonio\Dropbox_Temp\visual studio\Probe 中的 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
如何使宏和函数中的代码以相同的方式运行?我想在用户键入公式而不是在用户运行宏时触发该方法的执行。 即使我让函数运行宏,我也会得到同样的异常我没有得到异常的唯一方法是,如果首先运行的是宏......
【问题讨论】:
-
Excel VBA Sub 不会返回,但 Function 会。所以你的
Function Test不会... -
最后一个
Function Test()呢?那个返回。它调用 ImportData 方法。那个方法不能改变单元格A1的值,为什么?如果我从宏运行相同的方法,它工作正常。感谢您的帮助! -
您真正想做的是制作一个加载项以在特定时间更改单元格值?每秒之后?
-
我有一块板:am.renesas.com/products/tools/introductory_evaluation_tools/… 我能够读取变量的值。我想每 500 毫秒读取一次值。我可以用宏来做到这一点,但我想在 excel 中创建一个函数来做到这一点。我的方法的签名看起来像
Read(memAddress as String, numberOfBytesToRead as integer) -
变量?还是单元格值?你能告诉我们你当前的宏吗?你为什么使用
range1.Value2?为什么不value?
标签: c# excel vba excel-addins