Window Serviceプロジェクトで作業しています。シーケンス時間でExcelファイルのシートにデータを書き込む必要があります。
ただし、セル名で範囲を取得しようとしているときに、サービスが例外「HRESULTからの例外:0x800A03EC」をスローする場合があります。
Excelシートを開いてセルを取得するコードをここに入れました。
1:Excelシートを開く
m_WorkBook = m_WorkBooks.Open(this.FilePath, 0, false, 5,
"", "", true, Excels.XlPlatform.xlWindows, ";",
true, false, 0, true, 0, 0);
2:セルに書き込む
protected object m_MissingValue = System.Reflection.Missing.Value;
Range range = m_WorkSheet.get_Range(cell.CellName, m_MissingValue);
// error from this method, and cell name is string.
エラーコード0x800A03EC
(または-2146827284)はNAME_NOT_FOUNDを意味します。言い換えると、何かを要求したのに、Excelがそれを見つけることができません。
これは一般的なコードであり、見つけることができない多くのものに適用できます。 PivotItem.SourceNameStandard
のようなその時点で無効なプロパティを使用すると、PivotItemにフィルターが適用されていないときにこれがスローされます。 Worksheets["BLAHBLAH"]
は、シートが存在しない場合などにこれをスローします。一般に、特定の名前の何かを求めているが、存在しない場合。理由については、それはあなたの側でいくらか掘ります。
シートがあなたが求めている範囲を確実に持っているか、.CellName
があなたが求めている範囲の名前を確実に返していることを確認してください。
「=」で始まるセルに文字列を書き込もうとしたため、このエラーが発生しました。
解決策は、等号の前に "'"(アポストロフィ)を置くことでした。これは、実際に数式を記述しようとしていないことをExcelに伝え、等号を印刷するだけです。
私はここで可能な解決策を見つけました: http://www.made4dotnet.com/Default.aspx?tabid=141&aid=15
編集:
Microsoft Visual Basic .NET、Microsoft Visual C#.NET、またはMicrosoft Visual C++でMicrosoft Excelを自動化する場合、特定のメソッドを呼び出すと、マシンのロケールが米国英語(ロケールIDまたはLCID 1033):
HRESULTからの例外:0x800A03EC
および/または
古い形式または無効なタイプライブラリ
解決策1:
このエラーを回避するには、Excel関連のコードを実行するときにCurrentCultureをen-USに設定し、これら2つの関数を使用して元の状態にリセットします。
//declare a variable to hold the CurrentCulture
System.Globalization.CultureInfo oldCI;
//get the old CurrenCulture and set the new, en-US
void SetNewCurrentCulture()
{
oldCI = System.Threading.Thread.CurrentThread.CurrentCulture;
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");
}
//reset Current Culture back to the originale
void ResetCurrentCulture()
{
System.Threading.Thread.CurrentThread.CurrentCulture = oldCI;
}
解決策2:
動作する別のソリューションとして、Microsoft Office\Office11(または対応するoffice-version)の下に1033ディレクトリを作成し、Excel.exeを1033ディレクトリにコピーし、xllex.dllに名前を変更します。
これらの1つのソリューションを使用して問題を解決することもできますが、米国英語以外のロケールでExcelオブジェクトモデルを呼び出すと、Excelオブジェクトモデルが異なる動作をする可能性があり、予期しない方法でコードが失敗する可能性があります。たとえば、範囲の値を日付に設定するコードがあるとします。
yourRange.Value2 = "10/10/09"
ロケールに応じて、このコードは異なる動作をする可能性があり、その結果、Excelは次の値のいずれかを範囲に入れます。
2009年10月10日、2009年9月10日、2010年10月9日
完全に文書化されていないエラー800A03EC(Microsoftの恥!)の意味は、「OPERATION NOT SUPPORTED」のようなものです。
それは起こるかもしれない
しかし、ほとんどの場合、Excelでは重大なbugsが原因でこのエラーが表示されます。
Application.Visible=true
およびApplication.WindowState = XlWindowState.xlMinimized
その後、さまざまな関数(Range.Merge()、CheckBox.Text、Shape.TopLeftCell、Shape.Lockedなど)から数百の800A03ECエラーが発生します。このバグはExcel 2007および2010には存在しません。シート名にスペースがあるとエラーが発生しました:
using (var range = _excelApp.Range["Sheet Name Had Space!$A$1"].WithComCleanup())
シート名をスペースで一重引用符で囲むことで修正しました:
using (var range = _excelApp.Range["'Sheet Name Had Space'!$A$1"].WithComCleanup())
Range.AddComment()関数を使用しようとしたときに、この問題が発生しました。コメントを追加する前にrange.ClearComment()を呼び出すことでこれを解決できました。
ワークブックまたはシートの保護を解除するのを忘れたときにこれを取得しました。
Dominicの回答を使用して、範囲に適用される前のソースデータのDateTiimeが無効であることが、私の問題に対する回答であることがわかりました。データベース、.NET、Excelの間のどこかで、日付の変換はデフォルトで「1/1/1899 12:00:00 AM」になりました。私はそれをチェックし、空の文字列に変換する必要があり、それは私のためにそれを修正しました。
if (objectArray[row, col].ToString() == "1/1/1899 12:00:00 AM")
{
objectArray[row, col] = string.Empty;
}
これはおそらく非常に具体的な例ですが、無効なデータの一部を追跡しようとしている場合、誰かが時間を節約できることを願っています。
VBAでExcelを実行しているときに同様のエラーが発生しました。MSSQLからデータを取得し、_get_range
_および_.Value2
_を使用すると、範囲外であり、タイプuniqueidentifier
(GUID)の場合、このエラーが発生しました。値をnvarcahr(max)
にキャストしたときのみ機能しました。
名前を列挙し、worksheet.get_Range(name)を呼び出すときに、このエラーコードが発生しました。名前が範囲に適用されない場合に発生するようです。私の場合は、マクロの名前です。