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

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

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

Excelシートを開いてセルを取得するコードをここに置きました.

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

1:エクセルシートを開く

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 に伝える方法です。

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

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

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

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

完全に文書化されていないことの意味 エラー 800A03EC (Microsoft の恥!) は、「サポートされていない操作」のようなものです。

起こるかもしれません

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

しかし、ほとんどの場合、深刻なバグが原因でこのエラーが表示されます

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

ここで可能な解決策を見つけました:http://www.made4dotnet.com/Default.aspx?tabid=141&aid=15

編集:

Microsoft Visual Basic .NET、Microsoft Visual C# .NET、または Microsoft Visual C++ を使用して Microsoft Excel を自動化する場合、特定のメソッドを呼び出すと、次のエラーが発生することがあります。これは、マシンのロケールが米国英語 (ロケール ID またはロケール 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 OfficeOffice11 (または対応する Office バージョン) の下に 1033 ディレクトリを作成し、excel.exe を 1033 ディレクトリにコピーして、その名前を xllex.dll に変更するという別の解決策があります。

これらの解決策の 1 つを使用して問題を解決できる場合もありますが、米国英語以外のロケールで Excel オブジェクト モデルを呼び出すと、Excel オブジェクト モデルが異なる動作をする可能性があり、コードが思いもよらない方法で失敗する可能性があります。たとえば、範囲の値を日付に設定するコードがあるとします:

yourRange.Value2 =“10/10/09”

ロケールに応じて、このコードは異なる動作をする可能性があり、その結果、Excel は次の値のいずれかを範囲に入れます:

2009 年 10 月 10 日
2009 年 9 月 10 日
2010 年 10 月 9 日

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

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

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

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) にキャストした場合のみ うまくいきました。

興味深いことに、このエラーは .XLS? を開いたときにも発生します。 ファイルの形式が正しくないか、修復が必要です。

エラーを見つけるのが難しいのは、.xls (古い Excel) ファイルの多くの行です。

テスト:影響を受けるファイルを Excel デスクトップで手動で開きます。

自動化を使用して、毎日数百のファイルを処理しています。このエラーが発生した場合は、所有者にメールで通知し、未処理のファイルを一時的な場所に保存しています。

こんにちは、同じ問題に直面していました

手順

<オール>
  • 変更を編集して保存しようとしている間は、読み取り専用モード (保護モード) ではなく、Excel ファイルにアクセスしていることを確認してください。

  • その後も同様に発生する場合は、Excel ファイルに移動できます–>オプション–>数式
    ここでエラー チェックを無効にします (ほとんどの HRESULT エラーの原因です)

  • 例外全体をコピーできれば、はるかに優れたものになりますが、この例外に直面した場合、これは、Aspose.dll であると推測される dll ファイルから呼び出している関数が適切に署名されていないことが原因です。これの重複の可能性があると思います

    参考までに、dll が適切に署名されていないかどうかを確認するには、それを右クリックして署名に移動すると、電子的に適切に署名されているかどうかがわかります。