次のコードで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:
この行で同じエラーが発生しました
Object temp = range.Cells[i][0].Value;
非ゼロベースのインデックスで解決
Object temp = range.Cells[i][1].Value;
このライブラリを作成した人が、ゼロ以外のインデックスを使用することをお勧めだと思った可能性はありますか?
これは一般的ですが、文書化されていないExcel COMエラーです。 「NAME_NOT_FOUND」として文書化されているのを見ました。これは、ExcelのCOMレイヤーが無効になっており、COMプロパティまたはメソッド名が見つからないことを意味します。
Excelが「ビジー」のときにCOMコードを実行すると、このエラーが常に発生します。たとえば、コードを開始するタイマーを設定し、ユーザーがセルを編集中またはマウスボタンを押している間にコードが実行される場合、常にこのエラーが発生します。このエラーは、コードがメインのExcelスレッドで実行されている場合にのみ発生しますが、Excelが「ビジー」であるときに別のスレッドからExcel COMオブジェクトモデルを呼び出すと表示されるエラーVBA_E_IGNORE = 0x800AC472と同等のようです。
唯一の回避策は、Excelが「ビジー」でなくなったときに、COM呼び出しが成功するまで(少し遅れて)再試行することです。
開始インデックスを確認してください。 Microsoft.Office.Interop.Excel範囲オブジェクトの場合は、0ではなく1から始まります。ループ開始値のために同じエラーを受け取りました。
同じ問題があり、解決策が見つかりました。
このフォルダを作成してください。 C:\ Windows\SysWOW64\config\systemprofile\Desktop・Windows 2008 Server x86
このフォルダを作成してください。 C:\ Windows\System32\config\systemprofile\Desktop
このエラーも発生しました。..
私の場合、ファイルパスへの保存に無効な文字が含まれている場合に発生します:
path = "C:/somefolder/anotherfolder\file.xls";
\
と/
の両方の存在に注意してください
*存在しないディレクトリに保存しようとした場合にも発生する可能性があります。
[Excelオプション]> [保存]> [この形式でファイルを保存]に移動し、[Excelワークブック(* .xlsx)]を選択します。この問題は、.xlsxではなく古いバージョンのExcelファイル(.xls)を使用している場合に発生します。古いバージョンでは、Excelシートで65k行を超えることはできません。
.xslxとして保存したら、コードを再度実行してください。
編集----
問題をさらに調べてみると、問題はロケール固有である可能性があります。コードは別のマシンで動作しますか?セルにはどのような価値がありますか?日時形式ですか?こちらをご覧ください:
http://support.Microsoft.com/kb/320369
http://blogs.msdn.com/b/eric_carter/archive/2005/06/15/429515.aspx
私はこれが古いことを知っていますが、私の経験を売り込むためです。私は今朝それに出くわしました。エラーが.xlsの行制限または配列インデックスとは無関係であることを確認します。間違った数式が原因です。
私は顧客に関するシートをデータベースからExcelにエクスポートしていました。誰かが=90Erickson-King
として顧客名を入力しますが、これはデータベースの文字列型フィールドとしては問題ありませんが、Excelの式としてエラーが発生します。 Excelを使用しているときのように#N/A
を表示する代わりに、しばらくしてプログラムがフリーズしてその0x800A03ECエラーをこぼしました。
これを修正するには、顧客名の等号とダッシュを削除しました。その後、エクスポートはうまくいきました。
このエラーコードは、かなり多くのさまざまな原因を報告している人がいるため、少し一般的すぎると思います。
大きなExcelファイル(〜150.000行)をエクスポートしようとしたときに同じエラーが発生しました。次のコードで修正されました
Application xlApp = new Application();
xlApp.DefaultSaveFormat = XlFileFormat.xlOpenXMLWorkbook;
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 を参照してください。
これは古い投稿であることがわかりましたが、同じエラーをトラブルシューティングしようとしたときに出会ったので、ソリューションを共有したいと思いました。結局のところ、Excelにエクスポートしようとしたときに、セルのコメントの先頭に「=」がありました。たとえば、コメントが「スタック」と言っているはずの場合の「=スタック」。 Excelはそれが数式だと思っていたようです。
私はしばらく前に同じエラーを受け取っていました。問題は、私のXLSファイルに65531を超えるレコード(正確には50万)が含まれていたことです。ある範囲のセルを読み取ろうとしていました。
Excel.Range rng = (Excel.Range) myExcelWorkbookObj.UsedRange.Rows[i];
カウンター、つまり「i」がこの65531レコードの制限を超えたときに、セルの範囲を読み取ろうとしたときに例外がスローされました。
これを引き起こす可能性のある問題をもう1つ追加します。ロケールに応じて間違ったリスト区切り文字を使用していたため、式が間違っていました。 CultureInfo.CurrentCulture.TextInfo.ListSeparator;
を使用すると、問題が修正されました。
次のコード行で例外がスローされたことに注意してください...
これは、今日、Excel Interopを使用した次のコマンドで取得したため、世界で最も一般的なエラーメッセージでなければなりません。
Excel.WorkbookConnection conn;
conn.ODBCConnection.Connection = "DSN=myserver;";
接続文字列でODBCを指定することで修正されました。
conn.ODBCConnection.Connection = "ODBC;DSN=myserver;";
偶然に他の誰かがこのエラーを持っている場合、それが助けになることを願っています。