c# - Excel 用户定义函数锁定调用电子表格

标签 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

是否有解决方法可以让我做到这一点?

异常(exception)情况是

“System.Runtime.InteropServices.COMException (0x80004005):有关详细信息,请参阅内部异常。---> System.Reflection.TargetInvocationException:调用目标已抛出异常。---> 系统.Runtime.InteropServices.COMException:HRESULT 异常:0x800A03EC --- 内部异常堆栈跟踪结束 --- 在 System.RuntimeType.InvokeDispMethod(字符串名称,BindingFlags invokeAttr,对象目标,对象 [] args, bool [] byrefModifiers,Int32 文化,字符串 [] namedParameters) 在 System.RuntimeType.InvokeMember(String name, BindingFlags bindingFlags, Binder binder, Object target, Object[] providedArgs, ParameterModifier[] modifiers, CultureInfo culture, String[] namedParams) 在 System.Type.InvokeMember(字符串名称、BindingFlags invokeAttr、 Binder Binder 、对象目标、对象 [] args、CultureInfo 文化) 在 NetOffice.Invoker.PropertySet(COMObject comObject,字符串名称,对象 [] 值) 在 NetOffice.Invoker.PropertySet(COMObject comObject,字符串名称,对象 [] 值) 在 NetOffice.ExcelApi.Range.set_Value(对象值) 在\psf\home\Documents\Visual Studio 2013\Projects\Excel-REPL\Excel-REPL\Example01.cs 中的 ExcelExamplesCS45.Example01.RunExample():第 29 行 在 ClojureExcel.MainClass.Test() 在\psf\home\Documents\Visual Studio 2013\Projects\Excel-REPL\Excel-REPL\MainClass.cs:line 310"

最佳答案

    Exception from HRESULT: 0x800A03EC

我将只描述针对此类问题的一般故障排除策略,针对此错误已有许多 答案。也许太多了。

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

设施代码是 0x0A = 10。这意味着“应用程序定义的错误”。或者换句话说,错误代码对于生成错误的应用程序是高度特定的。错误代码是 0x03EC = 1004。因此您可以将其表达为:“Excel 错误 1004”。

这是您可以用 Google 搜索的内容,您将获得 356,000 的点击率。花一些时间阅读 HitTest 门的文章,了解它的全部内容。忽略吸血鬼网站点击,只要您从运行注册表清理器开始,就会 promise 修复您机器上的任何错误。据了解,此错误非常常见,它也会在宏和 VBA 代码中生成。通常使用稍微好一点的错误消息,在 Excel 中,您可以获得除 1004 错误代码之外的错误的简要说明。然而,当您使用自动化时,您将不得不在没有它的情况下进行操作,这当然会变得更加困难。

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

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

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

您可以很容易地消除第一个项目符号,只需确保电子表格未 protected 和/或使用 Unprotect()。第二个项目符号相同,只需写回您阅读的内容。第三颗子弹不可能,你可以很好地阅读单元格。第 4 个项目符号与您的问题标题“用户定义函数”完全匹配。也就是说,问题是

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

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

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

关于c# - Excel 用户定义函数锁定调用电子表格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28574287/

相关文章:

c# - 以编程方式获取锁定 Excel 工作簿的用户

c# - 在任务中抛出异常时处理泄漏

c# - 无法在服务器资源管理器中创建新的 VS 数据连接

mysql - 'latin- 1' codec can' t 编码字符 u'\u2014' 在位置 23 : ordinal not in range(256)

.net - 使用 NetOffice 互操作时,无法将 excel 对象作为参数从 VBA 传递到 .NET

c# - NetOffice Outlook 插件部署

c# - 运行时编译期间收到 “You must add a reference to assembly ' netstandard'”错误

C# Linq to Entities : The type of one of the expressions in the join clause is incorrect. 类型推断失败

excel - VBA 从监 window 口打开 Outlook

excel - 将工作表复制到多个工作簿 - 公式引用