- - PR -
エクセルアドイン時のメニュー追加
1
投稿者 | 投稿内容 | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-07-08 13:40
こんにちは。いつもお世話になっております。
共有アドインプロジェクトでExcelアドインを作っています。 ツールメニューに項目を追加したいのですが、コンパイル環境と同じExcel2003が入った環境では動作しますが、Excel2000では動作しません。 調査したところ、バインディングの問題(事前・遅延)ではないかと思うのですが、いまいち原因が分かりません。 そもそも、Excelのバージョンに依存しないように作るには、遅延バインディングで作る必要があるという理解で間違いないでしょうか? 以下のソースはツールメニューにメニューを追加する部分で、Excel2003では動作しましたが2000では動作しませんでした。 どなたかお分かりになる方がいらっしゃいましたら、ご教示頂ければと思います。 【ソース(抜粋)】 Dim applicationObject As Object Dim addInInstance As Object Dim pobjCommandBarPopup As CommandBarPopup Public Sub OnConnection(ByVal application As Object, ByVal connectMode As Extensibility.ext_ConnectMode, ByVal addInInst As Object, ByRef custom As System.Array) Implements Extensibility.IDTExtensibility2.OnConnection applicationObject = application addInInstance = addInInst End Sub Public Sub OnStartupComplete(ByRef custom As System.Array) Implements Extensibility.IDTExtensibility2.OnStartupComplete Dim objCommandBars As CommandBars Dim objCommandBar As CommandBar ※objCommandBar = CType(applicationObject.CommandBars(1), CommandBar) objCommandBar.Reset() '既に同名のボタンが存在していたら削除 Dim objCommandBarControl As CommandBarControl For Each objCommandBarControl In objCommandBar.Controls If objCommandBarControl.Caption = "テストメニュー" Then objCommandBar.Controls.Item("テストメニュー").Delete() End If Next objCommandBarControl 'メニューを追加 pobjCommandBarPopup = CType(objCommandBar.Controls.Add(msoControlPopup), CommandBarPopup) pobjCommandBarPopup.Caption = "テストメニュー" End Sub ▲※印以降の行があると、OnStartupCompleteが実行されていないようです。 ※印行の前でMsgboxを出しても表示されず、Try〜Catchでもハンドリングされませんでした。 また、※印から後を削除し、※印行だけにしても同じ現象になりましたので、※印の行の記述がまずいのではと考えています。 【開発環境】 ・Visual Studio.NET 2003(VB.NET) ・.Net Framework 1.1 ・Excel 2003 【実行環境】 ・.Net Framework 1.1 ・Excel 2000 | ||||||||||||||||||||||||
|
投稿日時: 2005-07-08 17:15
禰宜と申します。
他にも方法はあるのかもしれませんが、私は常にその形をとってます。
ソースコードを見た限りだと、、、Excel Object Libraly を参照設定していませんか? Excel Object Libralyの参照設定を外してみてください。 そこでエラーが出るはずです。 その箇所が今回の場合でしたらExcel2003に依存して記述している部分ですので、 そこを修正する必要があります。
このあたりとかエラーでません? あと、今後はImports ステートメントの部分も記述してもらえるとありがたいですw [ メッセージ編集済み 編集者: 禰宜 編集日時 2005-07-08 17:18 ] | ||||||||||||||||||||||||
|
投稿日時: 2005-07-08 17:59
禰宜さん、こんにちは。ご返答ありがとうございました。
Excel Object Libraly をはずしてみたのですが、特にエラーは出ませんでした。 Importsは以下の内容です。 Imports Microsoft.Office.Core imports Extensibility imports System.Runtime.InteropServices Imports Microsoft.Office.Core.MsoControlType Imports Microsoft.Office.Core.MsoButtonStyle Imports Microsoft.Office.Core.MsoFileDialogType Imports Microsoft.Office.Core.MsoFileDialogView Imports Microsoft.Office.Core.MsoTriState また、以下のサイトに掲載されているサンプルでプロジェクトを作成したところ、Excel2000と2002でも動作しました。 http://support.microsoft.com/kb/302896/JA/ 上記のサンプルをツールメニュー用にカスタマイズしたところ、Excel2000と2002でも動作しました。 先程提示させて頂いたソース以外の部分でどこか違いがあるのかもしれませんので、調べてみたいと思います。 | ||||||||||||||||||||||||
|
投稿日時: 2005-07-08 18:51
禰宜です。
Office.Core以下もImportsしていたのですね^^ それならエラーなしで納得ですw 参照設定は予期せぬエラーを生みかねないので、外しておきましょう。 で、、、
このコードを見る限り、気になるのは
EXCELのメニューバーは、"Worksheet Menu Bar" という名前がついてますから、
と指定してあげましょう。 EXCELにおいて、常に CommandBars(1)がCommandBars("Worksheet Menu Bar")であることが確実なのであれば別ですが・・・ あと、
この部分は必要ないですね。
この時点で、初期状態に戻ってますから。 とりあえず、"Worksheet Menu Bar"指定でやってみてください。 | ||||||||||||||||||||||||
|
投稿日時: 2005-07-08 20:28
禰宜さん、度々のご返答ありがとうございます。
もともと正常動作しなかったプロジェクトに対して、objCommandBar.Reset() の削除と"Worksheet Menu Bar"の対応を行いましたが、やはりツールメニューは表示されませんでした。 引き続き正常動作してるプロジェクトとの違いを調べてみます。 宜しくお願い致します。 | ||||||||||||||||||||||||
|
投稿日時: 2005-07-08 23:55
禰宜です。
うーん・・・わかりませんねー 動作しないPCにて、レジストリの値はちゃんと設定されていますか? 通常、インストーラーを使ってCOMアドインをインストールすると思いますが、 そのPCの HKLM\Software\Microsoft\Office\Excel\AddIns\○○○○.Connect の中身はどうなっていますか? | ||||||||||||||||||||||||
|
投稿日時: 2005-07-11 17:08
禰宜さん、ご返信遅くなりました。
検証したところ、原因が判明しました。 Excelを参照設定した際に、Microsoft.Office.CoreとVBIDEが同時に参照設定されますが、VBIDEの参照が残ったままになっていました。 VBIDEを削除したところ、正常に動作するようになりました。 VBIDEがある事で、何故アドイン化を妨げるのかまでは調べきれていませんが、ひとまず安心しています。 また、禰宜さんが言われているレジストリの件ですが、恐らくLoadBehaviorの値の事と思われますが、正常に動作しない時も、値は3になっていました。 宜しくお願い致します。 |
1