HRESULT异常:0x800A03EC错误


71

使用以下代码运行Excel加载项时,出现“ HRESULT:0x800A03EC”错误:

Excel.Range rng = ActiveSheet.Cells[x, y] as Excel.Range;                
string before = rng.Value2; 
string cleanV = System.Text.RegularExpressions.Regex.Replace(before, @"\s+", "");
rng.set_Value(cleanV);

当发生错误时,X和Y设置为1,因此不会超出Excel范围。我进行了广泛的搜索,并尝试了多种设置单元格值的方法(例如,Cells [x,y],range.set_Value()),但是却迷茫为什么会发生此错误以及如何避免它。

任何帮助是极大的赞赏。

以下是异常详细信息:


System.Runtime.InteropServices.COMException was unhandled by user code
  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)
       at Microsoft.Office.Interop.Excel.Range.set_Value(Object RangeValueDataType, Object value)
       at ImportValidation.ThisAddIn.removeAnySpaces(Int32 x, Int32 y) in c:\Users\dshevelev\Documents\Visual Studio 2012\Projects\ImportValidation\ImportValidation\ThisAddIn.cs:line 354
       at ImportValidation.ThisAddIn.ReadHeaders(Hashtable columnAddress) in c:\Users\dshevelev\Documents\Visual Studio 2012\Projects\ImportValidation\ImportValidation\ThisAddIn.cs:line 123
       at ImportValidation.ThisAddIn.mapColumns() in c:\Users\dshevelev\Documents\Visual Studio 2012\Projects\ImportValidation\ImportValidation\ThisAddIn.cs:line 493
       at ImportValidation.Ribbon1.button6_Click(Object sender, RibbonControlEventArgs e) in c:\Users\dshevelev\Documents\Visual Studio 2012\Projects\ImportValidation\ImportValidation\Ribbon1.cs:line 55
       at Microsoft.Office.Tools.Ribbon.RibbonPropertyStorage.ControlActionRaise(IRibbonControl control)
       at Microsoft.Office.Tools.Ribbon.RibbonPropertyStorage.ButtonClickCallback(RibbonComponentImpl component, Object[] args)
       at Microsoft.Office.Tools.Ribbon.RibbonManagerImpl.Invoke(RibbonComponentCallback callback, Object[] args)
       at Microsoft.Office.Tools.Ribbon.RibbonMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
       at Microsoft.Office.Tools.Ribbon.RibbonManagerImpl.System.Reflection.IReflect.InvokeMember(String name, BindingFlags invokeAttr, Binder binder, Object target, Object[] args, ParameterModifier[] modifiers, CultureInfo culture, String[] namedParameters)
  InnerException: 

3
您是否找到或找到了解决该问题的答案?
scifirocket 2012年

1
此错误非常“泛型”,并且可能由多种原因引起。对我而言,发生这种情况的原因是将C#中的客户数据类型保存为excel。尝试保存日期包装器对象时出现此错误;我想excel api要求数据必须是c#基本类型,否则会引起问题。
stt106

Answers:


109

在这一行中得到了相同的错误

 Object temp = range.Cells[i][0].Value;

解决了基于非零的索引

 Object temp = range.Cells[i][1].Value;

创建此库的人怎么可能认为使用基于非零的索引是一个好主意?


36
IMO,这可能与以下事实有关:Excel的单元格命名方案实际上是基于非零的(“ R1C1”)...
CB

26
来自1.的BASIC索引。Excel在很早的时候(1980年代)就将BASIC包含为宏/脚本语言,后来又引入了Visual Basic for Applications。这是在类似C语言的语言在数学上更正确地从零开始的索引被广泛使用之前的。在1990年代,由于Java,Perl和Javascript等网络技术的出现,这种语言开始普遍使用。
Peter Gluck 2014年

在可能的情况下,一定已经考虑了Basic开发人员的需要。
Najeeb

18

这是一个常见但记录较差的Excel COM错误。我已经看到它记录为“ NAME_NOT_FOUND”,这意味着Excel的COM层已被禁用,并且找不到COM属性或方法名称。

我在Excel处于“忙碌”状态下运行COM代码时始终遇到此错误,例如,如果您设置了一个计时器来启动代码,并且在用户编辑单元格或按下鼠标按钮时代码开始运行,那么您将始终收到此错误。仅当代码在Excel主线程上运行时才会发生此错误,但似乎等同于错误VBA_E_IGNORE = 0x800AC472,当Excel处于“繁忙”状态时,从另一个线程调用Excel COM对象模型时会出现此错误。

唯一的解决方法似乎是重试COM调用(稍有延迟),直到成功为止-当Excel不再“忙”时。


看来您对此也许是正确的。不幸的是,经过一百万次以上的记录,我仍然遇到问题。
安东尼·梅森

如果用户正在忙于编辑公式,则此错误会无限期存在。
Govert's

实际上找不到名称时,例如格式不正确或缺少命名范围,也会发生这种情况。
扎克

8

检查您的开始索引。对于Microsoft.Office.Interop.Excel范围对象,它从1而不是0开始。由于循环起始值,我收到了相同的错误。


4

转到Excel选项>保存>以这种格式保存文件>选择“ Excel Workbook(*。xlsx)”。如果您使用的是旧版本的excel文件(.xls)而不是.xlsx,则会出现此问题。较旧的版本在Excel工作表中不允许超过65k行。

保存为.xslx后,请尝试再次执行代码。

编辑----

进一步研究您的问题,似乎该问题可能是特定于区域设置的。代码可以在另一台机器上工作吗?细胞有什么价值?它是日期时间格式吗?在这里看看:

http://support.microsoft.com/kb/320369

http://blogs.msdn.com/b/eric_carter/archive/2005/06/15/429515.aspx


1
谢谢您的建议,但这不是原因。我在Excel2010中工作,即使保存为“ xlsx”,也确实发生了异常。最奇怪的部分是它不会一直发生,而只会发生在某些数据组合上。我找不到导致它的模式。
丹尼尔·谢维列夫

1
您能在链接354上发布ThisAddin的代码吗?您是否正在尝试修剪单元格中的值?另外,您确定Cells [x,y]不是从0开始吗?单元格值从1开始,在Excel中不是零。
tranceporter,2012年

当文件名太长(不确定该限制是什么)时,我得到了这个信息
steveo40 2015年

4

也有此错误。

在保存到文件路径中包含无效字符的情况下发生,在我的情况下:

path = "C:/somefolder/anotherfolder\file.xls";

注意两者\/

*如果尝试保存到尚不存在的目录,也可能会发生。


4

我们遇到了同样的问题,并为我们找到了解决方案:

请制作此文件夹。C:\ Windows \ SysWOW64 \ config \ systemprofile \ Desktop·Windows 2008 Server x86
请创建此文件夹。C:\ Windows \ System32 \ config \ systemprofile \ Desktop


3

我知道这很古老,但只是为了介绍我的经验。今天早上我刚碰到它。轮到我们我的错误与.xls行限制或数组索引无关。这是由不正确的公式引起的。

我正在从数据库导出到Excel中有关客户的工作表。有人填写客户名称=90Erickson-King,显然,这可以作为数据库中的字符串类型字段使用,但是在Excel中作为公式会导致错误。#N/A程序没有像在使用Excel时那样显示,而是在稍后冻结并溢出了0x800A03EC错误。

我通过删除客户名称中的等号和破折号来纠正此问题。之后,出口顺利进行。

我猜这个错误代码太笼统了,因为人们看到的报告了很多不同的可能原因。


我只花了一个小时研究SSIS包脚本中的此错误。导出到Excel的字段是自由格式的输入,并且以=符号开头。快速更换以去除所有=标记以将其修复。谢谢!
Dave Cullum '18

因此,我猜测他们使用Office COM自动化作为访问Excel的基础方法,并且它的功能只有在使用COM时才会发生。我不得不说EPPlus或NPOI是处理开放xml格式的好得多的方法。
Lionet Chen

2

尝试导出大的Excel文件(〜150.000行)时遇到了相同的错误,并通过以下代码进行了修复

Application xlApp = new Application();
xlApp.DefaultSaveFormat = XlFileFormat.xlOpenXMLWorkbook;


0

一段时间之前,我收到了同样的错误。问题是我的XLS文件包含超过65531个记录(准确地说是50万个记录)。我正在尝试读取一系列单元格。

Excel.Range rng = (Excel.Range) myExcelWorkbookObj.UsedRange.Rows[i];

当我的计数器(即“ i”)超过此上限65531个记录时,尝试读取单元格范围时引发了异常。


0

再加上一个可能的问题导致此问题:公式错误,因为我根据我的语言环境使用了错误的列表分隔符。使用CultureInfo.CurrentCulture.TextInfo.ListSeparator;更正了此问题。

请注意,以下代码行引发了异常...


0

这肯定是世界上最通用的错误消息,因为我今天使用Excel Interop在以下命令中得到了它:

Excel.WorkbookConnection conn;
conn.ODBCConnection.Connection = "DSN=myserver;";

解决了在连接字符串中指定ODBC的问题:

conn.ODBCConnection.Connection = "ODBC;DSN=myserver;";

如果有其他人遇到此错误,我希望它会有所帮助。


0

:调用此代码时,我得到这个错误wks.Range[startCell, endCell]startCell范围和endCell范围分别指向不同的工作表则变量wks


0

此错误的另一个原因。当数据表(dtTable)的表名为空时,下面的代码示例返回错误:

  ' Open Excel workbook
  objExcelApp = New Application
  objExcelWorkbook = objExcelApp.Workbooks.Add()
  objExcelSheet = objExcelWorkbook.ActiveSheet
  objExcelSheet.Name = dtTable.TableName

0

仍然会在2020年看到此错误。正如上面的stt106所述,有很多很多可能的原因。以我为例,这是在将数据自动插入到工作表中的过程中,错误地输入了1019年而不是2019年的日期。由于我是使用数据数组插入的,因此很难找到问题,直到我切换到逐行插入。

这是我的旧代码,“隐藏”了问题数据。

    Dim DataArray(MyDT.Rows.Count + 1, MyDT.Columns.Count + 1) As Object
    Try
        XL.Range(XL.Cells(2, 1), XL.Cells(MyDT.Rows.Count, MyDT.Columns.Count)).Value = DataArray
    Catch ex As Exception
        MsgBox("Fatal Error in F100 at 1270: " & ex.Message)
        End
    End Try

一次插入同一行的数据时,它以相同的错误停止,但是现在很容易找到有问题的数据。

多年以后,我将添加此信息,以防其他人受到帮助。


-1

我遇到了同样的错误,但现在进行了排序。在我的情况下,我有标题为“ Key1”,“ Key2”和“ Key3”的列。我已经将列名更改为其他名称并进行了排序。

看来这些是保留关键字。

问候,Mahesh

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.