@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

エクセルアドイン時のメニュー追加

1
投稿者投稿内容
こうじ
ベテラン
会議室デビュー日: 2004/02/02
投稿数: 68
お住まい・勤務地: 京都・大阪
投稿日時: 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
浮嶋
会議室デビュー日: 2004/01/08
投稿数: 14
投稿日時: 2005-07-08 17:15
禰宜と申します。

引用:

そもそも、Excelのバージョンに依存しないように作るには、
遅延バインディングで作る必要があるという理解で間違いないでしょうか?



他にも方法はあるのかもしれませんが、私は常にその形をとってます。


引用:

以下のソースはツールメニューにメニューを追加する部分で、
Excel2003では動作しましたが2000では動作しませんでした。



ソースコードを見た限りだと、、、Excel Object Libraly を参照設定していませんか?

Excel Object Libralyの参照設定を外してみてください。


そこでエラーが出るはずです。
その箇所が今回の場合でしたらExcel2003に依存して記述している部分ですので、
そこを修正する必要があります。

コード:

Controls.Add(msoControlPopup ・・・・



このあたりとかエラーでません?

あと、今後はImports ステートメントの部分も記述してもらえるとありがたいですw



[ メッセージ編集済み 編集者: 禰宜 編集日時 2005-07-08 17:18 ]
こうじ
ベテラン
会議室デビュー日: 2004/02/02
投稿数: 68
お住まい・勤務地: 京都・大阪
投稿日時: 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でも動作しました。
先程提示させて頂いたソース以外の部分でどこか違いがあるのかもしれませんので、調べてみたいと思います。
浮嶋
会議室デビュー日: 2004/01/08
投稿数: 14
投稿日時: 2005-07-08 18:51
禰宜です。

引用:

 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



Office.Core以下もImportsしていたのですね^^
それならエラーなしで納得ですw

参照設定は予期せぬエラーを生みかねないので、外しておきましょう。

で、、、

コード:
 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 = "テストメニュー" 




このコードを見る限り、気になるのは
引用:

objCommandBar = CType(applicationObject.CommandBars(1), CommandBar)



EXCELのメニューバーは、"Worksheet Menu Bar" という名前がついてますから、
コード:
objCommandBar = CType(applicationObject.CommandBars("Worksheet Menu Bar"), CommandBar)



と指定してあげましょう。
EXCELにおいて、常に CommandBars(1)がCommandBars("Worksheet Menu Bar")であることが確実なのであれば別ですが・・・

あと、

引用:

 Dim objCommandBarControl As CommandBarControl
 For Each objCommandBarControl In objCommandBar.Controls
  If objCommandBarControl.Caption = "テストメニュー" Then
   objCommandBar.Controls.Item("テストメニュー").Delete()
  End If
 Next objCommandBarControl



この部分は必要ないですね。

コード:
objCommandBar.Reset() 



この時点で、初期状態に戻ってますから。


とりあえず、"Worksheet Menu Bar"指定でやってみてください。













こうじ
ベテラン
会議室デビュー日: 2004/02/02
投稿数: 68
お住まい・勤務地: 京都・大阪
投稿日時: 2005-07-08 20:28
禰宜さん、度々のご返答ありがとうございます。

もともと正常動作しなかったプロジェクトに対して、objCommandBar.Reset() の削除と"Worksheet Menu Bar"の対応を行いましたが、やはりツールメニューは表示されませんでした。
引き続き正常動作してるプロジェクトとの違いを調べてみます。

宜しくお願い致します。
浮嶋
会議室デビュー日: 2004/01/08
投稿数: 14
投稿日時: 2005-07-08 23:55
禰宜です。

うーん・・・わかりませんねー

動作しないPCにて、レジストリの値はちゃんと設定されていますか?

通常、インストーラーを使ってCOMアドインをインストールすると思いますが、

そのPCの

HKLM\Software\Microsoft\Office\Excel\AddIns\○○○○.Connect

の中身はどうなっていますか?
こうじ
ベテラン
会議室デビュー日: 2004/02/02
投稿数: 68
お住まい・勤務地: 京都・大阪
投稿日時: 2005-07-11 17:08
禰宜さん、ご返信遅くなりました。

検証したところ、原因が判明しました。
Excelを参照設定した際に、Microsoft.Office.CoreとVBIDEが同時に参照設定されますが、VBIDEの参照が残ったままになっていました。
VBIDEを削除したところ、正常に動作するようになりました。
VBIDEがある事で、何故アドイン化を妨げるのかまでは調べきれていませんが、ひとまず安心しています。

また、禰宜さんが言われているレジストリの件ですが、恐らくLoadBehaviorの値の事と思われますが、正常に動作しない時も、値は3になっていました。

宜しくお願い致します。
1

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