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

时间:2015-02-18 01:16:49

标签: c# excel netoffice

我正在使用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):有关详细信息,请参阅内部异常。 ---> System.Reflection.TargetInvocationException:调用目标抛出了异常。 ---> System.Runtime.InteropServices.COMException:来自HRESULT的异常:0x800A03EC ---内部异常堆栈跟踪结束--- at System.RuntimeType.InvokeDispMethod(String name,BindingFlags invokeAttr,Object target,Object [] args,Boolean [] byrefModifiers,Int32 culture,String [] namedParameters) at System.RuntimeType.InvokeMember(String name,BindingFlags bindingFlags,Binder binder,Object target,Object [] providedArgs,ParameterModifier [] modifiers,CultureInfo culture,String [] namedParams) at System.Type.InvokeMember(String name,BindingFlags invokeAttr,Binder binder,Object target,Object [] args,CultureInfo culture) 在NetOffice.Invoker.PropertySet(COMObject comObject,String name,Object [] value) 在NetOffice.Invoker.PropertySet(COMObject comObject,String name,Object [] value) 在NetOffice.ExcelApi.Range.set_Value(对象值) at ExcelExamplesCS45.Example01.RunExample()位于\ psf \ home \ Documents \ Visual Studio 2013 \ Projects \ Excel-REPL \ Excel-REPL \ Example01.cs:第29行 在\ psf \ home \ Documents \ Visual Studio 2013 \ Projects \ Excel-REPL \ Excel-REPL \ MainClass.cs中的ClojureExcel.MainClass.Test():第310行"

2 个答案:

答案 0 :(得分:6)

    Exception from HRESULT: 0x800A03EC

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

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

设施代码为0x0A = 10.这意味着"应用程序定义错误"。或者换句话说,错误代码高度特定于生成错误的应用程序。错误代码是0x03EC = 1004.所以你可以把它写成单词:" Excel错误1004"。

你可以通过谷歌获得 356,000 点击量。花一些时间阅读热门歌曲,了解它的全部内容。忽略吸血鬼网站点击,只要你开始运行注册表清理程序,就会承诺修复你机器上的任何错误。这片土地的存在是这个错误非常常见,它也是在宏和VBA代码中生成的。通常会有一个稍微好一点的错误消息,在Excel中,您可以获得超出1004错误代码的错误的简要说明。但是,当您使用自动化时,您将不得不这样做,这当然会让它变得更难。

通过查看堆栈跟踪可以获得另一个数据点,您可以看到NetOffice的功能。它使用后期绑定(InvokeDispMethod),因此您无法100%确定特定的互操作方法失败。它是NetOffice的一个广告功能,它实际上使得故障排除变得更加困难。但是一个非常值得注意的互操作点是" Range.set_Value"。您可以对高度特定的Excel自动化属性进行逆向工程,Excel对象模型具有Range接口,并且具有Value属性。它正在分配失败的属性。与您要执行的操作完全匹配,设置单元格的值。

因此,您可以将Google查询改进为" Excel错误1004 Range.Value"。这使得点击更加具体,前4个点击都是SO问题,并且所有吸血鬼网站点击都被过滤。总结错误的顶部解释:

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

您可以非常轻松地删除第一个项目符号,只需确保电子表格不受保护和/或使用Unprotect()。对于第二个项目符号相同,只需回写您所阅读的内容即可。第三个子弹不可能,你可以读好细胞。第4个项目符号与您的问题标题完全匹配,"用户定义函数"。换句话说,问题是

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

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

假设要做什么的UDF返回一个值,然后该值成为显示的单元格值。 This KB article记录了UDF的限制。 This SO question的答案是关于在.NET代码中实现UDF,它提到了Excel-DNA。

答案 1 :(得分:0)

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