- ベストアンサー
ExcelのActivXコントロールについて
- ExcelのActivXコントロールについて調査しましたが、解決策が見つかりませんでした。
- Windows XP SP3とMicrosoft Office Excel 2007を使用しています。
- ActivX Frameコントロール(Microsoft Forms 2.0 Frame)を挿入し、その上にActivX OptionButtonコントロールを配置しましたが、イベントが正しく動作しません。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
#1、2、cjです。 この課題は運用の仕方の方が難しく感じる人多いかな、と思い直したので、 サンプルを改めます。 ブックを開けば、Frame上に配置した OptionButtonのイベントが有効になるような 簡易版のサンプルです。 ' ◆◆ や ' ◆ で示した行の 各オブジェクト名には注意して必要なら書き換えるようにしてください。 特に' ◆◆ の行、Sheet1 2カ所については、注意! シート名ではなくて、 VBAプロジェクトでのオブジェクト名です。 VBE画面の左側にあるプロジェクトエクスプローラを見ると ■ Sheet1 (Sheet1) ■ Sheet2 (Sheet2) ■ Sheet3 (Sheet3) □ ThisWorkbook のような感じで表示されていると思いますが。 シートモジュールについては ■ オブジェクト名 (シート名) のような表示になっています。 オブジェクト名、シート名、ともに、それぞれ独立して、 ユーザーが名前を付けられるようになっていますし、 シートの削除などあると命名規則にずれが生じて ■ Sheet1 (Sheet3) ■ Sheet2 (Sheet1) ■ Sheet3 (Sheet2) こんな↑ことになる可能性もあります。 なので、オブジェクト名を知るには、 ()の中のシート名を探して、 マッチしたら、()の外、左側にあるオブジェクト名を採るようにします。 以下はより実用に近いテスト用簡易サンプルです。 本格派志向なら、新規にクラスモジュールを挿入して書いてみたいですね。 こういう場合、特にコントロールの数が多い場合なんかは、 別にクラスモジュール用意した方が却って扱い易いかも知れません。 試す時は、新規のブックで、必要最小限のことだけして 動作を確認した方が紛れがなくなります。 準備出来たら、保存しておいて、再度開いた時から、機能するようになります。 ' ' =====ThisWorkbook モジュール===== Private Sub Workbook_Open() Call Sheet1.SetEvOPB ' ◆◆ Sheet1 ? End Sub Private Sub Workbook_BeforeClose(Cancel As Boolean) Call Sheet1.SetEvOPB(True) ' ◆◆ Sheet1 ? End Sub ' ' =====Sheet1 モジュール===== Private WithEvents myOptionButton1 As MSForms.OptionButton Private WithEvents myOptionButton2 As MSForms.OptionButton Private Sub myOptionButton1_Click() MsgBox "Frame上に配置した OptionButton1 がクリックされました。" End Sub Private Sub myOptionButton2_Click() MsgBox "Frame上に配置した OptionButton2 がクリックされました。" End Sub Sub SetEvOPB(Optional ByVal Clear As Boolean) If Clear Then Set myOptionButton1 = Nothing Set myOptionButton2 = Nothing Else Set myOptionButton1 = Frame1.Object("OptionButton1") ' ◆ Frame1 ? OptionButton1 ? Set myOptionButton2 = Frame1.Object("OptionButton2") ' ◆ Frame2 ? OptionButton2 ? End If End Sub
その他の回答 (2)
- cj_mover
- ベストアンサー率76% (292/381)
#1、cjです。 書き忘れましたが、 Private Sub Worksheet_Activate() や Private Sub Worksheet_Deactivate() は、 あくまでもテスト用(掲示用)のサンプルですので実用向きではありません。 実際には ThisWorkbookモジュールの、Workbook_OpenやWorkbook_BeforeClose などのイベントで、設定、解放するようにした方がいいと思います。 また、今回に限った話ではありませんが、 ActiveXコントロールを扱う上で、 ActiveXコントロールにフォーカスが残っている場合に、 Applicationのメソッドが実行時エラーになることもあるので そんな時は一旦ActiveCell.Activate等の処理をしてから シートをアクティブにして、メソッドに進むようにしてください。 ここら辺の挙動はバージョンごとに細かく変化しているらしいのですが、 実は私はExcel 2007はあまりよく知らないのです。 滅多にあることではありませんけれど、記憶の隅にでも置いておいてください。 以上です。
- cj_mover
- ベストアンサー率76% (292/381)
こんな感じでしょうか? 一応、VBEのコードペイン上部左にある[オブジェクト]にも myOptionButton1 が表示されるようになりますので、 各種イベントはその右にある[プロシージャ]を参照してください。 ' ' シートモジュール先頭、宣言部に以下 Private WithEvents myOptionButton1 As MSForms.OptionButton ' ' シートモジュールに続けて Private Sub myOptionButton1_Click() MsgBox "Frane上に配置したOptionButton1がクリックされました。" End Sub Private Sub Worksheet_Activate() Set myOptionButton1 = Frame1.Object("OptionButton1") End Sub Private Sub Worksheet_Deactivate() Set myOptionButton1 = Nothing End Sub
お礼
連絡遅れてすいません。 回答ありがとうございました。 教えて頂いた内容通り実施しましたら オプションボタンでのイベント処理が可能になりました。 ありがとうございました。