1

NetOffice を使用して Excel スプレッドシートを編集しています。Excel のユーザー定義関数からコードを呼び出すと、呼び出し元のスプレッドシートを編集できません。

Excel.Application excelApplication = Excel.Application.GetActiveInstance();
Excel.Worksheet workSheet = (Excel.Worksheet) excelApplication.ActiveSheet;
Excel.Range cell = workSheet.Cells[2, 2];

object value = cell.Value; //works
cell.Value = 3; //Throws Exception

これを可能にする回避策はありますか?

例外は

"System.Runtime.InteropServices.COMException (0x80004005): 詳細については内部例外を参照してください。 ---> System.Reflection.TargetInvocationException: 呼び出しのターゲットによって例外がスローされました。 ---> System.Runtime. InteropServices.COMException: HRESULT からの例外: 0x800A03EC --- 内部例外スタック トレースの終わり --- System.RuntimeType.InvokeDispMethod(String name, BindingFlags invokeAttr, Object target, Object[] args, Boolean[] byrefModifiers, Int32 culture, String[] namedParameters) at System.RuntimeType.InvokeMember(String name, BindingFlags bindingFlags, Binder binder, Object target, Object[] providedArgs, ParameterModifier[] modifiers, CultureInfo culture, String[] namedParams) at System.Type.InvokeMember(String)名前、BindingFlags invokeAttr、バインダー バインダー、オブジェクト ターゲット、Object[] args、CultureInfo culture) の NetOffice.Invoker.PropertySet(COMObject comObject, String name, Object[] value) at NetOffice.Invoker.PropertySet(COMObject comObject, String name, Object[] value) at NetOffice.ExcelApi.Range.set_Value(Object value) ) \psf\home\Documents\Visual Studio 2013\Projects\Excel-REPL\Excel-REPL\Example01.cs の ExcelExamplesCS45.Example01.RunExample(): \psf\home の ClojureExcel.MainClass.Test() の 29 行目\Documents\Visual Studio 2013\Projects\Excel-REPL\Excel-REPL\MainClass.cs: 310 行目"\psf\home\Documents\Visual Studio 2013\Projects\Excel-REPL\Excel-REPL\MainClass.cs:line 310 の ClojureExcel.MainClass.Test() の 29 行目"\psf\home\Documents\Visual Studio 2013\Projects\Excel-REPL\Excel-REPL\MainClass.cs:line 310 の ClojureExcel.MainClass.Test() の 29 行目"

4

2 に答える 2

6
    Exception from HRESULT: 0x800A03EC

このような問題の一般的なトラブルシューティング戦略について説明します。このエラーには既に多くの回答があります。おそらく多すぎる。

HRESULT は、エラーの根本的な原因を特定するのに役立つエラー コードです。これは、エラーの重大度、「施設」コード、およびエラー コードの 3 つの部分に分かれています。マシンにある WinError.h SDK ファイルは、コード内のどのビットが情報のどの部分に対応しているかを正確に示すことができます。「ファシリティ」とは「エラーの発生源」を意味するマニアックな言葉です。

ファシリティ コードは 0x0A = 10 です。これは「アプリケーション定義エラー」を意味します。つまり、エラー コードは、エラーを生成したアプリケーションに非常に固有のものです。エラー コードは 0x03EC = 1004 です。つまり、「Excel エラー 1004」と言い換えることができます。

これは、Google で検索できるもので、356,000 件のヒットが得られます。トップヒットを読んで、それが何であるかを確認してください。レジストリ クリーナーを実行して開始する限り、マシンのエラーを修正することを約束する種類の吸血鬼サイト ヒットは無視してください。概して、このエラーは非常に一般的であり、マクロや VBA コードでも生成されます。通常、わずかに優れたエラー メッセージを使用して、Excel 内で 1004 エラー コードを超えたエラーの簡単な説明を取得できます。ただし、自動化を使用する場合は、それなしで行う必要があり、もちろんそれは難しくなります.

スタック トレースから取得できるデータ ポイントがもう 1 つあります。NetOffice の動作を確認できます。遅延バインディング (InvokeDispMethod) を使用するため、どの特定の相互運用メソッドが失敗するかを 100% 確信することはできません。NetOffice の宣伝されている機能ですが、実際にはトラブルシューティングがより困難になります。しかし、非常に注目すべき相互運用ポイントは「Range.set_Value」です。これは、非常に具体的な Excel オートメーション プロパティにリバース エンジニアリングできるものです。Excel オブジェクト モデルには Range インターフェイスがあり、Value プロパティがあります。失敗したプロパティを割り当てています。セルの値を設定して、やろうとしていることと完全に一致させます。

したがって、Google クエリを「Excel エラー 1004 Range.Value」に改善できます。これにより、ヒットがより具体的になり、上位 4 つのヒットはすべて SO の質問であり、吸血鬼サイトのヒットはすべてフィルター処理されます。エラーの主な説明を要約すると、次のようになります。

  • 保護されているため、スプレッドシートに書き込めません
  • 無効な日付など、書き込む値がセル形式と互換性がない
  • 行番号または列番号 <= 0 のように、更新しようとしている範囲が無効です
  • セルに入力された関数が原因でコードが実行され、別のセルを更新しようとしています。

最初の箇条書きは非常に簡単に削除できます。スプレッドシートが保護されていないことを確認するか、Unprotect() を使用してください。2 番目の箇条書きも同様です。読んだ内容を書き戻してください。3 番目の箇条書きではありません。セルは問題なく読み取れます。4番目の箇条書きは、質問のタイトル「ユーザー定義関数」と完全に一致しています。つまり、問題は

   Excel.Range cell = workSheet.Cells[2, 2];

これは、ユーザー定義関数を含むセルではないという問題があります。したがって、それを割り当てることは違法です。[2, 2] の何が特別なのかを知らずに回避策を提案することはできません。実際に UDF を含むセルに変更してみてください。

UDF がすべきことは、表示されるセル値になる値を返すことです。 この KB 記事では、UDF の制限について説明しています。 This SO questionには、.NETコードでUDFを実装することについての回答があり、Excel-DNAについて言及しています。

于 2015-02-21T11:52:07.293 に答える
0

非常に簡単な回避策があります。別のスレッドでワークシートを編集するだけです。なんで最初から思いつかなかったの!!!??

于 2015-03-04T08:50:13.880 に答える