質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Q&A

解決済

1回答

10291閲覧

COM(Microsoft Excel) で Err オブジェクトを得る方法 (.NET Framework, C#)

hsk

総合スコア728

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

0グッド

0クリップ

投稿2017/07/13 09:10

編集2017/07/14 01:19

お世話になっております。
調べて見つけることができませんでしたので、ご存知の方がいらっしゃいましたら、ご教示くださると助かります。

C# で Excel COM (15.0 Object Library) を参照させて、アプリケーションを作成しています。

C#

1var app = new Microsoft.Office.Interop.Excel.Application(); 2 3try 4{ 5 var wb = app.Open(fileName); 6 7 //...処理 8 9 wb.Close(); 10 Marshal.ReleaseComObject(wb); 11 wb = null; 12} 13catch(System.Runtime.InteropServices.COMException ex) 14{ 15 // ex.InnerException は null 16 var errObj = Microsoft.VisualBasic.Information.Err(); 17 Console.WriteLine(errObj.Description); // errObj.Description は空白 18} 19finally 20{ 21 app.Quit(); 22 Marshal.ReleaseComObject(app); 23 app = null; 24}

のように、COMExceptionが発生したら、VBAエンジンのErrオブジェクトを取得してVB的なエラーメッセージを取得したいのです。

"//...処理" の箇所でAutoFilter処理などをさせたとき、パソコンによって成功したり失敗したりしていて、失敗したときは "HRESULT からの例外:0x800A03EC" が発生しています。
このときの VBA の Err オブジェクトを得たいのですが、方法を調べても見つかりません。
「Microsoft.VisualBasic.Information.Err();でErrオブジェクトを得られる」と書かれているものを見つけたので試してみると、(VBAではないので当然ですが)上記コードの errObj.Description の中身は空です。

C# (COM VBA) での Err オブジェクトを得る方法をご教示いただきたく思います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/07/13 09:42

teratailのC#タグをつけると、C#ユーザーからコメントがもらいやすいと思います。恐らくVBA使い(のみ)で回答できる方は少ないかと…
hsk

2017/07/14 01:14

slashさん、有難う御座います!
guest

回答1

0

ベストアンサー

「HRESULT からの例外:0x800A03EC」は具体的にどういう場合に発生するか調べてみてはどうでしょうか?

ざっと調べたところ、セルに値を代入する際に不正な値を代入しようとした場合で発生することが多いようです。
つまり今回はC#での処理上の問題であるため、現在実行されていないVBAのErrオブジェクトに値が入ってこないのだと思います。

サンプルのコード内で行われている処理の内容が省略されているので、どうして動く場合とそうでない場合があるかまではわかりませんが、動的に文字列を作成したり、式を生成したりしているのであれば、生成されたものに間違いがないかログに吐き出すなどして確認してみてはいかがでしょうか?

投稿2017/07/15 00:10

KoichiSugiyama

総合スコア3041

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hsk

2017/07/15 11:24 編集

 ありがとうございます。  ネット上の情報からすると HRESULT 0x800A03EC が発生する可能性が多岐にわたりすぎて(必ずしもセルの値への代入ばかりではないようです http://maigo-pg.seesaa.net/article/219678550.html)、Errオブジェクトから得られるなら原因発見が早いと思い質問してみました。  ご回答いただいた「つまりC#での問題」のC#と意図されている意味合いが「コーディング」の意味合いでしたらそのとおりだと思います(エクセルの環境やバグに起因していて、どうしようもないこととは思っていません)が、.NET Frameworkの範疇での問題(たとえばCLR型変換エラー)との意味合いでしたら、COMExceptionではなく、別の例外になると考えられませんでしょうか?COMExceptionは「COM メソッドの呼び出しによって、認識されない HRESULT が返された場合にスローされる例外。」と説明され、COMが能動的にエラーを返してきていることに起因しているもののようですので...  ちなみに今回の現象は、静的な値が入った(式など使用していないセルの)同じデータ(ブック)を異なるPCで処理(Range.Valueへ代入する、AutoFilterをかける、など、さらに発生個所もまちまち)をしたときに、あるPCでは成功していても、別のPCでこのエラーになったり、成功したりします。  今回の問題解決にあたっては、発生個所と思われるコード範囲は載せきれないため、トレースを埋め込んで、具体的な情報が得られるよう絞り込んで調査してみます。  ただ、今回の原因が解決する・しないのいずれにしても、今後のために質問ズバリの内容「VBAのErrオブジェクトを得る方法」は、知っておきたい内容です。
KoichiSugiyama

2017/07/15 12:51

COMのインターフェースは.NET Frameworkとはまた違った世界で動いていて.NET Frameworkはラッパーを使ってCOMにアクセスしていると考えたほうが良いと思います。つまり、COMへのアクセスエラーなどを.NET Frameworkが検知してCOMExceptionを返しているということです。 C#の言語的には問題ない型変換などでも、COMインターフェースに渡った際問題があると判断されているため、結果COMException例外になります。 今回お尋ねのVBAのErrオブジェクトはあくまでExcelの機能としてマクロを実行した場合(もちろんC#からマクロ実行のコマンドを動かした場合も含む)に発生したエラーを格納するためのものだと思いますので、C#側で直接セルの値を操作したりした場合などはVBAを通っていないためErrオブジェクトに何も値が入っていないのでは、という意味で書かせていただきました。言葉が足らずにすみません。
hsk

2017/11/14 07:34

たいへん遅くなりまして済みません。どうも有り難う御座います。 >VBAを通っていないため VBAのエンジンがErrオブジェクトを扱っているのでしたら、たしかにCOMでオブジェクトを呼び出してもErrオブジェクトは関係しないですね。 お陰様でよく理解出来ました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問