- PR -

C#でのVBA.Collectionの扱いについて

1
投稿者投稿内容
toute
会議室デビュー日: 2003/07/25
投稿数: 11
投稿日時: 2003-07-25 13:28

こんにちは、tougeと申します。
いつも勉強させて頂いております。

現在、VBA.Collectionのオブジェクトを含むCOMを使うアプリケーションを作成していますが、そのCollectionへのオブジェクトの追加方法が分かりません。
VisualBasicのヘルプ
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vblr7/html/vamthadd.asp
を見ると、item , key , before , after の引数を持つAddメソッドで追加できるとあり、key、bifore、afterは省略可能とあります。
このaddメソッドで追加しようとした場合のkey以降の引数の省略方法が分かりません。

以下のようにコーディングしたところ
--------
object ogc = (object)gc; ←追加するオブジェクト
object key = null;
object before = null;
object after = null;
vbacollection.Add(ref ogc,ref key ,ref before ,ref after);
↑VBA.Collectionのオブジェクト
--------
コンパイルは通りますが、実行時に
--------
'System.Runtime.InteropServices.COMException'のハンドルされていない例外が発生
追加情報:HRESULTからの例外です:0x800A0005(CTL_E_ILLEGALFUNCTIONCALL)
--------
のエラーが出てしまいます。

なお、オブジェクトブラウザでのAddメソッドの説明は、
--------
public abstract virtual void Add
( System.Object Item , System.Object Key , System.Object Before , System.Object After )
--------
となっています。

このエラーの回避方法についてご存知の方がいらっしゃいましたら、ご教授の方よろしくお願い致します。
なな
ぬし
会議室デビュー日: 2003/06/22
投稿数: 659
お住まい・勤務地: 愛知県
投稿日時: 2003-07-25 17:40
下記サンプルではエラーになりませんでしたが...参考になりませんか?

Microsoft.VisualBasic.Collection col = new Microsoft.VisualBasic.Collection();
string str = "aaa";
col.Add(str, null, null, null);
toute
会議室デビュー日: 2003/07/25
投稿数: 11
投稿日時: 2003-07-29 19:00
返信が遅れて申し訳ありません。

Collectionのクラスですが、オブジェクトブラウザで確認したところCOMオブジェクトで使われているのは
Microsoft.VisualBasic.Collection
ではなく、
VBA.Collection
であることがわかりました。

リンク先のドキュメント(Collectionの)が誤っていたようですね。
混乱させて申し訳ありません。

Microsoft.VisualBasic.Collection
の場合は、ご指摘頂いた方法でオブジェクトを登録できることは確認できましたが、やはり、VBA.Collectionの場合は実行時に上記の例外が発生します。

また、VBA.Collectionのオブジェクトをnewすると
----
System.Runtime.InteropServices.COMExceptionのハンドルされていない例外が発生しました。
追加情報:CLSID'{A4C4671C-499F-101B-BB78-00AA00383CBB}"のCOMオブジェクトは有効でないか
登録されていません。
----
のエラーが発生します。
この辺りに原因があるのかもしれません。
COMオブジェクトの登録に関して調査してみます。

何かご存知でしたらよろしくお願い致します。

何も分かっていない素人で申し訳ありませんがお願い致します。
toute
会議室デビュー日: 2003/07/25
投稿数: 11
投稿日時: 2003-08-01 11:40

http://support.microsoft.com/?kbid=323737
に書かれていた方法(VisualBasicでVBA.Collection仲介クラス(COM)を作る)で試してみました。

最初は上記のページに書かれていた通り、
----------------------------------------------------
' Function to create a new object of VBA Collection
Public Function CreateVBACollection() As Collection

' Define a variable of type Collection
Dim col As Collection

' Create New Collection object
Set col = New Collection

' Return new Collection Object
Set CreateVBACollection = col
End Function
----------------------------------------------------
のCOMを作りました。
これでVBA.Collectionのオブジェクトをnewすることはできたのですが、コレクションにオブジェクトを追加しようとすると、今までと同じ例外が発生していました。
そのため、VBA.Collection仲介クラス(COM)にVBA.Collectionへオブジェクトを追加するメソッド(下記)を追加したところ
----------------------------------------------------
' Add Object
Public Function AddObject(vbaObj As VBA.Collection, addObj As 【追加するオブジェクトのクラス】)

vbaObj.Add addObj

End Function
----------------------------------------------------
成功しました。

何故C#ではMicrosoft.VisualBasic.CollectionとVBA.Collectionがあるのか、Microsoft.VisualBasic.CollectionはVisualBasicで作られたコレクションと互換性が無いのなら何の為に用意されているのか?また、コレクションに関するマイクロソフトのバクとは具体的に何なのか?修正パッチ等は出ていないのか?等の疑問点は残っていますが、
★下記URL
★http://www.microsoft.com/japan/developer/library/vbcon98/vbconbrowsingobjectsfromotherapplications.htm
★では以下の表記がありました。
★------
★メモ [ライブラリ] ボックスには、Visual Basic (VB) と Visual Basic for
★Applications (VBA) に対する別々のエントリがあります。"Visual Basic が提
★供するオブジェクト" という言い方をしますが、Collection オブジェクトは
★VBA によって提供されます。
★------

なんとか問題は解決できました。

ご協力本当にありがとうございました。<(_ _)>
1

スキルアップ/キャリアアップ(JOB@IT)