使用以下代码运行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:
答案 0 :(得分:96)
此行中出现相同的错误
Object temp = range.Cells[i][0].Value;
解决了非零指数
Object temp = range.Cells[i][1].Value;
创建这个库的人怎么可能认为使用基于非零的索引是个好主意?
答案 1 :(得分:14)
这是一个常见但记录不清的Excel COM错误。我已经看到它记录为“NAME_NOT_FOUND”,这意味着Excel的COM层被禁用,并且无法找到COM属性或方法名称。
在Excel“忙”时运行COM代码时,我始终得到此错误,例如,如果您设置了启动代码的计时器,并且代码在用户编辑单元格或按下鼠标时开始运行按钮,然后你总会得到这个错误。此错误仅在代码在主Excel线程上运行时发生,但似乎相当于错误VBA_E_IGNORE = 0x800AC472,这是从另一个线程调用Excel COM对象模型时得到的,而Excel是“忙”。
唯一的解决方法似乎是重试(稍微延迟)COM调用,直到成功 - 当Excel不再“忙”时。
答案 2 :(得分:8)
检查您的起始索引。 对于Microsoft.Office.Interop.Excel范围对象,它从1开始,而不是0。 由于我的循环起始值,我收到了同样的错误。
答案 3 :(得分:4)
我们遇到了同样的问题,并为我们找到了解决方案:
请制作此文件夹。 C:\ WINDOWS \ Syswow64资料\ CONFIG \ systemprofile \桌面 ·Windows 2008 Server x86
请制作此文件夹。 C:\的Windows \ system32 \设置\ systemprofile \桌面
答案 4 :(得分:3)
转到Excel选项>保存>以这种格式保存文件>选择“Excel工作簿(* .xlsx)”。 如果您使用旧版本的Excel文件(.xls)而不是.xlsx,则会出现此问题。 旧版本在Excel工作表中不允许超过65k行。
保存为.xslx后,请尝试重新执行代码。
编辑----
仔细研究您的问题,似乎问题可能是特定于语言环境。代码是否适用于另一台机器?细胞有什么价值?是datetime格式吗?看看这里:
http://support.microsoft.com/kb/320369
http://blogs.msdn.com/b/eric_carter/archive/2005/06/15/429515.aspx
答案 5 :(得分:3)
也有这个错误......
当保存到文件路径包含无效字符时会发生这种情况,在我的情况下:
path = "C:/somefolder/anotherfolder\file.xls";
请注意\
和/
*如果尝试保存到目前尚不存在的目录,也可能出现。
答案 6 :(得分:2)
尝试导出大型Excel文件时出现相同的错误(~150.000行) 已修复以下代码
Application xlApp = new Application();
xlApp.DefaultSaveFormat = XlFileFormat.xlOpenXMLWorkbook;
答案 7 :(得分:2)
我知道这已经过时了但只是为了表达我的经验。我今天早上遇到了它。变成我的错误与.xls行限制或数组索引无关。这是由不正确的公式引起的。
我从数据库导出到Excel有关我的客户的表格。有人将客户名称填写为=90Erickson-King
,显然这可以作为数据库中的字符串类型字段,但是会导致Excel中的公式出错。当您使用Excel时,该程序不会显示#N/A
,而是稍后冻结并溢出0x800A03EC错误。
我通过删除客户名称中的等号和短划线来纠正此问题。之后出口进展顺利。
我猜这个错误代码有点过于笼统,因为人们看到报告了很多不同的可能原因。
答案 8 :(得分:1)
我在使用Excel 2003 DLL并尝试写入第257列时遇到了同样的错误。 Excel 2003将每个工作表的最大列限制为256,从而引发此异常。
有关Excel 2003的详细限制,请参阅 http://office.microsoft.com/en-001/excel-help/excel-specifications-and-limits-HP005199291.aspx
从Excel 2007开始,列限制增加到16384列,请参阅 http://office.microsoft.com/en-001/excel-help/excel-specifications-and-limits-HP010073849.aspx
答案 9 :(得分:0)
一段时间后我收到同样的错误。问题是我的XLS文件包含超过65531条记录(准确地说是50万条)。我试图读取一系列细胞。
Excel.Range rng = (Excel.Range) myExcelWorkbookObj.UsedRange.Rows[i];
当我的计数器(即' i')超过65531条记录的限制时,尝试读取单元格范围时抛出异常。
答案 10 :(得分:0)
添加了另一个可能的问题,导致此问题:公式错误,因为我根据我的语言环境使用了错误的列表分隔符。
使用CultureInfo.CurrentCulture.TextInfo.ListSeparator;
更正了此问题。
请注意,以下代码行引发了异常...
答案 11 :(得分:0)
这肯定是世界上最通用的错误消息,因为我今天使用Excel Interop通过以下命令获得了它:
Excel.WorkbookConnection conn;
conn.ODBCConnection.Connection = "DSN=myserver;";
解决了在连接字符串中指定ODBC的问题:
conn.ODBCConnection.Connection = "ODBC;DSN=myserver;";
其他任何人都有这个错误的机会,希望对您有所帮助。
答案 12 :(得分:0)
调用以下代码时出现此错误:wks.Range[startCell, endCell]
,其中startCell
范围和endCell
范围指向的是变量wks
之外的工作表。
答案 13 :(得分:0)
此错误的另一个原因。当数据表(dtTable)的表名为空时,下面的代码示例将返回错误:
' Open Excel workbook
objExcelApp = New Application
objExcelWorkbook = objExcelApp.Workbooks.Add()
objExcelSheet = objExcelWorkbook.ActiveSheet
objExcelSheet.Name = dtTable.TableName
答案 14 :(得分: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
一次一次插入同一行数据时,它以相同的错误停止,但是现在很容易找到有问题的数据。
这么多年以后,我会添加此信息,以防万一。
答案 15 :(得分:-1)
我遇到了同样的错误,但现在已对其进行了排序。 就我而言,我有标题为“ Key1”,“ Key2”和“ Key3”的列。我已经将列名更改为其他名称并进行了排序。
这些似乎是保留关键字。
关于, 马赫什