web-dev-qa-db-ja.com

ExcelエラーHRESULT:0x800A03ECがセルの名前で範囲を取得しようとしている

Window Serviceプロジェクトで作業しています。シーケンス時間でExcelファイルのシートにデータを書き込む必要があります。

ただし、セル名で範囲を取得しようとしているときに、サービスが例外「HRESULTからの例外:0x800A03EC」をスローする場合があります。

Excelシートを開いてセルを取得するコードをここに入れました。

  • OS:ウィンドウサーバー2003 Office:
  • Microsoft Office 2003 SP2

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.
19
Teerasej

エラーコード0x800A03EC(または-2146827284)はNAME_NOT_FOUNDを意味します。言い換えると、何かを要求したのに、Excelがそれを見つけることができません。

これは一般的なコードであり、見つけることができない多くのものに適用できます。 PivotItem.SourceNameStandardのようなその時点で無効なプロパティを使用すると、Pivo​​tItemにフィルターが適用されていないときにこれがスローされます。 Worksheets["BLAHBLAH"]は、シートが存在しない場合などにこれをスローします。一般に、特定の名前の何かを求めているが、存在しない場合。理由については、それはあなたの側でいくらか掘ります。

シートがあなたが求めている範囲を確実に持っているか、.CellNameがあなたが求めている範囲の名前を確実に返していることを確認してください。

19

「=」で始まるセルに文字列を書き込もうとしたため、このエラーが発生しました。

解決策は、等号の前に "'"(アポストロフィ)を置くことでした。これは、実際に数式を記​​述しようとしていないことをExcelに伝え、等号を印刷するだけです。

4
ebrts

私はここで可能な解決策を見つけました: 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日

3
Ole

完全に文書化されていないエラー800A03EC(Microsoftの恥!)の意味は、「OPERATION NOT SUPPORTED」のようなものです。

それは起こるかもしれない

  • 新しいExcelバージョンで作成されたコンテンツを含むドキュメントを開くと、現在のExcelバージョンでは認識されません。
  • ロードした場所と同じパスにドキュメントを保存するとき(ファイルは既に開いてロックされています)

しかし、ほとんどの場合、Excelでは重大なbugsが原因でこのエラーが表示されます。

  • たとえば、Microsoft.Office.Interop.Excel.Pictureにはプロパティ「Enabled」があります。呼び出すと、bool値を受け取るはずです。ただし、代わりにエラー800A03ECが表示されます。これはバグです。
  • また、Exel 2013および2016には非常に大きなバグがあります。Excelプロセスを自動化し、Application.Visible=trueおよびApplication.WindowState = XlWindowState.xlMinimizedその後、さまざまな関数(Range.Merge()、CheckBox.Text、Shape.TopLeftCell、Shape.Lockedなど)から数百の800A03ECエラーが発生します。このバグはExcel 2007および2010には存在しません。
3
Elmue

シート名にスペースがあるとエラーが発生しました:

using (var range = _excelApp.Range["Sheet Name Had Space!$A$1"].WithComCleanup())

シート名をスペースで一重引用符で囲むことで修正しました:

using (var range = _excelApp.Range["'Sheet Name Had Space'!$A$1"].WithComCleanup())
3
Jeremy Thompson

Range.AddComment()関数を使用しようとしたときに、この問題が発生しました。コメントを追加する前にrange.ClearComment()を呼び出すことでこれを解決できました。

1
Jay

ワークブックまたはシートの保護を解除するのを忘れたときにこれを取得しました。

0
Makatun

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;
}

これはおそらく非常に具体的な例ですが、無効なデータの一部を追跡しようとしている場合、誰かが時間を節約できることを願っています。

0
aaron

VBAでExcelを実行しているときに同様のエラーが発生しました。MSSQLからデータを取得し、_get_range_および_.Value2_を使用すると、範囲外であり、タイプuniqueidentifier(GUID)の場合、このエラーが発生しました。値をnvarcahr(max)にキャストしたときのみ機能しました。

0
Idan Youval

名前を列挙し、worksheet.get_Range(name)を呼び出すときに、このエラーコードが発生しました。名前が範囲に適用されない場合に発生するようです。私の場合は、マクロの名前です。

0
Jay