Excel用户定义的函数locking调用电子表格

我正在使用NetOffice编辑Excel电子表格。 如果我从Excel用户定义的函数调用代码,它不会让我编辑调用电子表格。

Excel.Application excelApplication = Excel.Application.GetActiveInstance(); Excel.Worksheet workSheet = (Excel.Worksheet) excelApplication.ActiveSheet; Excel.Range cell = workSheet.Cells[2, 2]; object value = cell.Value; //works cell.Value = 3; //Throws Exception 

有没有一个解决方法,将使我能做到这一点?

例外是

“System.Runtime.InteropServices.COMException(0x80004005):查看内部exception的详细信息—> System.Reflection.TargetInvocationException:调用的目标引发了exception—> System.Runtime。 InteropServices.COMException:exception从HRESULT:0x800A03EC —结束内部exception堆栈跟踪—在System.RuntimeType.InvokeDispMethod(String name,BindingFlags invokeAttr,Object target,Object [] args,Boolean [] byrefModifiers,Int32 culture, (String name,BindingFlags bindingFlags,Binder binder,Object target,Object [] providedArgs,ParameterModifier [] modifiers,CultureInfo culture,String [] namedParams)在System.Type.InvokeMember(String,String [] namedParameters) (COMObject comObject,String name,BindingFlags invokeAttr,Binder binder,Object target,Object [] args,CultureInfo culture)at NetOffice.Invoker.PropertySet(COMObject comObject,String name,Object [] value)at NetOffice.Invoker.PropertySet对象[] va 在\ psf \ home \ Documents \ Visual Studio 2013 \ Projects \ Excel-REPL \ Excel-REPL \ Example01.cs中的ExcelExamplesCS45.Example01.RunExample()中的NetOffice.ExcelApi.Range.set_Value(Object value)在\ psf \ home \ Documents \ Visual Studio 2013 \ Projects \ Excel-REPL \ Excel-REPL \ MainClass.cs中的ClojureExcel.MainClass.Test()

  Exception from HRESULT: 0x800A03EC 

我只是描述一个像这样的问题的一般故障排除策略,已经有很多这个错误的答案。 也许太多了。

HRESULT是一个错误代码,可以帮助您查明错误的根本原因。 它分为三部分,错误的严重程度,“设施”代码和错误代码。 您的机器上的WinError.h SDK文件可以准确显示代码中的哪些位与信息的哪一部分相对应。 “设施”是一个令人讨厌的词,意思是“错误来源”。

设施代码是0x0A = 10。这意味着“应用程序定义的错误”。 换句话说,错误代码对于产生错误的应用程序是非常具体的。 错误代码是0x03EC = 1004.所以你可以把它写成单词:“Excel错误1004”。

这是你可以谷歌,你会得到356000点击。 花一些时间阅读顶尖的点击,看看它是什么。 忽略吸血鬼网站点击,这种承诺修复您的机器上的任何错误,只要你开始运行registry清理。 这块土地是这个错误是非常普遍的,它也是在macros和VBA代码中生成的。 通常使用稍微好一点的错误消息,在Excel内部,您可以获得超出1004错误代码的错误的简要说明。 然而,当你使用自动化时,你必须做到这一点,这使得当然更难。

您可以从查看堆栈跟踪中获得另一个数据点,您可以看到NetOffice的function。 它使用迟绑定(InvokeDispMethod),所以你不能100%确定具体的互操作方法失败。 NetOffice的广告function,实际上使问题更加困难。 但非常显着的交互点是“Range.set_Value”。 这是你可以逆向工程到一个高度特定的Excel自动化属性,Excel对象模型有一个Range接口,它有一个Value属性。 这是分配失败的财产。 完全匹配你正在做的事情,设置一个单元格的值。

因此,您可以将您的Google查询改为“Excel error 1004 Range.Value”。 这使得命中更具体,前4名点击都是SO问题,所有的吸血鬼网站点击被过滤。 总结错误的最重要的解释:

  • 您不能写入电子表格,因为它受到保护
  • 您写入的值与单元格格式不兼容,如无效的date
  • 您尝试更新的范围无效,如行或列号<= 0
  • 该代码运行由于在单元格中input的函数,它正在尝试更新另一个单元格。

您可以很容易地消除第一个子弹,只要确保电子表格不受保护和/或使用Unprotect()。 第二颗子弹也是一样,只要把你读的东西写回来。 第三个子弹不可能,你可以读取单元格就好了。 第四个项目符号与您的问题“用户定义函数”的标题完全匹配。 换句话说,问题是

  Excel.Range cell = workSheet.Cells[2, 2]; 

有问题,这不是包含用户定义函数的单元格。 所以分配是非法的。 我不能提出一个解决方法,不知道什么是特殊的[2,2]。 尝试将其更改为实际包含UDF的单元格。

UDF 应该做的是返回一个值,然后成为显示的单元格值。 这个知识库文章logging了UDF的限制。 这个问题的答案是关于在.NET代码中实现UDF的问题,它提到了Excel-DNA。

有一个非常简单的解决方法:只需在一个单独的线程中编辑工作表。 为什么我没有想到它开始!!